首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我应该将关键对象的哪一部分传递到`openssl_verify`来验证谷歌签名的JWT?

我应该将关键对象的哪一部分传递到`openssl_verify`来验证谷歌签名的JWT?
EN

Stack Overflow用户
提问于 2014-08-01 10:25:30
回答 2查看 4.3K关注 0票数 10

我正试图用谷歌和OpenID连接来实现一个联邦登录系统,我不得不验证和解析我从谷歌获得的JWT令牌。我跟着Google文档来了。

根据docs的建议,我尝试使用现有的JWT库。GitHub上最流行的PHP版本似乎是JWT。问题似乎是JWK键的格式。

上面链接的谷歌文档,比如从jwks_uri端点获取密钥,如他们的发现文档所示。该端点返回以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 "keys": [
  {
   "kty": "RSA",
   "alg": "RS256",
   "use": "sig",
   "kid": "1771931eb0eb64eb97733e857685be153e079bb9",
   "n": "AMNFQMNJw/EVwrYsyPTnEHWkaPinPb4ngc/SqD701aisFhbU9/wWoKADeFtwfBcWl1qjzIqhPorQElB+2mtiqUh3Qtaazt1x5wA9XnJDe6kjtMGm9nNLMilSVNBilAE8GIdbciMycISfOfL0WRaJrqpNxewNEVZjuYiGzOWahiDP",
   "e": "AQAB"
  },
  {
   "kty": "RSA",
   "alg": "RS256",
   "use": "sig",
   "kid": "7b3bc600209875d3c42ae277a0d018d1d21986ec",
   "n": "AN2UvG5+hNEMIPIbnpPm+JQi6LFWXBPzg3Ltb3xkVmSTjVaCFWppw/ZYRBgpToGKZP9XJstlOE88SDUFSMZIkIqtLpnUqmZax2Zc2gjEB9PhmHSH3/tTmtZ1U0X6V+crqitZ2uc3NV78vCn9/s+WuPwk/gfKBG8Cirb0fgLmsPd9",
   "e": "AQAB"
  }
 ]
}

查看JWT类的来源decodeverify方法,似乎$keys参数可以是一个数组,但是他们希望数组键是kid,数组值是:@param string|resource $key for HS*, a string key works. for RS*, must be a resource of an openssl public key。提取kid属性并将其用作数组键非常简单,但是应该使用什么作为数组值呢?

从谷歌的JWK文档来看,我们似乎在使用RS*,但我不知道关键对象的哪一部分是resource of an openssl public key。我尝试使用整个stdClass对象,只使用n字符串,但都在openssl_verify步骤中失败。该函数发出一个通知:“警告: openssl_verify():提供的密钥param不能强制进入公钥”。

所以,很明显,我传递的是错误的键,但是正确的键是什么呢?

为此,谷歌图书馆似乎使用不同端点来获取密钥。该端点似乎返回了一个证书数组。我需要用这样的东西代替吗?如果是这样,为什么文档会告诉您使用jwks_uri端点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-01 16:08:53

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

jwks_uri端点给出了RSA公钥的指数值。您可以使用这两个值来生成在https://www.googleapis.com/oauth2/v1/certs获得的PEM文件。

票数 6
EN

Stack Overflow用户

发布于 2015-01-16 05:13:21

对于那些将来尝试这样做的人,我想给出一个完整的答案;

ne部分在jwks_uri JSON密钥中给出了模数和指数,可以用来检索公钥(验证签名所需的全部内容)。本文详细介绍了在纯PHP中是如何做到这一点的:

openssl:如何从模数中获取公钥?

--但是,您应该知道,谷歌jwks_uri提供的JSON文档使用的是base64安全编码(即,替换+和/字符的普通base64 )。如果没有考虑到这一点,可能仍然会给出一个无效的证书。由于您提到使用php-jwt,从模数中获取公钥的工作代码和使用phpseclib的指数是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$modulus = 'someencodedmodulusvalue';
$exponent = 'someencodedexponentvalue'; 
$rsa = new Crypt_RSA();

$modulus = new Math_BigInteger(JWT::urlsafeB64Decode($modulus), 256);
$exponent = new Math_BigInteger(JWT::urlsafeB64Decode($exponent), 256);

$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
$rsa->setPublicKey();
$pubKey = $rsa->getPublicKey();
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25086410

