jwt.io从JWT令牌中获取公钥的位置在哪里?

21

我正在通过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-----

< p>调试器在 jwt.io 上是从哪里检索公钥的?我无法理解这一点。


1
我认为您不需要密钥来解码JWT令牌。它们都遵循行业标准RFC 7519,任何人都可以解码。由于您不会在令牌中传递任何敏感信息,所以这不是一个风险(除非您让知道如何使用它登录到您的帐户的人窃取了它)。有许多解码器可以做同样的事情jwt-decodejwt-auth等。 - Qumber
3
关键是用于验证签名,而不是解码令牌。令牌本身仅使用base64url编码。 - jps
2个回答

16
该令牌包含令牌的发行者(iss)和密钥ID(kid),该标识符标识需要验证签名的公钥。有了这些信息,jwt.io可以在JWKS端点(/.well-known/jwks.json)上找到以JSON Web Key形式的公钥来验证令牌。JWKS(JSON Web Key Set)包含一系列的JWKs,链接显示了一个示例。
根据cognito文档的说明,当您使用Amazon用户池对用户进行身份验证时,会使用此机制。
通过jwks端点提供密钥是一种标准机制,其他提供商(例如Microsoft Azure)也使用此机制。

所以如果我理解你的意思正确,它是从“kid”和“iss”中获取公钥来验证JWT令牌的签名?Cognito是否必须在令牌中提供这些细节?如果可能的话,您能否再详细说明一下? - CuriousMind

16

我也一直在努力理解。如果你打开开发者工具,并查看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 为此。 - ericlee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接