对于基于 HTTP 端点构建的 Google Chat 应用,本部分将介绍如何验证发送到端点的请求是否来自 Chat。
为了将互动事件分派到 Chat 应用的端点,Google 会向您的服务发出 HTTPS 请求。为了验证请求是否来自 Google,Chat 会在每个 HTTPS 请求的 Authorization 标头中(以及请求正文的 authorizationEventObject.systemIdToken 字段中)包含一个 Google 签名的 OpenID Connect (OIDC) ID 令牌作为不记名令牌。例如:
POST
Host: yourappurl.com
Authorization: Bearer AbCdEf123456
Content-Type: application/json
User-Agent: Google-Dynamite
上例中的字符串 AbCdEf123456 是不记名授权令牌。此加密令牌由 Chat 应用的唯一项目特定服务账号 (service-<var>PROJECT_NUMBER</var>@gcp-sa-gsuiteaddons.iam.gserviceaccount.com) 签名,并且在配置 Chat 应用时,audience 字段会设置为为 Chat 应用配置的 HTTP 端点网址。
您可以在 Google Cloud 控制台的 Chat API 配置标签页的连接设置部分复制 Chat 应用的服务账号电子邮件地址:
在 Google Cloud 控制台中,依次前往菜单 > API 和服务 > 已启用的 API 和服务 > Google Chat API > 配置:
在互动功能 > 连接设置下,复制服务账号电子邮件地址 (
service-<var>PROJECT_NUMBER</var>@gcp-sa-gsuiteaddons.iam.gserviceaccount.com)。
如果您是使用 Cloud Run functions 或 Cloud Run 实现 Chat 应用的,那么当您向 Chat 应用的服务账号授予 Cloud Run Invoker (roles/run.invoker) 角色时,Cloud IAM 会自动处理令牌验证。如果您的应用实现了自己的 HTTP 服务器,则可以使用开源 Google API 客户端库验证不记名令牌:
- Java:https://github.com/google/google-api-java-client
- Python:https://github.com/google/google-api-python-client
- Node.js:https://github.com/google/google-api-nodejs-client
- .NET:https://github.com/google/google-api-dotnet-client
如果令牌未通过 Chat 应用的验证,您的服务应使用 HTTPS 响应代码 401 (Unauthorized) 来响应请求。
使用 Cloud Run functions 对请求进行身份验证
如果您的函数逻辑是使用 Cloud Run functions 或 Cloud Run 实现的,请确保在 Chat 应用连接设置的触发器下配置的 HTTP 端点网址与 Cloud Run 函数端点的网址相对应。
然后,按照以下步骤,将 Chat 应用的服务账号(从 Chat API 配置标签页的连接设置部分复制的 service-<var>PROJECT_NUMBER</var>@gcp-sa-gsuiteaddons.iam.gserviceaccount.com)授权为调用方:
控制台
将函数或服务部署到 Google Cloud 后:
在 Google Cloud 控制台中,转到 Cloud Run 页面。
在 Cloud Run 服务列表中,点击接收函数旁边的复选框。(请勿点击函数本身。)
点击屏幕顶部的权限。此时权限面板会打开。
点击添加主账号。
在新的主账号字段中,输入 Chat 应用的服务账号电子邮件地址 (
service-<var>PROJECT_NUMBER</var>@gcp-sa-gsuiteaddons.iam.gserviceaccount.com)。从选择角色菜单中,选择 Cloud Run 角色
Cloud Run Invoker。
点击保存。
gcloud
使用 gcloud functions add-invoker-policy-binding 命令:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \
--member='serviceAccount:service-PROJECT_NUMBER@gcp-sa-gsuiteaddons.iam.gserviceaccount.com'替换以下内容:
RECEIVING_FUNCTION:Chat 应用的功能名称。PROJECT_NUMBER:Chat 应用的服务账号电子邮件地址中的项目编号。
使用 ID 令牌对 HTTP 请求进行身份验证
对于 HTTP 端点,请求中的不记名授权令牌是 Google 签名的 OpenID Connect (OIDC) ID 令牌。email 字段设置为 Chat 应用的服务账号电子邮件地址 (service-<var>PROJECT_NUMBER</var>@gcp-sa-gsuiteaddons.iam.gserviceaccount.com),audience 字段设置为配置为接收请求的 HTTP 端点网址。例如,如果聊天应用的配置端点为 https://example.com/app/,则 ID 令牌中的 audience 字段为 https://example.com/app/。
如果您的 HTTP 端点未托管在支持基于 IAM 的身份验证的服务(例如 Cloud Run)上,建议采用此身份验证方法。
以下示例展示了如何使用 Google OAuth 客户端库验证不记名令牌是否由 Google 为您的 Chat 应用签发,并且是否以您应用的端点为目标:
Java
Python
Node.js
相关主题
- 如需大致了解 Google Workspace 中的身份验证和授权,请参阅了解身份验证和授权。
- 如需大致了解 Chat 中的身份验证和授权,请参阅身份验证概览。
- 使用用户凭据或服务账号设置身份验证和授权。
非插件的 Chat 扩展应用:验证来自 Google Chat 的请求
以下文档适用于非 Google Workspace 插件的 Chat 应用。如需迁移非插件的 Chat 应用,请参阅将 Google Chat 应用转换为 Google Workspace 插件。
对于未在连接设置下配置 HTTP 端点网址的 Chat 应用,不记名令牌的类型和 audience 字段的值取决于您在配置 Chat 应用时选择的身份验证受众群体类型,并且请求由共享服务账号 chat@system.gserviceaccount.com 签名。
使用 Cloud Run functions 对请求进行身份验证(非插件的聊天应用)
如果您的函数逻辑是使用 Cloud Run functions 实现的,您必须在 Chat 应用连接设置的身份验证受众群体字段中选择 HTTP 端点网址,并确保配置中的 HTTP 端点网址与 Cloud Run 函数端点的网址相对应。
然后,您需要按照以下步骤,将 Google Chat 服务账号 chat@system.gserviceaccount.com 授权为调用方:
控制台
将函数或服务部署到 Google Cloud 后:
在 Google Cloud 控制台中,转到 Cloud Run 页面。
在 Cloud Run 服务列表中,点击接收函数旁边的复选框。(请勿点击函数本身。)
点击屏幕顶部的权限。此时权限面板会打开。
点击添加主账号。
在新的主账号字段中,输入
chat@system.gserviceaccount.com。从选择角色菜单中,选择 Cloud Run 角色
Cloud Run Invoker。
点击保存。
gcloud
使用 gcloud functions add-invoker-policy-binding 命令:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \
--member='serviceAccount:chat@system.gserviceaccount.com'将 RECEIVING_FUNCTION 替换为聊天应用的功能名称。
使用 ID 令牌对 HTTP 请求进行身份验证(非插件的 Chat 应用)
如果非插件 Chat 应用的连接设置的身份验证受众群体字段设置为 HTTP 端点网址,则请求中的不记名授权令牌是 Google 签名的 OpenID Connect (OIDC) ID 令牌。email 字段设置为 chat@system.gserviceaccount.com。身份验证受众群体字段设置为您配置的网址,Google Chat 会向您的非插件 Chat 应用发送请求。例如,如果聊天应用的配置端点为 https://example.com/app/,则 ID 令牌中的身份验证受众群体字段为 https://example.com/app/。
以下示例展示了如何使用 Google OAuth 客户端库验证不属于插件的 Google Chat 应用的不记名令牌是否由 Google Chat 签发并以该应用为目标。
Java
Python
Node.js
使用项目编号 JWT 对请求进行身份验证(非插件的 Chat 应用)
如果非插件 Chat 应用的连接设置的身份验证受众群体字段设置为 Project
Number,则请求中的不记名授权令牌是由 chat@system.gserviceaccount.com 签发和签名的自签名 JSON Web 令牌 (JWT)。audience 字段设置为您用于构建非加购项的 Chat 应用的 Google Cloud 项目编号。例如,如果您的 Chat 应用的云项目编号为 1234567890,则 JWT 中的 audience 字段为 1234567890。
以下示例展示了如何使用 Google OAuth 客户端库验证不记名令牌是否由 Google Chat 签发并以您的项目为目标。