转到控制台

保护机器学习套件 iOS 应用的 Cloud 凭据

如果您的 iOS 应用使用了机器学习套件的某个云端 API,那么在生产环境中发布应用之前,您应采取一些额外步骤来防止未经授权的 API 访问。

1. 缩小现有 API 密钥的范围

首先,配置现有的 API 密钥以禁止访问 Cloud Vision API:

  1. 打开 Cloud Console 中的凭据页面。出现提示时,选择与 Firebase 项目同名的项目。

  2. 针对列表中的每个 API 密钥,打开修改视图,然后在“密钥限制”部分中,向列表中添加除了 Cloud Vision API 之外的所有 API

    配置 API 密钥的 API 限制,就是明确声明密钥可授予哪些 API 的访问权限。默认情况下,当“API 限制”部分为空时,即表示相应的 API 密钥可用于访问已为项目启用的所有 API。

现在,您现有的 API 密钥不会授予对云端机器学习服务的访问权限,但它们将继续适用于您自行启用的任何 API,或者是在您设置 Firebase 时自动启用的任何 API。

请注意,如果您在日后启用任何其他 API,则也必须将它们添加到 API 密钥的“API 限制”列表中。

2. 创建一个用于机器学习套件的新 API 密钥

接下来,为机器学习套件创建一个仅允许调用 Cloud Vision API 的新 API 密钥:

  1. 返回凭据页面。确保您的 Firebase 项目仍处于选中状态。

  2. 点击创建凭据 > API 密钥。记下新的 API 密钥,然后点击限制密钥

  3. 在“密钥限制”部分中,仅向列表添加 Cloud Vision API。

此 API 密钥仅授予对 Cloud Vision API 的访问权限,可供机器学习套件用于访问基于云端的模型。

为了帮助缓解密钥泄露造成的影响,您应该更改 Cloud Vision API 的默认设置,以减少每位用户的配额。为此,请执行以下操作:

  1. 打开 Cloud Console 的 Cloud Vision API 配额页面。出现提示时,请选择与您的 Firebase 项目同名的项目。

  2. 请求部分中,将每分钟每位用户的请求数 (Requests per minute per user) 配额设置为适合您应用的合理值。例如,如果您的应用需要上传文档的图片以返回其文本,那么用户不太可能每隔几秒执行此操作多次,因此将配额设为 30-40 可能比较安全。

    请注意,在此上下文中,“每位用户的请求数”是指从单个 IP 地址发出的请求。如果预计有多位用户从 NAT 后方同时使用您的应用,您可能需要考虑这一点。

4. 使用机器学习套件 API 密钥调用 Cloud API

最后,在您的应用中,配置机器学习套件以使用新的 API 密钥。

由于机器学习套件 API 密钥允许对 Cloud Vision API 进行未经身份验证的访问,因此您必须做好密钥的保密工作,以防止未经授权的使用以及系统向您的结算帐号扣费。为此,您应避免在应用的二进制文件中包含 API 密钥,而应在应用运行时验证登录的是否为已知的可靠用户,然后再从服务器检索 API 密钥。

不过即使遵守这些做法,API 密钥也可能会被泄露。您应采取措施来帮助缓解密钥泄露造成的影响,例如,如上所述减少 API 的每用户配额、实施密钥轮换政策,以及向不同的用户组提供不同的密钥。

在您的应用安全获得 API 密钥后,当您想要调用机器学习套件的 Cloud API 时,请指定相关密钥:

Swift

if let cloudVisionKey = getYourApiKey() {  // See note above about securing your API key
    let options = VisionCloudDetectorOptions()
    options.apiKeyOverride = cloudVisionKey
    let cloudDetector = Vision.vision().cloudLandmarkDetector(options: options)
}

Objective-C

NSString *cloudVisionKey = [self getYourApiKey];  // See note above about securing your API key
if (cloudVisionKey != nil) {
    FIRVisionCloudDetectorOptions *options =
            [[FIRVisionCloudDetectorOptions alloc] init];
    options.APIKeyOverride = cloudVisionKey;
    FIRVisionCloudLandmarkDetector *landmarkDetector =
            [vision cloudLandmarkDetectorWithOptions:options];
}

此外,您还应遵循有关如何保护 API 密钥的一般建议。

后续步骤

如需了解在使用其他 Firebase 功能时如何准备您的应用以进行发布,请参阅发布核对清单