jwt.io在哪里从JWT令牌获取公钥?

问题描述

我正在通过jwt.io(在“调试器”部分中)对JWT令牌进行解码,以查看标头,有效载荷。令人惊讶的是,它也进行了验证,我可以看到它(jwt.io调试器)也能够检索公钥。

所以我的问题是:JWT令牌是否提供公钥以及JWT令牌的一部分?

我正在粘贴其中的一部分(由于安全原因无法完整粘贴,将截断实际JWT令牌的一部分)

F3cy5jb21cL2V1LXdlc3QtMV9ZckVRYjY5Z1giLCJleHAiOjE2MDE2Mzg4OTMsImlhdCI6MTYwMTYzNTI5MywidmVyc2lvbiI6MiwianRpIjoiNmI2YmZiNmYtY2M0MS00N2Q5LWI0YzYtOTBmOGFmNWM2MjQ1IiwiY2xpZW50X2lkIjoiMTM0MWxxa3N1ZmUwbm1vaW9kdnRjc2t2cWIifQ.RtKfz54uBgSZ1gc4KRPjzL4dPe5AbH2YMJu-DDvIxBzgMjqT9q4ApGzcWYB62-MgDUf-F_hK0kF9eIwAi9fARhp 0HGGnyiuydW_our6zE3EphLvXQByTDY5xzOUuSvt7WbDZWeSfpHcjrBttRSJAPOsZ2gInafKjZgWKyGL4vJB9swEhOMSSpTQDGWKenJCyp4emhe8E4XGzYTo9WEb-Wqg6sI__LrusDNd917FaocPKBxA

解码后的消息(再次被截断)

标题

{
  "kid": "cJ0PzkBXPyjX7FM67jcOECIY=","alg": "RS256"
}

有效载荷:

{
  "sub": "13lqs0moiodvtcskvqb","token_use": "access","scope": "example.com/Manage","auth_time": 1601293,"iss": "https://cognito.eu.amazonaws.com/","exp": 1601638,"iat": 10353,"version": 2,"jti": "cc1-47d9-b6-5c6245","client_id": "nmodvtcb"  
}

在其中可以看到公钥(已截断)


-----BEGIN PUBLIC KEY-----
QEFAAOCAQ8AMIIBCxmf9bakWk
556KYmIZB+Sy1ftkkGa4qlUsmRvcG2Hll+7HBWp1ao6MVLskjdaaKg8iH1Iz4DKG
lgqT/ndwhoxvTBuvm0X2CZoNzZn4S8wDTr78m/S/YegZRhv6y58gkiKSEmbbC/g5
Bp+AF88NwBvLm1jdd
-----END PUBLIC KEY-----

从jwt.io中的调试器在哪里检索公用密钥?我不明白这一点。

解决方法

令牌包含令牌的发行者(iss)和密钥ID(kid),密钥ID(kid)标识验证签名所需的公共密钥 利用此信息,jwt.io可以在JWKS端点(/.well-known/jwks.json)上以JWK(JSON Web Key)的形式找到公钥,以验证令牌。一个JWKS(JSON Web Key Set)包含一个JWK数组,该链接显示了一个示例。

根据cognito documentation,当您使用Amazon用户池对用户进行身份验证时,将使用此机制。

通过jwks端点提供密钥是一种标准机制,其他提供者也可以使用该机制,例如Microsoft Azure。

,

我也一直试图了解自己。如果您打开开发人员工具并在将令牌粘贴到调试器页面中时看到jwt.io发出的请求,则会看到它发出了其他请求。

以我的名义,iss是:

"iss": "http://localhost:8080/auth/realms/myrealm"

因此jwt.io添加了标准路径/.well-known/openid-configuration并向发出XHR请求

http://localhost:8080/auth/realms/myrealm/.well-known/openid-configuration

在json中找到很多信息的地方,其中有jwks_uri

{
...
"jwks_uri": "http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/certs",...
}

然后有另一个XHR请求到上述URL,响应为jwks。 使用该公共密钥,jwt.io可以验证令牌。至少我认为是这样。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...