谷歌 OAuth JWT 签名验证

Posted

技术标签:

【中文标题】谷歌 OAuth JWT 签名验证【英文标题】:Google OAuth JWT signature verification 【发布时间】:2013-07-12 03:56:08 【问题描述】:

我正在 php 项目中制作自己的 google oauth 实现。除非我尝试验证在 访问令牌 请求 (https://accounts.google.com/o/oauth2/token) 之后收到的JWT,否则一切正常。

对于 JWT 解码,我使用 firebase/php-jwt 类。

它完美解码,但如果我打开 $verify 选项(decode() 方法 3-rd arg)我得到:Signature verification failed 抛出异常。

我的猜测是,如果我将错误的密钥传递给 decode() 方法。稍后在签名生成完成时用于hash_hmac() 函数。

所以我的问题是:我应该将什么密钥传递给 Google OAuth JWT 上下文进行签名验证?

【问题讨论】:

【参考方案1】:

来自https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken的推荐做法:

“我们建议您从 https://www.googleapis.com/oauth2/v1/certs 检索 Google 的公钥并在本地执行验证。

由于 Google 很少更改其公钥(大约每天一次),因此您可以缓存它们,并且在绝大多数情况下,执行本地验证比使用 TokenInfo 端点更有效。这需要检索和解析证书,并进行适当的加密调用以检查签名。幸运的是,有多种语言版本的调试良好的库可以实现这一点。”

【讨论】:

请注意,我返回了两个 Google 证书,需要在 try/catch 中尝试对每个证书进行验证。 @AramKocharyan 你不应该这样做。 jwt 标头具有标识公钥的“kid”字段。

以上是关于谷歌 OAuth JWT 签名验证的主要内容,如果未能解决你的问题,请参考以下文章

JWT/OAuth 令牌签名验证失败

Spring JWT 签名验证失败

如何验证或验证 JWT 签名?

谷歌身份验证:OAuth2 不断返回“invalid_grant”

谷歌 OAuth2 API。检查用户是不是有两因素身份验证(不是 GSuite)

单点登录JWT与Spring Security OAuth