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