如何共享 OAuth 客户端

本页介绍如何与组织内的其他应用共享 OAuth 客户端。

概览

在项目之间共享 OAuth 客户端,就无需为组织下的每个应用手动创建新的 OAuth 客户端。 手动创建一个 OAuth 客户端后,您可以通过编程方式将其分配给多个应用。

如果您希望让代理能够启用 Identity-Aware Proxy (IAP) 但无权访问“凭据”页面,也可使用 OAuth 客户端共享功能与这些代理共享 OAuth 客户端。

如果应用使用由 Google 管理的 OAuth 客户端进行浏览器流程,并且您希望启用对应用的程序化访问,也会使用 OAuth 客户端共享功能。

准备工作

完成创建 OAuth 客户端中的步骤创建新的 OAuth 客户端,也可以使用现有的 OAuth 客户端。

以编程方式使用

本部分介绍了启用 OAuth 客户端以程序化访问应用的步骤。

  1. 将 OAuth 客户端列入许可名单,以便进行程序化访问。

    您可以将贵组织拥有且您希望以程序化方式访问应用的 OAuth 客户端 ID 列表列入许可名单。

    您可以在组织、项目和文件夹层级的资源和服务将 OAuth 客户端列入许可名单。

    gcloud

    1. 运行以下命令以准备 SETTING_FILE 文件。根据需要更新值。

        cat << EOF > SETTING_FILE
          access_settings:
            oauth_settings:
              programmatic_clients: ["clientId1", "clientId2", ..]
        EOF
      
    2. 使用 gcloud iap settings set 命令将 OAuth 客户端列入许可名单所需的级别。

      gcloud iap settings set SETTING_FILE [--organization=ORGANIZATION --folder=FOLDER --project=/PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION
      

      命令示例:

      如需将 OAuth 客户端 ID 添加到组织内资源的许可名单中,请运行以下命令。

        gcloud iap settings set SETTING_FILE --organization=ORGANIZATION
        

      如需将某个文件夹中的资源的 OAuth 客户端 ID 列入许可名单,请运行以下命令。

        gcloud iap settings set SETTING_FILE --folder=FOLDER
        

      如需将 OAuth 客户端 ID 添加到一个项目中的所有 Web 类型资源许可名单中,请运行以下命令。

        gcloud iap settings set SETTING_FILE --project=PROJECT --resource-type=iap_web
        

      如需将项目内 App Engine 服务的 OAuth 客户端 ID 列入许可名单,请运行以下命令。

        gcloud iap settings set SETTING_FILE --project=PROJECT --resource-type=app-engine --service=SERVICE
        

      替换以下内容:

      • FOLDER:文件夹 ID。
      • ORGANIZATION:组织 ID。
      • PROJECT:项目 ID。
      • RESOURCE_TYPE:IAP 资源类型。必须是 app-engineiap_webcomputeorganizationfolder
      • SERVICE:服务名称。当 resource-typecomputeapp-engine 时,此属性是可选的。
      • VERSION:版本名称。此字段不适用于 compute,当 resource-typeapp-engine 时,此为可选项。

    API

    1. 运行以下命令以准备 iap_settings.json 文件。根据需要更新值。

      cat << EOF > iap_settings.json
      {
        "access_settings": {
            "oauth_settings": {
                programmatic_clients: ["clientId1", "clientId2", ..]
              }
          }
      }
      EOF
      
    2. 通过运行 gcloud iap settings get 命令获取资源名称。从输出中复制名称字段。
      在下一步中,您将需要用到该名称。

      gcloud iap settings get [--organization=ORGANIZATION --folder=FOLDER --project=PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION]
      
    3. 将以下命令中的 RESOURCE_NAME 替换为上一步中的名称。IapSettings 将会更新。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d @iap_settings.json \
      "https://iap.googleapis.com/v1/RESOURCE_NAME:iapSettings?updateMask=iapSettings.accessSettings.oauthSettings.programmaticClients"
      
  2. 使用已列入许可名单的任一 OAuth 客户端 ID 登录应用。请参阅程序化身份验证

浏览器访问

如需让 IAP 通过 Google Cloud 控制台使用您的客户端 ID 和密钥,请按照以下说明操作。

风险

在您的应用之间共享客户端虽然很方便,但存在风险。 本部分简单介绍共享客户端时的潜在风险以及如何缓解风险。

单点故障

对许多应用使用一个 OAuth 客户端会造成单点故障。 如果某客户端被错误地删除或修改,则使用该客户端的每个应用都会受到影响。

为了缓解这种情况,仅在为共享客户端实现重要使用场景时才共享客户端。

客户端密钥泄露

共享客户端需要与他人和脚本共享您的客户端密钥, 这会增加您的客户端密钥泄露的风险。令牌是通过您的应用创建还是通过被泄露的客户端密钥创建的,IAP 无法区分。

使用 Cloud Audit Logging 可以监控对 IAP 资源的访问情况。如果您认为您的客户端密钥可能被泄露了,请在“凭据”页面中进行重置。

如需缓解此风险,请像保护密码一样保护客户端密钥:限制共享客户端密钥的做法,并且绝不要将其以明文形式存储。

冒充已获授权的用户

如果您的客户端密钥被泄露,则恶意应用可以在其网域上设置 IAP 身份验证浏览器 Cookie 来冒充已获授权的用户。使用此 Cookie,IAP 会对冒充用户进行身份验证,令其能够访问共享被泄露的客户端密钥的所有应用。

若多项资源拥有同一些已获授权的用户,则请勿在这些资源之间共享客户端,以缓解此风险。为每种资源分别设置权限,以确保即使冒充用户通过身份验证,IAP 也不会为其授予访问权限。

用户身份收集

如果您的客户端密钥被泄露,则恶意应用可以使用您的客户端 ID 来收集应用的用户身份。此情况会在用户访问恶意应用时触发。

用户首次访问受 IAP 保护的应用时,会被要求与应用共享其身份。这使用户可以控制他们的个人信息。当用户同意共享其身份后,Google 登录系统会记录此次同意行为。对于来自同一项目中的任何客户端 ID 的后续请求,IAP 不会再次提示用户。

如果用户已同意与您的应用共享其身份并且访问了该恶意应用,其身份都会在未经他们同意的情况下立即被共享。