谷歌OAuth JWT签名验证

10

我正在PHP项目中制作自己的Google oauth实现。除了在尝试验证https://accounts.google.com/o/oauth2/token后收到的access token请求后收到的JWT时,一切正常。

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

它解码完美,但如果我打开$verify选项(decode()方法3个参数中的第三个参数),我将获得:抛出Signature verification failed异常。

我的猜测是,如果我向decode()方法传递错误的密钥,那么在生成签名时会使用它,用于hash_hmac()函数。

因此,我的问题是:我应该向Google OAuth JWT上下文传递什么样的密钥才能进行签名验证?

1个回答

11

根据https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken的建议,推荐的方法是:

"我们建议你从https://www.googleapis.com/oauth2/v1/certs获取Google的公钥,并在本地执行验证。

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


请注意,我有两个谷歌证书返回,并且需要在try/catch中尝试验证每个证书。 - Aram Kocharyan
@AramKocharyan,你不应该这样做。JWT头部有一个“kid”字段,用于标识公钥。 - Simon Logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接