本页介绍如何与组织内的其他应用共享 OAuth 客户端。
概览
在项目之间共享 OAuth 客户端,就无需为组织下的每个应用手动创建新的 OAuth 客户端。 手动创建一个 OAuth 客户端后,您可以通过编程方式将其分配给多个应用。
如果某些代理无法访问“凭据”页面,但您希望它们能够启用 Identity-Aware Proxy (IAP),则可以使用 OAuth 客户端共享方法与其共享 OAuth 客户端。
当应用使用由 Google 管理的 用于浏览器流程的 OAuth 客户端,并且您希望允许以编程方式访问 应用
准备工作
您可以按照创建 OAuth 客户端中的步骤创建新的 OAuth 客户端,也可以使用现有的 OAuth 客户端。
以编程方式使用
本部分介绍了启用 OAuth 客户端以编程方式访问应用程序的步骤。
将 OAuth 客户端列入许可名单以便以编程方式访问。
您可以将贵组织拥有且您希望为其提供对应用的程序化访问权限的 OAuth 客户端 ID 列入许可名单。
您可以在组织、项目和文件夹级别为资源和服务列入 OAuth 客户端许可名单。
gcloud
运行以下命令以准备
SETTING_FILE
文件。根据需要更新值。cat << EOF > SETTING_FILE access_settings: oauth_settings: programmatic_clients: ["clientId1", "clientId2", ..] EOF
使用
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-engine
、iap_web
、compute
、organization
或folder
。 - SERVICE:服务名称。当
resource-type
为compute
或app-engine
时,此字段为可选字段。 - VERSION:版本名称。此参数不适用于
compute
,当resource-type
为app-engine
时,此参数为可选参数。
API
运行以下命令以准备
iap_settings.json
文件。根据需要更新值。cat << EOF > iap_settings.json { "access_settings": { "oauth_settings": { programmatic_clients: ["clientId1", "clientId2", ..] } } } EOF
通过运行
gcloud iap settings get
命令获取资源名称。从输出中复制名称字段。
您将在下一步中用到该名称。gcloud iap settings get [--organization=ORGANIZATION --folder=FOLDER --project=PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION]
将以下命令中的
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"
使用许可名单中的任一 OAuth 客户端 ID 登录应用。请参阅程序化身份验证。
浏览器访问
如需使用 Google Cloud 控制台让 IAP 使用您的客户端 ID 和密钥,请完成以下说明。
- 为 Compute Engine (Compute Engine) 配置 OAuth 客户端
- 为 Google Kubernetes Engine (GKE) 配置 OAuth 客户端
- 配置 App Engine 的 OAuth 客户端
- 为 Cloud Run 配置 OAuth 客户端
风险
在您的应用之间共享客户端虽然很方便,但存在风险。 本部分简单介绍共享客户端时的潜在风险以及如何缓解风险。
单点故障
对许多应用使用一个 OAuth 客户端会造成单点故障。 如果某客户端被错误地删除或修改,则使用该客户端的每个应用都会受到影响。
为了缓解这种情况,仅在为共享客户端实现重要使用场景时才共享客户端。
客户端密钥泄露
共享客户端需要与他人和脚本共享您的客户端密钥, 这会增加您的客户端密钥泄露的风险。令牌是通过您的应用创建还是通过被泄露的客户端密钥创建的,IAP 无法区分。
使用 Cloud Audit Logging 可以监控对 IAP 资源的访问情况。如果您认为您的客户端密钥可能被泄露了,请在“凭据”页面中进行重置。
如需缓解此风险,请像保护密码一样保护客户端密钥:限制共享客户端密钥的做法,并且绝不要将其以明文形式存储。
冒充已获授权的用户
如果您的客户端密钥被泄露,则恶意应用可以在其网域上设置 IAP 身份验证浏览器 Cookie 来冒充已获授权的用户。使用此 Cookie,IAP 会对冒充用户进行身份验证,令其能够访问共享被泄露的客户端密钥的所有应用。
若多项资源拥有同一些已获授权的用户,则请勿在这些资源之间共享客户端,以缓解此风险。为每种资源分别设置权限,以确保即使冒充用户通过身份验证,IAP 也不会为其授予访问权限。
用户身份收集
如果您的客户端密钥被泄露,则恶意应用可以使用您的客户端 ID 来收集应用的用户身份。此情况会在用户访问恶意应用时触发。
用户首次访问受 IAP 保护的应用时,会被要求与应用共享其身份。这使用户可以控制他们的个人信息。当用户同意共享其身份后,Google 登录系统会记录此次同意行为。对于来自同一项目中的任何客户端 ID 的后续请求,IAP 不会再次提示用户。
如果用户已同意与您的应用共享其身份并且访问了该恶意应用,其身份都会在未经他们同意的情况下立即被共享。