如何共享 OAuth 客户端

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

概览

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

如果某些代理无法访问“凭据”页面,但您希望它们能够启用 Identity-Aware Proxy (IAP),则可以使用 OAuth 客户端共享方法与其共享默认的 OAuth 客户端。

请注意,移动应用无法通过其他项目中的 OAuth 客户端进行身份验证。

准备工作

请按照以下某个指南为应用启用 IAP 并创建 OAuth 客户端。

请注意,目前不支持与 App Engine 共享客户端。

将共享客户端分配给 Compute Engine 应用

  1. 转到实例组页面,以确保您的实例包含在实例组中。
  2. 定义后端服务。
  3. 设置负载平衡
  4. 使用 gcloud 命令行工具运行 gcloud auth login
  5. 按照显示的网址登录。
  6. 登录后,复制显示的验证码并将其粘贴到命令行中。
  7. 对要为其启用 IAP 的项目运行 gcloud config set project PROJECT_ID
  8. 使用“凭据”页面中的共享客户端的 ID 和密钥运行以下命令,以启用 IAP:

    gcloud compute backend-services update BACKEND_SERVICE_NAME  \
       --global --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET
    

将共享客户端分配给 GKE 应用

按照以下步骤配置应用的 BackendConfig 文件,而不是在运行以下命令时使用共享客户端的 ID 和密钥:

kubectl create secret generic my-secret --from-literal=client_id=CLIENT_ID \
    --from-literal=client_secret=CLIENT_SECRET

风险

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

单点故障

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

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

客户端密钥泄露

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

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

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

冒充已获授权的用户

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

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

用户身份收集

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

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

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