4

使用新的Actions SDK 或 Action Builder 构建会话操作时,您可以定义一个 webhook 来处理业务逻辑。然后,此 webhook 接收具有以下标头的履行请求:

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

应该如何验证该签名?这是一个 JWT 声明,但用于签名的密钥 ID 不存在于与 Action 关联的 GCP 帐户中,并且在新的 Actions SDK 文档或Node.js 实现库文档中未提及。

4

1 回答 1

3

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

  1. 解码标头以获取kid(密钥 ID)和有效负载以获取iss(颁发者)字段。您还需要nbf(not before) 和exp(expiration) 字段来验证这是最近设置的,并且需要aud字段来验证它是否与您的 Google Cloud 项目 ID 匹配。
  2. 根据发行者,访问众所周知的 openid 配置。由于发行人是“https://accounts.google.com”,您可以通过“https://accounts.google.com/.well-known/openid-configuration”访问它
  3. 从配置文档中,您需要该jwks_uri字段,即获取当前 JWT 证书的 URL。对于 Google,这可能是“https://www.googleapis.com/oauth2/v3/certs”
  4. 证书文档应包含一组密钥。您需要一个与JWT中的kid匹配的密钥。kid请注意,这些密钥经常更改,但只要您在签名标头中的nbfexp字段的窗口内,密钥就应该存在于证书文档中。
  5. 有了这一切,您就可以验证 JWT 的签名部分。
于 2020-07-02T15:30:51.290 回答