将自定义 OAuth 客户端与 IAP 搭配使用

本文档介绍了何时以及如何为 Identity-Aware Proxy (IAP) 使用自定义 OAuth 客户端。

默认情况下,IAP 使用 Google 管理的 OAuth 客户端对用户进行身份验证。Google 管理的 OAuth 客户端只能用于管理组织内内部用户的访问权限。

您必须使用自定义 OAuth 配置才能执行以下操作:

  • 管理组织外部的外部用户对启用 IAP 的应用的访问权限。
  • 管理对项目(不在Google Cloud 组织中)中的 Web 应用的访问权限。
  • 在身份验证期间,在同意屏幕中显示自定义品牌信息。

您可以在 IAP直接在您的平台上配置自定义 OAuth 客户端。

使用自定义 OAuth 客户端时,您必须配置 OAuth 权限请求页面。 如需在权限请求页面中显示自定义品牌,您必须提交应用以供 Google 验证。如需详细了解验证流程,请参阅设置 OAuth 权限请求页面

配置自定义 OAuth 客户端时,您需要负责创建和管理凭据,包括安全存储客户端密钥并在必要时与授权客户端共享。

比较 Google 管理的 OAuth 客户端和自定义 OAuth 客户端

Google 管理的 OAuth 客户端无法以编程方式访问受 IAP 保护的应用。不过,使用 Google 管理的 OAuth 客户端的受 IAP 保护的应用仍然可以使用通过 programmatic_clients 设置配置的单独 OAuth 客户端或服务账号 JWT 以编程方式访问。

下表比较了 Google 管理的 OAuth 客户端与自定义 OAuth 客户端。

Google 管理的 OAuth 客户端 自定义 OAuth 客户端
用户 仅限内部使用 内部和外部
品牌 Google Cloud 个品牌 客户拥有的品牌
OAuth 配置 由 Google 配置 客户配置
OAuth 凭据 由 Google 管理 由客户管理
应用访问权限 仅限浏览器流程 浏览器流程和程序化访问

配置品牌信息页

如需使用 Google Cloud 控制台配置自定义品牌推广页面,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 OAuth 品牌推广页面:

    前往“品牌推广”

  2. 点击开始使用

  3. 应用名称中,输入权限请求页面上显示的应用名称。

  4. 用户支持电子邮件地址中,输入管理员电子邮件地址以获取支持。

  5. 对于受众群体,请选择内部以限制对组织内部用户的访问权限,或选择外部以允许组织外部的用户访问。

  6. 联系信息中,输入管理员电子邮件地址,以便联系受 OAuth 客户端保护的应用的管理员。 您将在后续步骤中配置 OAuth 客户端。

  7. 如需创建 OAuth 配置,请点击创建

在 IAP 中配置自定义 OAuth 客户端

本部分介绍了如何在 IAP 中设置自定义 OAuth 客户端。

创建自定义 OAuth 客户端

本部分介绍了如何使用Google Cloud 控制台创建自定义 OAuth 客户端。您可以在资源层次结构中的任何层级设置自定义 IAP OAuth 客户端。

如需使用 Google Cloud 控制台为资源创建自定义 OAuth 客户端,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 IAP 页面。

    前往 IAP

  2. 应用标签页的资源列表中,找到要配置的资源。

    对于项目级资源,请执行以下操作:

    • 使用 Google Cloud 控制台创建 OAuth 客户端

      1. 操作列中,依次点击 更多选项 > 设置

      2. 设置对话框中,选择自定义 OAuth

      3. 如果您尚未配置权限请求页面,请执行以下操作:

        1. 点击配置同意屏幕

        2. 按照本文档前面提供的说明配置品牌推广页面

      4. 在 IAP 设置对话框中,点击自动生成凭据。IAP 会生成新的 OAuth 客户端和密钥,以用于此资源。在 Google Auth Platform 中,已获授权的重定向 URI 字段包含以下格式的条目:

        https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect
      5. 如需访问客户端 ID 和密钥,请点击下载凭据。 凭据保存在 JSON 格式的文件中。由于该文件包含用于访问资源的敏感凭据,因此请确保该文件安全无虞或已删除。

      6. 如需保存 IAP OAuth 配置并将 OAuth 客户端应用于 IAP,请点击保存

