正在验证 Google Conversation v3 API 的 webhook 请求签名

Verifying webhook request signature for Google Conversation v3 API

使用新 Actions SDK or Action Builder 构建对话操作时,您可以定义一个网络挂接来处理业务逻辑。然后,此 webhook 会收到包含以下内容的履行请求 headers,其中包括:

Google-Actions-API-Version: "3"
Google-Assistant-Signature: "eyJhbGciOiJSUzI1NiIsImtpZC..."

应该如何验证该签名?这是一个 JWT 声明,但用于签名的密钥 ID 不存在于与该操作关联的 GCP 帐户中,并且在新的 Actions SDK 文档或 Node.js fulfillment library documentation.

中未提及

签名是一个JSON Web Token,它是一种编码方式,用于传输一些已以可验证方式签名的断言。有一些库可以解码和验证 JWT。一般步骤(其中一些您可以缓存或快捷方式)是:

  1. 解码 header 以获得 kid(密钥 ID)和有效载荷以获取 iss(发行者)字段。您还需要 nbf(不是之前)和 exp(过期)字段来验证这是最近设置的,aud 字段来验证它是否与您的 Google 匹配云项目 ID。
  2. 基于发行者,访问众所周知的openid配置。由于发行人是“https://accounts.google.com”,您可以访问“https://accounts.google.com/.well-known/openid-configuration”
  3. 从配置文档中,您需要 jwks_uri 字段,即 URL 以获取当前的 JWT 证书。对于 Google,这可能是“https://www.googleapis.com/oauth2/v3/certs”
  4. 证书文档应包含一组密钥。您想要一个带有 kid 且与 JWT 中的 kid 相匹配的密钥。请注意,这些密钥经常更改,但只要您在签名 header 的 nbfexp 字段的 window 内,密钥就应该存在于证书文件.
  5. 有了这些,您就可以验证 JWT 的签名部分了。