谷歌 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 签名验证的主要内容,如果未能解决你的问题,请参考以下文章
谷歌身份验证:OAuth2 不断返回“invalid_grant”