我怎样才能从JWT获得索赔?

时间:2017-02-07 16:57:09

标签: java jwt jose4j

我需要从JWT中提取声明。

这似乎应该是一个明智的选择。

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

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

JWT:

  

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

它在jwt.io网站上解码得很好,但因为我没有#34;秘密"键,它出现"无效签名"。哪个好,我不是要验证它。

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

如果我手动解码(即分割/ base64解码),那很好。

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

2 个答案:

答案 0 :(得分:3)

问题标记为后,我了解您使用jose4j解析JWT令牌。

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

.Include()

答案 1 :(得分:0)

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

我正在使用这个 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");