【问题标题】:How can I get Claims from a JWT?如何从 JWT 获得索赔?
【发布时间】:2017-06-25 00:55:57
【问题描述】:

我需要从 JWT 中提取声明。

看来这应该不费吹灰之力了。

它已签名,从我得到的标题中:

{
  "alg": "RS256",
  "typ": "JWT"
}

智威汤逊:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJtYXJrLnN0YW5nQGRoaWdyb3VwaW5jLmNvbSIsInNjb3BlIjpbIm9wZW5pZCJdLCJyb2xlcyI6WyJKT0JTRUVLRVIiXSwiam9ic2Vla2VySWQiOiJ3TDFkTWdQckZWOUl5dEZZIiwiZXhwIjoxNDg4Mzk1ODE5LCJhdXRob3JpdGllcyI6WyJKT0JTRUVLRVIiXSwianRpIjoiNWRiYjNkYzQtNGI3NC00MDYyLTgzMmQtYjE1MTgwYWZhZjllIiwiY2xpZW50X2lkIjoiZWZjIn0.NxiF4x39na3KdDUFz2zxqy1zSfJkj4FdKHflpgJUxzMgBq8bbJIFVkmwAUYA6_YXm6kGFcyTMgdiRIJpqc5buDPdV1vkzh4QKFTxMz9MF4i3vtIQ21Vm5W12KikWdWGGUXMD4udJwu7rmuIBtNIa-ciZOPADNrrXfuw7iML1xxAA-C0f4OTbiKqiXr3QEUZwcqZB17qfh_dVRRxgO-_uHUg84JDcpXEDQPzPWX68u1EHH4J6IcpMKn1VY9k3RcZU6pq-ndzQgBlKdVm2owA6i-UM9p1zSz7ZX_2wx0czEEcNF1rMdeIv5yxP9YEpWb14-GUG4qgpn_rAIQBJ7eu7xw P>

它在 jwt.io 网站上解码得很好,但由于我没有“秘密”密钥,它出现为“无效签名”。这很好,我不想验证它。

我想要的只是声明,但是当我使用 Java 库对其进行解码时,我得到的只是错误。

如果我手动解码(即拆分/base64 解码),那就没问题了。

那么,Java 库我做错了什么?

【问题讨论】:

  • 我们如何在不看到您的代码的情况下回答您的问题?
  • 如果我的回答对你有用,请告诉我。
  • 我的代码是我在 SO 上找到的。我正在寻找的是如何让其中一个库在不编写代码的情况下提取声明。

标签: java jwt jose4j


【解决方案1】:

一旦问题被标记为 ,我了解到您正在使用 jose4j 来解析 JWT 令牌。

在这种情况下,您可以从JwtConsumerBuilder 调用setSkipSignatureVerification()。它允许您在不验证签名的情况下解析声明:

JwtConsumer jwtConsumer = new JwtConsumerBuilder()
                                  .setSkipSignatureVerification()
                                  .build();
                                                  
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);

【讨论】:

  • algRS256,所以我想会有一些公钥来验证签名
  • @pedrofb 好地方!但由于某种原因,OP 只关心在没有任何签名验证的情况下解析声明。
  • 我相信,可能是错误的,添加对外部数据(即公钥)的依赖可能会使我的代码“脆弱”。密钥中的任何更改都需要我更改我的代码或至少对更改做出反应。当这种情况发生时,我的代码就坏了。
  • @ChaosRules 你之前的评论是什么意思?我的解决方案对你有用吗?
  • 对不起,我没有机会测试它。我认为它会起作用,并且是我正在寻找的。我之前的评论是关于使用公钥验证签名的。我不想这样做。
【解决方案2】:

我提供一个通用的答案供大家使用。

我正在使用这个maven/gradle library。对 Maven 使用以下内容。

<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
    <version>[ version ]</version>
</dependency>

然后使用以下代码解码并获取声明。

String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbG...";

JWSObject jwsObject;
JWTClaimsSet claims;

try {
       jwsObject = JWSObject.parse(this.jwt);
       claims =  JWTClaimsSet.parse(jwsObject.getPayload().toJSONObject());
} catch (java.text.ParseException e) {
       // Invalid JWS object encoding
}

// now access any claims you want using the relevant key. It will be returned as an object
Object expiry = claims.getClaim("exp");


【讨论】:

    猜你喜欢
    • 2021-05-23
    • 2021-10-10
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2021-03-20
    • 2018-09-04
    相关资源
    最近更新 更多