将自定义 OAuth 客户端应用于 IAP

本部分介绍了如何将 OAuth 客户端应用于 IAP。您可以使用此方法,而不是直接在平台上应用客户端。

  1. 如需创建自定义 OAuth 客户端,请按照本文档前面提供的Google Cloud 控制台说明操作。

  2. 应用自定义 OAuth 客户端。

    gcloud

    如需使用 gcloud CLI 应用自定义 OAuth 客户端,请执行以下操作:

    1. 创建设置 YAML 文件。

      cat << EOF > iap-oauth.yaml
      accessSettings:
      oauthSettings:
        clientId: CLIENT_ID
        clientSecret: CLIENT_SECRET
      EOF
      

      替换以下内容:

      • CLIENT_ID:您之前生成的 OAuth 凭据中的客户端 ID。
      • CLIENT_SECRET:您之前生成的 OAuth 凭据中的客户端密钥。
    2. 如需设置 OAuth 配置,请执行以下操作之一:

      • 如需在项目级层设置 OAuth 配置,请运行以下命令:
      gcloud iap settings set iap-oauth.yaml

      如需在资源层次结构的其他级别设置配置,请使用以下某个标志,而不是 --project 标志。在资源层次结构的某个级别设置自定义 OAuth 客户端,可为在该级别运行的所有服务提供相同的自定义品牌。

      * <code>--folder=<var>FOLDER_ID</var></code>
      * <code>--organization=<var>ORGANIZATION_ID</var></code>
      
      • 如需在特定服务上设置配置,请运行以下命令:
      gcloud iap settings set iap-oauth.yaml \
          --project=PROJECT_ID \
          --resource-type= RESOURCE_TYPE \
          --region=REGION \
          --service=SERVICE_NAME

      替换以下内容:

      • PROJECT_ID:项目资源的 ID。如需在其他级别设置配置,请使用以下标志之一,而不是 --project 标志:

        • --folder=FOLDER_ID
        • --organization=ORGANIZATION_ID
      • RESOURCE_TYPE:替换为以下资源类型之一,具体取决于资源:

        • app-engine
        • backend-services
        • cloud-run
        • compute
        • folder
        • forwarding-rule
        • iap_web
        • organization
      • REGION:运行 Cloud Run 服务的区域。

      • SERVICE_NAME:服务的名称。

    Terraform

    如需使用 Terraform 应用自定义 OAuth 客户端,请执行以下操作:

    resource "google_iap_settings" "iap_settings" {
    name = IAP_RESOURCE_NAME
    access_settings {
      oauth_settings {
          oauth_client_id = CLIENT_ID
          oauth_client_secret = CLIENT_SECRET
      }
    }
    }
    

    替换以下内容:

    • IAP_RESOURCE_NAME:服务的 iap_settings 资源的资源名称,格式如下:projects/PROJECT_NUMBER/iap_web/REGION/services/SERVICE_NAME
    • CLIENT_ID:您之前生成的 OAuth 凭据中的客户端 ID
    • CLIENT_SECRET:您之前生成的 OAuth 凭据中的客户端密钥

    REST API

    1. 创建设置 JSON 文件。

      cat << EOF > iap-oauth.json
      {
      "accessSettings": {
        "oauthSettings": {
          "clientId": "CLIENT_ID",
          "clientSecret": "CLIENT_SECRET"
        }
      }
      }
      EOF

      替换以下内容:

      • CLIENT_ID:您之前生成的 OAuth 凭据中的客户端 ID。
      • CLIENT_SECRET:您之前生成的 OAuth 凭据中的客户端密钥。
    2. 应用设置文件。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)"
      -H "Content-Type: application/yaml" \
      "https://iap.googleapis.com/v1/projects/cb-managed-ingress-demo/iap_web/forwarding_rule-us-central1/services/psc-fr:iapSettings?update_mask=iapSettings.accessSettings.oauthSettings.oauthClientId,iapSettings.accessSettings.oauthSettings.oauthClientSecret" \
      -d @iap-oauth.json
      

