php – 我将关键对象的哪一部分传入`openssl_verify`来验证Google签名的JWT?

前端之家收集整理的这篇文章主要介绍了php – 我将关键对象的哪一部分传入`openssl_verify`来验证Google签名的JWT?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Google和OpenID Connect实现联合登录系统,而且我无法验证并解析我从Google收到的JWT ID令牌.我在这里关注 Google’s documentation.

根据文档的建议,我正在尝试使用现有的JWT库. GitHub上最流行的PHP版本似乎是PHP_JWT.问题似乎是JWK密钥的格式.

上面链接的谷歌文档说,从他们的发现文档中显示的jwks_uri端点获取密钥.该端点返回以下内容

{
 "keys": [
  {
   "kty": "RSA","alg": "RS256","use": "sig","kid": "1771931eb0eb64eb97733e857685be153e079bb9","n": "AMNFQMNJw/EVwrYsyPTnEHWkaPinPb4ngc/SqD701aisFhbU9/wWoKADeFtwfBcWl1qjzIqhPorQElB+2mtiqUh3Qtaazt1x5wA9XnJDe6kjtMGm9nNLMilSVNBilAE8GIdbciMycISfOfL0WRaJrqpNxewNEVZjuYiGzOWahiDP","e": "AQAB"
  },{
   "kty": "RSA","kid": "7b3bc600209875d3c42ae277a0d018d1d21986ec","n": "AN2UvG5+hNEMIPIbnpPm+JQi6LFWXBPzg3Ltb3xkVmSTjVaCFWppw/ZYRBgpToGKZP9XJstlOE88SDUFSMZIkIqtLpnUqmZax2Zc2gjEB9PhmHSH3/tTmtZ1U0X6V+crqitZ2uc3NV78vCn9/s+WuPwk/gfKBG8Cirb0fgLmsPd9","e": "AQAB"
  }
 ]
}

查看the source的JWT类的解码和验证方法,似乎$keys参数可以是一个数组,但是他们希望数组键是孩子,数组值是:@param string | resource $key for HS *,字符串键有效.对于RS *,必须是openssl公钥的资源.它很简单,可以取出kid属性并将它们用作数组键,但应该用什么作为数组值?

从谷歌的JWKs文档来看,我们看起来正在使用RS *,但我不知道关键对象的哪一部分是openssl公钥的资源.我已经尝试使用整个stdClass对象和n字符串,但都在openssl_verify步骤失败.该函数发出通知说:“警告:openssl_verify():提供的密钥参数不能强制转换为公钥”.

所以,显然,我传递的是错误的钥匙,但正确的钥匙是什么?

Google’s library为此似乎使用different endpoint获取密钥.该端点似乎返回了一系列证书.我需要使用类似的东西吗?如果是这样,为什么文档会告诉你使用jwks_uri端点?

两个端点包含相同的信息,但格式不同.

jwks_uri端点为您提供RSA公钥的模数和指数值.您可以使用这两个值来生成https://www.googleapis.com/oauth2/v1/certs获得的PEM文件.

原文链接:https://www.f2er.com/php/134598.html

猜你在找的PHP相关文章