谷歌OAuth JWT签名验证


Google OAuth JWT signature verification

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

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

它可以完美地解码,但如果我打开$verify选项(decode()方法第三个参数),我会得到:抛出Signature verification failed异常。

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

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

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

"我们建议您从https://www.googleapis.com/oauth2/v1/certs并在本地执行验证。

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