如需测试您的 Web 应用是否受到 OAuth 客户端的 IAP 保护,请参阅测试访问权限

资源上自定义 OAuth 客户端的旧版配置

以下部分介绍了在 IAP 中为特定资源类型配置自定义 OAuth 客户端的旧版方法。如果您已使用本文档前面介绍的方法,则可以跳过此部分。

App Engine

本部分介绍了如何在 App Engine 上启用自定义 OAuth 客户端。

gcloud

在设置项目和 IAP 之前,您需要最新版本的 gcloud CLI。如需了解如何安装 gcloud CLI, 请参阅 安装 gcloud CLI

  1. 如需进行身份验证,请使用 Google Cloud CLI 并运行以下命令。
    gcloud auth login
  2. 如需登录,请按照显示的网址操作。
  3. 登录后,复制显示的验证码并将其粘贴到命令行中。
  4. 运行以下命令,指定包含要使用 IAP 保护的资源的项目。
    gcloud config set project PROJECT_ID
  5. 按照 为 IAP 创建 OAuth 客户端 中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。
  6. 保存 OAuth 客户端 ID 和 Secret。
  7. 如需启用 IAP,请运行以下命令。
    gcloud iap web enable \
        --oauth2-client-id=CLIENT_ID \
        --oauth2-client-secret=CLIENT_SECRET \
        --resource-type=app-engine

启用 IAP 后,您可以使用 gcloud CLI 通过 IAM 角色 roles/iap.httpsResourceAccessor 修改 IAP 访问权限政策。详细了解如何 管理角色和权限

API

  1. 按照为 IAP 创建 OAuth 客户端中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。

  2. 保存 OAuth 客户端 ID 和 Secret。

  3. 运行以下命令以准备 settings.json 文件。

    cat << EOF > settings.json
    {
    "iap":
      {
        "enabled": true,
        "oauth2ClientId": "CLIENT_ID",
        "oauth2ClientSecret":" CLIENT_SECRET"
      }
    }
    EOF
    

  4. 运行以下命令以启用 IAP。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d @settings.json \
    "https://appengine.googleapis.com/v1/apps/PROJECT_ID?updateMask=iap"
    

启用 IAP 后,您可以使用 Google Cloud CLI 通过 IAM 角色 roles/iap.httpsResourceAccessor 修改 IAP 访问权限政策。详细了解如何 管理角色和权限

GKE

本部分介绍了如何在 GKE 上启用自定义 OAuth 客户端。

配置 BackendConfig

如果您运行的是 GKE 1.24 版或更高版本的集群,则可以使用 Kubernetes Gateway API 配置 IAP 和 GKE。如需查看相关说明,请参阅配置 IAP

  1. 按照为 IAP 创建 OAuth 客户端中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。

  2. 创建 Kubernetes Secret 以封装 OAuth 客户端。

    kubectl create secret generic MY_SECRET --from-literal=client_id=CLIENT_ID \
      --from-literal=client_secret=CLIENT_SECRET
    
    请替换以下内容:

    • MY_SECRET:要创建的 Secret 的名称
    • CLIENT_ID:OAuth 客户端 ID
    • CLIENT_SECRET:OAuth 客户端密钥

    您应该会收到确认消息(如以下输出所示),表明 Secret 已成功创建:

    secret "MY_SECRET" created
    

  3. 将 OAuth 凭据添加到 BackendConfig。

    apiVersion: cloud.google.com/v1
    kind: BackendConfig
    metadata:
      name: CONFIG_DEFAULT
      namespace: my-namespace
    spec:
    iap:
      enabled: true
      oauthclientCredentials:
        secretName: MY_SECRET
    

  4. 通过将服务端口与 BackendConfig 关联来启用 IAP。请参阅将 BackendConfig 与 Ingress 关联。实现此关联的一种方法是将服务的所有端口默认为 BackendConfig,您可以通过向 Service 资源添加以下注解来实现此目的。

    metadata:
      annotations:
          beta.cloud.google.com/backend-config: '{"default": "CONFIG_DEFAULT"}}'
    

