jwt.io从哪里获得jwt令牌的公钥



我通过JWT.io(在调试器部分(解码JWT令牌,以查看Headers,Payload。令人惊讶的是,它也得到了验证,我可以看到它(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标识验证签名所需的公钥有了这些信息,jwt.io可以在JWKS端点(/.aknowledge/JWKS.JSON(上找到JWK(JSON Web密钥(形式的公钥,以验证令牌。JWKS(JSON Web密钥集(包含一个JWK数组,链接显示了一个示例。

根据cognito文档,当你使用亚马逊用户池来验证你的用户时,就会使用这种机制。

通过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就可以验证令牌。至少我认为会发生这种事。

最新更新