使用 API 密钥进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍了如何使用 API 密钥向 Google Cloud API 和服务进行身份验证。

如需了解如何使用 API 密钥向 Google Maps Platform 进行身份验证,请参阅 Google Maps Platform 文档

如需详细了解 API Keys API,请参阅 API Keys API 文档

API 密钥简介

API 密钥包含以下组成部分,可用于管理和使用密钥:

字符串
API 密钥字符串是加密的字符串,例如 AIzaSyDaGmWKa4JsXZ-HjGw7ISLn_3namBGewQe。当您使用 API 密钥进行身份验证时,始终是使用密钥的字符串。API 密钥没有关联的 JSON 文件。
ID
Google Cloud 管理工具使用 API 密钥 ID 来唯一标识密钥。密钥 ID 不能用于进行身份验证。您可以在 Google Cloud 控制台中的密钥修改页面的网址中找到密钥 ID,也可以使用 Google Cloud CLI 列出项目中的密钥。
显示名称
显示名称是密钥的可选描述性名称,您可以在创建或更新密钥时设置该名称。

使用 API 密钥向 API 进行身份验证时,API 密钥不会标识主帐号,也不会提供任何授权信息。API 密钥会将请求与 Google Cloud 项目关联,以进行结算和配额计算。由于 API 密钥不标识调用方,因此通常用于访问公开数据或资源。

许多 Google Cloud API 不接受通过 API 密钥进行身份验证。查看您要使用的服务或 API 的身份验证文档,以确定它是否支持 API 密钥。

如需管理 API 密钥,您必须拥有项目的 API Keys Admin 角色 (roles/serviceusage.apiKeysAdmin)。

创建 API 密钥

如需创建 API 密钥,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 选择创建凭据,然后从下拉菜单中选择 API 密钥

    已创建的 API 密钥对话框会显示新创建的密钥的字符串。

gcloud

您可以使用 gcloud alpha services api-keys create 命令创建 API 密钥。

DISPLAY_NAME 替换为密钥的描述性名称。

gcloud alpha services api-keys create --display-name=DISPLAY_NAME

REST

您可以使用 keys.create 方法创建 API 密钥。请求会返回长时间运行的操作;您必须轮询该操作以获取新密钥的信息。

替换以下值:

  • DISPLAY_NAME:可选。密钥的描述性名称。
  • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d {'"displayName" : "DISPLAY_NAME"'} \
"https://apikeys.googleapis.com/v2/projects/PROJECT/locations/global/keys"

如需详细了解如何使用 REST API 创建 API 密钥,请参阅 API Keys API 文档中的创建 API 密钥

您应该复制密钥字符串,并确保其安全。除非您使用的是之后打算删除的测试密钥,否则请添加应用和 API 密钥限制

使用 API 密钥

您可以将 API 密钥与 REST 请求以及与受支持的客户端库搭配使用。

将 API 密钥与 REST 搭配使用

您可以将 API 密钥作为查询参数传递给 REST API 调用,格式如下。将 API_KEY 替换为您的 API 密钥的密钥字符串。

例如,为针对 documents.analyzeEntities 发出的 Cloud Natural Language API 请求传递 API 密钥:

POST https://language.googleapis.com/v1/documents:analyzeEntities?key=API_KEY

或者,您可以使用 x-goog-api-key 标头传入密钥。此标头必须与 gRPC 请求搭配使用。

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "X-goog-api-key: API_KEY" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://translation.googleapis.com/language/translate/v2"

将 API 密钥与客户端库搭配使用

如果服务的 API 支持 API 密钥,则该服务的客户端库通常也支持 API 密钥。查看客户端库文档,检查客户端创建方法是否接受 API 密钥。

保护 API 密钥的安全

当您在应用中使用 API 密钥时,请确保其在存储和传输期间均安全无虞。公开泄露 API 密钥可能会导致您的帐号产生意外费用。为帮助确保 API 密钥的安全,请遵循以下最佳做法:

  • 为密钥添加 API 密钥限制

    通过添加限制,您可以限制 API 密钥的使用方式,从而降低 API 密钥被破解造成的影响。

  • 删除不需要的 API 密钥以最大限度地减少遭到攻击的风险。

  • 定期重新创建 API 密钥。

    您应该定期创建新的 API 密钥、删除旧密钥,并更新应用以使用新的 API 密钥。