启用 IAP 后,您可以使用 gcloud CLI 通过 IAM 角色 roles/iap.httpsResourceAccessor 修改 IAP 访问权限政策。详细了解如何管理角色和权限

问题排查

如果您引用的 secretName 不存在或结构不正确,则会显示以下错误消息之一:

  • BackendConfig default/config-default is not valid: error retrieving secret "foo": secrets "foo" not found.如需解决此错误,请确保已按照第 2 步中的说明正确创建了 Kubernetes Secret。

  • BackendConfig default/config-default is not valid: secret "foo" missing client_secret data.如需解决此错误,请确保您已正确创建 OAuth 凭据。另外,请确保您引用了正确的 client_idclient_secret 键。

负载均衡器后端服务

对于 Compute Engine 和 Cloud Run 用户,本部分介绍了如何在 IAP 中为负载平衡器后端服务设置 OAuth 客户端。

gcloud

在设置项目和 IAP 之前,您需要最新版本的 gcloud CLI。如需了解如何安装 gcloud CLI, 请参阅安装 gcloud CLI

  1. 如需进行身份验证,请使用 Google Cloud CLI 并运行以下命令。
    gcloud auth login
  2. 如需登录,请按照显示的网址操作。
  3. 登录后,复制显示的验证码并将其粘贴到命令行中。
  4. 运行以下命令,指定包含要使用 IAP 保护的资源的项目。
    gcloud config set project PROJECT_ID
  5. 按照为 IAP 创建 OAuth 客户端中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。
  6. 保存 OAuth 客户端 ID 和 Secret。
  7. 如需启用 IAP,请运行全局范围或区域范围的命令。

    全球范围
    gcloud compute backend-services update BACKEND_SERVICE_NAME \
        --global \
        --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET
    区域范围
    gcloud compute backend-services update BACKEND_SERVICE_NAME \
        --region REGION_NAME \
        --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET
        

启用 IAP 后,您可以使用 gcloud CLI 通过 IAM 角色 roles/iap.httpsResourceAccessor 修改 IAP 访问权限政策。详细了解如何 管理角色和权限

API

  1. 按照为 IAP 创建 OAuth 客户端中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。

  2. 保存 OAuth 客户端 ID 和 Secret。

  3. 运行以下命令以准备 settings.json 文件。

    cat << EOF > settings.json
    {
    "iap":
      {
        "enabled": true,
        "oauth2ClientId": "CLIENT_ID",
        "oauth2ClientSecret": "CLIENT_SECRET"
      }
    }
    EOF
    

  4. 运行以下命令以启用 IAP。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d @settings.json \
    "https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/REGION/backendServices/BACKEND_SERVICE_NAME"
    

启用 IAP 后,您可以使用 gcloud CLI 通过 IAM 角色 roles/iap.httpsResourceAccessor 修改 IAP 访问权限政策。详细了解如何管理角色和权限

测试访问权限

配置自定义 OAuth 客户端后,您可以执行以下操作来测试 IAP 是否正在使用该客户端来保护您的服务:

  1. 在 IAP 页面的应用标签页中,查看由 IAP 管理的应用。

  2. 访问某个应用的网址。如果您自配置权限请求页面以来首次访问该应用,则会看到之前配置的权限请求页面。