复制
相关文章
我应该拿什么来拯救你,我的游戏?
前段时间,晓衡加入的一个小游戏个人开发者群突然,炸锅了!群里有两位伙伴开发的小游戏,一个破解上架头条,一个破解打成 Android 包。
张晓衡
2019/11/14
1.2K0
JWT(JSON Web Token)
使用JWT来传输数据,实际上传输的是一个字符串,这个字符串就是所谓的 json web token 字符串。所以广义上,JWT是一个标准的名称;狭义上,JWT指的就是用来传递的那个token字符串。这个串有两个特点:
用户1212940
2022/04/13
5130
JWT(JSON Web Token)
关于JWT你要知道的都在这里
失踪人口回归,之前因为换工作很多事情要处理断更了很长时间,最近在整理以前在Evernote里记的笔记,发现了以前记的JSON WEB TOKEN的东西,整理成文章看一下。JWT现在应用越来越广,但是它并不是Silver bullet,不能在所有场景下都适用,文章就大概说说JWT的原理以及适用的场景。
KevinYan
2019/10/13
4020
JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西
这种模式在单机时不存在什么问题,但是一旦服务器变为集群模式时,或者是跨域的服务器时,这个时候Session就必须实现数据共享。
宁在春
2022/10/31
2.2K0
JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西
《ASP.NET Core 与 RESTful API 开发实战》-- (第8章)-- 读书笔记(上)
认证(Authentication)是指验证用户身份的过程,授权(Authorization)是验证一个已经通过认证的用户是否有权限做某些事的过程
郑子铭
2021/01/13
6120
《ASP.NET Core 与 RESTful API 开发实战》-- (第8章)-- 读书笔记(上)
单点登录(Single Sign On)解决方案
A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
Java_老男孩
2019/09/20
6160
单点登录(Single Sign On)解决方案
A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
Java_老男孩
2019/12/02
7890
JWT实现token-based会话管理
上文《3种web会话管理的方式》介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下。本文主要介绍这方面的内容。上文提到token-based的实现目前有一个开放的标准可用,这个标准就是JWT,从它的官网上也能看到,目前实现了JWT的技术非常多,基本上涵盖了所有的语言平台。本文选择express和jsonwebtoken基于nodejs来实现token-based会话管理。
wangxl
2018/07/27
1K0
JWT实现token-based会话管理
什么是JWT?
JSON Web Token (JWT) 是一个开源标准(RFC 7519),它定义了一种紧凑且自完备的方法用于在各参与方之间以JSON对象传递信息。以该种方式传递的信息已经被数字签名,因而可以被验证并且被信任。JWT既可以使用盐(secret)(HMAC算法)进行签名,也可以使用基于RSA/ECDSA算法的公钥/秘钥对进行签名。
Steve Wang
2022/04/13
9280
什么是JWT?
你可能没那么了解 JWT
最近在开发一个统一认证服务,涉及到 OIDC 协议,其中授权码模式所颁发的 id_token 使用的是 JWT ( JSON Web Token ) ,因为这次使用的库的默认签名算法和以往不同,所以特地去翻阅了 JWT 的 RFC 文档( RFC 7519[1] ),一番阅读后发现原来对 JWT 的认知只停留在表面,还有更多深层的内容是不知道的。
gopher云原生
2021/11/01
1.2K0
一步步带你了解前后端分离利器之JWT
HTTP 是无状态协议,它不对之前发送过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的 Web 页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。
Java后端技术
2018/08/09
5680
一步步带你了解前后端分离利器之JWT
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 让我们来假想一下一个场景。在A用户关注了B用户的时候,系统发邮件给B用户,
wangxl
2018/03/09
1.1K0
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
wangxl
2018/02/25
6690
JSON Web Token - 在Web应用间安全地传递信息
权限验证JWT
1. 结构 Header { "alg": "HS256", "type": "JWT" } Payload 截屏2021-10-16 下午8.28.25.png { "sub": "123456", "name": "John", "admin": true } Signature 截屏2021-10-16 下午8.45.09.png 2. 服务端token // 生成token const jwt = require('jsonwebtoken') const t
愤怒的小鸟
2021/12/13
4190
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
程序猿DD
2018/07/31
3970
JSON Web Token - 在Web应用间安全地传递信息
使用 JWT 实现 Token 验证
在开发过程中要实现登录,授权的基础功能有很多方法,通过 JWT 来实现非常方便,安全。因为是无状态的,比较于cookie 方式的实现,JWT能很好的解决跨域请求的问题。
张云飞Vir
2020/03/26
3.1K0
一步步带你了解前后端分离利器之JWT
一、HTTP的无状态性 HTTP 是无状态协议,它不对之前发送过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的 Web 页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。 不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器的 CPU 及内存资源的消耗。从另一侧面来说,也正是因为 HTTP 协议本身是非常简单的,所以才会被应用在各种场景里。 二、Cookie 技
企鹅号小编
2018/02/02
1.4K0
一步步带你了解前后端分离利器之JWT
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 让我们来假想一下一个场景。在A用户关注了B用户的时候,系统发邮件给B用户,
kirito-moe
2018/04/27
7770
JSON Web Token - 在Web应用间安全地传递信息
JWT
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties. JWT.IO allows you to decode, verify and generate JWT
晚上没宵夜
2020/03/11
2.2K0
JWT
如何使用JWT向服务器证明你就是你
原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/
Bug开发工程师
2018/07/23
4610
如何使用JWT向服务器证明你就是你

相似问题

为什么openssl_verify()不能验证我的JWT令牌签名?

112

我应该使用哪个密钥来验证由Google签名的JWT?

10

谷歌OAuth JWT签名验证

13

JWT签名验证

10

验证Jwt签名

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文