我正在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端点高得多。这需要检索和解析证书,并进行适当的加密调用来检查签名。幸运的是,有各种语言的调试良好的库可以实现这一点。"