应用 API 密钥限制

默认情况下,API 密钥不受限制。不受限制的密钥会带来安全方面的问题,因为任何人都可以随时随地使用此类密钥。对于生产应用,您应该同时设置应用限制API 限制

添加应用限制

应用限制用于指定哪些网站、IP 地址或应用可以使用 API 密钥。

您一次只能应用一种应用限制类型。根据您的应用类型选择限制类型:

选项 应用类型 备注
HTTP 引荐来源网址 Web 应用 指定可以使用密钥的网站。
IP 地址 由特定服务器调用的应用 指定可以使用密钥的服务器或 Cron 作业。
Android 应用 Android 应用 指定可以使用密钥的 Android 应用。
iOS 应用 iOS 应用 指定可以使用密钥的 iOS 软件包。

HTTP 引荐来源网址

如需限制可使用 API 密钥的网站,请添加一个或多个 HTTP 引荐来源网址限制。

您可以用通配符 (*) 来替换子网域或路径,但不能将通配符插入到网址的中间。例如,*.google.com 有效,并且接受以 .google.com 结尾的所有网站。但是,mysubdomain*.google.com 不是有效的限制。

HTTP 引荐来源网址限制中可以包含端口号。如果您添加了端口号,则系统只会匹配使用该端口的请求。如果您未指定端口号,则匹配来自任何端口号的请求。

您最多可以为 API 密钥添加 1200 个 HTTP 引荐来源网址。

下表展示了一些示例场景和浏览器限制:

使用场景 限制
允许特定的网址 添加包含确切路径的网址。例如:
www.example.com/path
www.example.com/path/path
允许网站中的任何网址 您必须在“allowedReferers”列表中设置两个网址。
  1. 网域的网址,没有子网域,其中包含路径通配符。例如:
    example.com/*
  2. 第二个网址,其中包含子网域通配符和路径通配符。例如:
    *.example.com/*
允许单个子网域或裸网域中的任何网址

您必须在“allowedReferers”列表中设置两个网址以允许整个网域:

  1. 网域的网址,不含尾随斜杠。例如:
    www.example.com
    sub.example.com
    example.com
  2. 网域的第二个网址,其中包含路径通配符。例如:
    www.example.com/*
    sub.example.com/*
    example.com/*

如需将 API 密钥仅限于特定网站,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 点击您要限制的 API 密钥的名称。

  3. 应用限制下,选择 HTTP 引荐来源网址

  4. 对于要添加的每个限制,请点击添加一项,输入限制,然后点击完成

  5. 点击保存以保存更改并返回到 API 密钥列表。

gcloud

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 gcloud services api-keys list 命令列出项目中的密钥来获取此 ID。

  2. 使用 gcloud alpha services api-keys update 命令为 API 密钥添加 HTTP 引荐来源网址限制。

    替换以下值:

    • KEY_ID:您要限制的密钥的 ID。
    • ALLOWED_REFERRER_1:HTTP 引荐来源网址限制。

      您可以根据需要添加任意数量的限制;请使用英文逗号来分隔这些限制。您必须使用 update 命令来提供所有引荐来源网址限制;提供的引荐来源网址限制会替换密钥的任何现有引荐来源网址限制。

    gcloud alpha services api-keys update KEY_ID \
     --allowed-referrers="ALLOWED_REFERRER_1"
    

REST

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 keys.list 方法获取此 ID。此 ID 列在响应的 uid 字段中。

    PROJECT_ID 替换为您的 Google Cloud 项目 ID 或名称。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/"
    
  2. 使用 keys.patch 方法为 API 密钥添加 HTTP 引荐来源网址限制。

    请求会返回长时间运行的操作;您必须轮询该操作以了解操作完成时间并获取操作状态。

    替换以下值:

    • ALLOWED_REFERRER_1:HTTP 引荐来源网址限制。

      您可以根据需要添加任意数量的限制;请使用英文逗号来分隔这些限制。您必须使用请求来提供所有引荐来源网址限制;提供的引荐来源网址限制会替换密钥的任何现有引荐来源网址限制。

    • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。

    • KEY_ID:您要限制的密钥的 ID。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data '{
    "restrictions" : {
    "browserKeyRestrictions": {
      "allowedReferrers": ["ALLOWED_REFERRER_1"]
    }
    }
    }' \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/KEY_ID?updateMask=restrictions"
    

如需详细了解如何使用 REST API 为密钥添加 HTTP 引荐来源网址限制,请参阅 API Key API 文档中的添加浏览器限制

IP 地址

您可以指定调用方的一个或多个 IP 地址,例如可以使用 API 密钥的 Web 服务器或 Cron 作业。您可以采用以下任一格式指定 IP 地址:

  • IPv4 (198.51.100.1)
  • IPv6 (2001:db8::1)
  • 使用 CIDR 表示法的子网(198.51.100.0/242001:db8::/64

服务器限制不支持使用 localhost。您必须指定外部 IP 地址。

如需将 API 密钥仅限于特定 IP 地址,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 点击您要限制的 API 密钥的名称。

  3. 应用限制下,选择 IP 地址

  4. 对于要添加的每个 IP 地址,点击添加一项,输入地址,然后点击完成

  5. 点击保存以保存更改并返回到 API 密钥列表。

gcloud

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 gcloud services api-keys list 命令列出项目中的密钥来获取此 ID。

  2. 使用 gcloud alpha services api-keys update 命令为 API 密钥添加服务器(IP 地址)限制。

    替换以下值:

    • KEY_ID:您要限制的密钥的 ID。
    • ALLOWED_IP_ADDR_1:允许的 IP 地址。

      您可以根据需要添加任意数量的 IP 地址。请使用英文逗号来分隔这些地址。

    gcloud alpha services api-keys update KEY_ID \
    --allowed-ips="ALLOWED_IP_ADDR_1"
    

REST

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 keys.list 方法获取此 ID。此 ID 列在响应的 uid 字段中。

    PROJECT_ID 替换为您的 Google Cloud 项目 ID 或名称。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/"
    
  2. 使用 keys.patch 方法为 API 密钥添加服务器(IP 地址)限制。

    请求会返回长时间运行的操作;您必须轮询该操作以了解操作完成时间并获取操作状态。

    替换以下值:

    • ALLOWED_IP_ADDR_1:允许的 IP 地址。

      您可以根据需要添加任意数量的 IP 地址。请使用英文逗号来分隔限制。您必须将所有 IP 地址随请求一起提供。提供的引荐来源网址限制会替换密钥的任何现有 IP 地址限制。

    • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。

    • KEY_ID:您要限制的密钥的 ID。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data '{
    "restrictions" : {
      "serverKeyRestrictions": {
        "allowedIps": ["ALLOWED_IP_ADDR_1"]
      }
    }
    }' \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/KEY_ID?updateMask=restrictions"
    

如需详细了解如何使用 REST API 为密钥添加 IP 地址限制,请参阅 API Key API 文档中的添加服务器限制

Android 应用

您可以限制只有特定 Android 应用可以使用 API 密钥。您必须为每个应用提供软件包名称和 20 字节 SHA-1 证书指纹。

如需将 API 密钥仅限于一个或多个 Android 应用,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 点击您要限制的 API 密钥的名称。

  3. 应用限制下,选择 Android 应用

  4. 对于要添加的每个 Android 应用,请点击 添加一项,输入软件包名称和 SHA-1 证书指纹,然后点击完成

  5. 点击保存以保存更改并返回到 API 密钥列表。

gcloud

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 gcloud services api-keys list 命令列出项目中的密钥来获取此 ID。

  2. 使用 gcloud alpha services api-keys update 命令指定可以使用 API 密钥的 Android 应用。

    替换以下值:

    • KEY_ID:您要限制的密钥的 ID。
    • SHA1_FINGERPRINTPACKAGE_NAME:可以使用该密钥的 Android 应用的应用信息。

      您可以根据需要添加任意数量的应用;请使用额外 --allowed-application 标志。

    gcloud alpha services api-keys update KEY_ID \
    --allowed-application=sha1_fingerprint=SHA1_FINGERPRINT_1,package_name=PACKAGE_NAME_1 \
    --allowed-application=sha1_fingerprint=SHA1_FINGERPRINT_2,package_name=PACKAGE_NAME_2
    

REST

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 keys.list 方法获取此 ID。此 ID 列在响应的 uid 字段中。

    PROJECT_ID 替换为您的 Google Cloud 项目 ID 或名称。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/"
    
  2. 使用 keys.patch 方法指定可以使用 API 密钥的 Android 应用。

    请求会返回长时间运行的操作;您必须轮询该操作以了解操作完成时间并获取操作状态。

    替换以下值:

    • SHA1_FINGERPRINT_1PACKAGE_NAME_1:可以使用该密钥的 Android 应用的应用信息。

      您可以根据需要添加任意数量的应用的信息;请使用英文逗号分隔 AndroidApplication 对象。您必须将所有应用随请求一起提供;提供的应用会替换密钥的任何现有允许的应用。

    • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。

    • KEY_ID:您要限制的密钥的 ID。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data '{
    "restrictions" : {
    "androidKeyRestrictions": {
      "allowedApplications": [
        {
          "sha1Fingerprint": "SHA1_FINGERPRINT_1",
          "packageName": "PACKAGE_NAME_1"
        },
     ]
    }
    }
    }' \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/KEY_ID?updateMask=restrictions"
    

如需详细了解如何使用 REST API 为密钥添加 Android 应用限制,请参阅 API Key API 文档中的添加 Android 限制

iOS 应用

您可以通过提供每个应用的软件包 ID,将 API 密钥的使用仅限于特定 iOS 应用。

如需将 API 密钥仅限于一个或多个 iOS 应用,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 点击您要限制的 API 密钥的名称。

  3. 应用限制下,选择 iOS 应用

  4. 对于要添加的每个 iOS 应用,请点击添加一项,输入软件包 ID,然后点击完成

  5. 点击保存以保存更改并返回到 API 密钥列表。

gcloud

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 gcloud services api-keys list 命令列出项目中的密钥来获取此 ID。

  2. 使用 gcloud alpha services api-keys update 方法指定可以使用该密钥的 iOS 应用。

    替换以下值:

    • KEY_ID:您要限制的密钥的 ID。
    • ALLOWED_BUNDLE_ID:可以使用此 API 密钥的 iOS 应用的软件包 ID。

      您可以根据需要添加任意数量的软件包 ID;请使用英文逗号分隔这些 ID。

    gcloud alpha services api-keys update KEY_ID \
    --allowed-bundle-ids=ALLOWED_BUNDLE_ID_1,ALLOWED_BUNDLE_ID_2
    

REST

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 keys.list 方法获取此 ID。此 ID 列在响应的 uid 字段中。

    PROJECT_ID 替换为您的 Google Cloud 项目 ID 或名称。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/"
    
  2. 使用 keys.patch 方法指定可以使用 API 密钥的 iOS 应用。

    请求会返回长时间运行的操作;您必须轮询该操作以了解操作完成时间并获取操作状态。

    替换以下值:

    • ALLOWED_BUNDLE_ID:可以使用该密钥的 iOS 应用的软件包 ID。

      您可以根据需要添加任意数量的应用的信息;请使用英文逗号分隔软件包 ID。您必须将所有软件包 ID 随请求一起提供。提供的软件包 ID 会替换密钥的任何现有允许的应用。

    • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。

    • KEY_ID:您要限制的密钥的 ID。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data '{
    "restrictions" : {
    "iosKeyRestrictions": {
      "allowedBundleIds": ["ALLOWED_BUNDLE_ID_1","ALLOWED_BUNDLE_ID_2"]
    }
    }
    }' \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/KEY_ID?updateMask=restrictions"
    

如需详细了解如何使用 REST API 为密钥添加 iOS 应用限制,请参阅 API Key API 文档中的添加 iOS 限制

添加 API 限制

API 限制用于指定可以使用 API 密钥调用哪些 API。

如需添加 API 限制,请使用以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,进入“凭据”页面:

    进入“凭据”页面

  2. 点击您要限制的 API 密钥的名称。

  3. API 限制部分中,点击限制密钥

  4. 从下拉列表中选择您的 API 密钥将用于访问的所有 API。

  5. 点击保存以保存更改并返回到 API 密钥列表。

gcloud

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 gcloud services api-keys list 命令列出项目中的密钥来获取此 ID。

  2. 使用 gcloud alpha services api-keys update 命令指定可使用 API 密钥向其进行身份验证的服务。

    替换以下值:

    • KEY_ID:您要限制的密钥的 ID。
    • SERVICE_1SERVICE_2...:可使用此密钥访问的 API 的服务名称。

      您必须使用 update 命令提供所有服务名称;提供的服务名称会替换密钥的任何现有服务。

    您可以在 API 信息中心上搜索 API 来查找服务名称。服务名称是类似 bigquery.googleapis.com 的字符串。

    gcloud alpha services api-keys update KEY_ID \
    --api-target=service=SERVICE_1 --api-target=service=SERVICE_2
    

REST

  1. 获取要限制的密钥的 ID。

    此 ID 与显示名称或密钥字符串不同。您可以使用 keys.list 方法获取此 ID。此 ID 列在响应的 uid 字段中。

    PROJECT_ID 替换为您的 Google Cloud 项目 ID 或名称。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/"
    
  2. 使用 keys.patch 方法指定可使用 API 密钥向其进行身份验证的服务。

    请求会返回长时间运行的操作;您必须轮询该操作以了解操作完成时间并获取操作状态。

    替换以下值:

    • SERVICE_1SERVICE_2...:您希望此密钥能够用于的 API 的服务名称。

      您必须将所有服务名称随请求一起提供;提供的服务名称会替换密钥的任何现有服务。

      您可以在 API 信息中心上搜索 API 来查找服务名称。服务名称是类似 bigquery.googleapis.com 的字符串。

    • PROJECT_ID:您的 Google Cloud 项目 ID 或名称。

    • KEY_ID:您要限制的密钥的 ID。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data '{
    "restrictions" : {
    "apiTargets": [
      {
        "service": "SERVICE_1"
      },
      {
        "service" : "SERVICE_2"
      },
    ]
    }
    }' \
    "https://apikeys.googleapis.com/v2/projects/PROJECT_ID/locations/global/keys/KEY_ID?updateMask=restrictions"
    

如需详细了解如何使用 REST API 为密钥添加 API 限制,请参阅 API Key API 文档中的添加 API 限制

从密钥字符串获取项目信息

如果您有一个密钥字符串,并且想要确定它关联的 Google Cloud 项目,则可以从该密钥字符串获取有关密钥的信息。

KEY_STRING 替换为您需要其项目信息的密钥字符串。

gcloud

您可以使用 gcloud alpha services api-keys lookup 命令从密钥字符串获取项目 ID。

gcloud alpha services api-keys lookup KEY_STRING

REST

您可以使用 lookupKey 方法从密钥字符串获取项目 ID。

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://apikeys.googleapis.com/v2/keys:lookupKey?keyString=KEY_STRING"

轮询长时间运行的操作

API Key API 方法使用长时间运行的操作。如果您使用 REST API 创建和管理 API 密钥,则初始方法请求会返回操作对象。您可以使用操作名称来轮询长时间运行的操作。长时间运行的请求完成后,轮询操作会返回长时间运行的请求中的数据。

如需轮询长时间运行的 API Key API 操作,请使用 operations.get 方法。

OPERATION_NAME 替换为长时间运行的操作返回的操作名称。例如 operations/akmf.p7-358517206116-cd10a88a-7740-4403-a8fd-979f3bd7fe1c

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    "https://apikeys.googleapis.com/v2/OPERATION_NAME"

API 密钥的限制

您最多可以为每个项目创建 300 个 API 密钥。这是系统限制,不能通过配额提升请求进行更改。

如果需要更多 API 密钥,则必须使用多个项目。

后续步骤