保护您的 Firebase ML Apple 应用的云凭证

如果您的 Apple 应用使用 Firebase ML 的云 API 之一,那么在您在生产中启动您的应用之前,您应该采取一些额外的步骤来防止未经授权的 API 访问。

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

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

  1. 打开 Google Cloud Console 的凭据页面。出现提示时,选择您的项目。

  2. 对于列表中的每个现有 API 密钥,打开编辑视图。

  3. API 限制部分,选择Restrict key ,然后将您希望 API 密钥有权访问的所有 API 添加到列表中。确保包含 Cloud Vision API。

    当您配置 API 密钥的API 限制时,您明确声明了该密钥可以访问的 API。默认情况下,当API 限制部分选择了不限制密钥时,API 密钥可用于访问为项目启用的任何 API。

现在,您现有的 API 密钥将不会授予对云 ML 服务的访问权限,但每个密钥将继续适用于您添加到其API 限制列表中的任何 API。

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

2. 创建用于 Firebase ML 的新 API 密钥

接下来,为 Firebase ML 创建一个新的 API 密钥,它只允许调用 Cloud Vision API:

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

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

  3. API 限制部分,选择Restrict key ,然后将 Cloud Vision API 添加到列表中。

此 API 密钥仅授予对 Cloud Vision API 的访问权限,Firebase ML 可以使用该密钥访问基于云的模型。

为了帮助减轻密钥泄露的后果,您应该从默认设置减少 Cloud Vision API 的每用户配额。为此:

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

  2. Requests部分,将Requests per minute per user quota 设置为对您的应用来说合理的值。例如,如果您的应用程序涉及上传文档图片以获取其文本,则用户不太可能每隔几秒执行一次以上操作,因此 30-40 的配额可能是安全的。

    请注意,在此上下文中,“每个用户的请求数”是指来自单个 IP 地址的请求。如果您希望多个用户同时从 NAT 后面使用您的应用程序,您可能需要考虑这一点。

4. 使用您的 Firebase ML API 密钥调用 Cloud API

最后,在您的应用中,配置 Firebase ML 以使用您的新 API 密钥。

由于 Firebase ML API 密钥允许对 Cloud Vision API 进行未经身份验证的访问,因此请务必对密钥保密,以防止未经授权的使用和向您的结算帐户收费。为此,您应避免在应用程序二进制文件中包含您的 API 密钥。相反,在应用程序运行时,验证已知良好用户是否已登录,然后才从服务器检索 API 密钥。

即使观察到这些做法,API 密钥也有可能被泄露。您应该采取措施帮助减轻密钥泄露的后果,例如如上所述减少 API 的每用户配额、实施密钥轮换策略以及向不同的用户组颁发不同的密钥。

在您的应用安全获取 API 密钥后,当您要调用 Firebase ML Cloud API 时,请指定密钥:

迅速

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 功能时准备启动应用的信息,请参阅启动清单