对于基于 HTTP 端点构建的 Google Chat 应用,本部分将介绍如何验证发送到端点的请求是否来自 Chat。
为了将互动事件分派到 Chat 扩展应用的端点,Google 会向您的服务发出请求。为了验证请求是否来自 Google,Chat 会在发送到端点的每个 HTTPS 请求的 Authorization
标头中包含一个不记名令牌。例如:
POST
Host: yourappurl.com
Authorization: Bearer AbCdEf123456
Content-Type: application/json
User-Agent: Google-Dynamite
上例中的字符串 AbCdEf123456
是不记名授权令牌。这是 Google 生成的加密令牌。不记名令牌的类型和 audience
字段的值取决于您在配置 Chat 应用时选择的身份验证对象类型。
如果您使用 Cloud Functions 或 Cloud Run 实现 Chat 应用,Cloud IAM 会自动处理令牌验证。您只需将 Google Chat 服务账号添加为授权调用方即可。如果您的应用实现了自己的 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 Functions 或 Cloud Run 对请求进行身份验证
如果您的函数逻辑是使用 Cloud Functions 或 Cloud Run 实现的,您必须在 Chat 应用连接设置的身份验证受众群体字段中选择 HTTP 端点网址,并确保配置中的 HTTP 端点网址与 Cloud Function 或 Cloud Run 端点的网址相对应。
然后,您需要将 Google Chat 服务账号 chat@system.gserviceaccount.com
授权为调用者。
以下步骤展示了如何使用 Cloud Functions(第 1 代):
控制台
将函数部署到 Google Cloud 后:
在 Google Cloud 控制台中,转到 Cloud Functions 页面:
在 Cloud Functions 列表中,点击接收函数旁边的复选框。(请勿点击函数本身。)
点击屏幕顶部的权限。此时权限面板会打开。
点击添加主账号。
在新的主账号字段中,输入
chat@system.gserviceaccount.com
。从选择角色下拉菜单中选择 Cloud Functions > Cloud Functions Invoker 角色。
点击保存。
gcloud
使用 gcloud functions add-iam-policy-binding
命令:
gcloud functions add-iam-policy-binding RECEIVING_FUNCTION \
--member='serviceAccount:chat@system.gserviceaccount.com' \
--role='roles/cloudfunctions.invoker'
将 RECEIVING_FUNCTION
替换为聊天应用的功能名称。
以下步骤展示了如何使用 Cloud Functions(第 2 代)或 Cloud Run 服务:
控制台
将函数或服务部署到 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 应用连接设置的“身份验证目标对象”字段设置为 HTTP 端点网址,则请求中的不记名授权令牌是 Google 签名的 OpenID Connect (OIDC) ID 令牌。email
字段设置为 chat@system.gserviceaccount.com
。
身份验证受众群体字段设置为您配置的网址,Google Chat 会向您的 Chat 应用发送请求。例如,如果您的 Chat 应用的配置端点是 https://example.com/app/
,则 ID 令牌中的身份验证受众群体字段为 https://example.com/app/
。
如果您的 HTTP 端点未托管在支持基于 IAM 的身份验证的服务(例如 Cloud Functions 或 Cloud Run)上,建议使用此身份验证方法。使用此方法时,您的 HTTP 服务需要了解其运行的端点的网址,但不需要了解 Cloud 项目编号。
以下示例展示了如何使用 Google OAuth 客户端库验证不记名令牌是否由 Google Chat 签发并以您的应用为目标对象。
Java
Python
Node.js
使用项目编号 JWT 对请求进行身份验证
如果 Chat 应用连接设置的“身份验证受众群体”字段设置为 Project
Number
,则请求中的不记名授权令牌是由 chat@system.gserviceaccount.com
签发和签名的自签名 JSON Web 令牌 (JWT)。audience
字段设置为您用于构建 Chat 应用的 Google Cloud 项目编号。例如,如果您的 Chat 应用的 Cloud 项目编号为 1234567890
,则 JWT 中的 audience
字段为 1234567890
。
如果您希望使用 Cloud 项目编号(而不是 HTTP 端点网址)来验证请求,建议您使用此身份验证方法。例如,如果您想在保持 Cloud 项目编号不变的情况下随时更改端点网址,或者想将同一端点用于多个 Cloud 项目编号,并想将 audience
字段与 Cloud 项目编号列表进行比较。
以下示例展示了如何使用 Google OAuth 客户端库验证不记名令牌是否由 Google Chat 签发并以您的项目为目标。
Java
Python
Node.js
相关主题
- 如需大致了解 Google Workspace 中的身份验证和授权,请参阅了解身份验证和授权。
- 如需大致了解 Chat 中的身份验证和授权,请参阅身份验证概览。
- 使用用户凭据或服务账号设置身份验证和授权。