DefaultJwtParser:如何仅解码JWT?(无密钥,无验证)

16

我不想使用密钥(我没有)来验证JWT,我只想解码JWT并读取有效负载。是否可以使用jsonwebtoken.io:jjwt实现这一点?API中似乎缺少一个方法。

当然,我可以自己拆分和Base64解码令牌,但这感觉像是JWT库最基本的功能;因此我怀疑我可能错过了什么。

3个回答

30

尝试以下代码:

int i = jws.lastIndexOf('.')
String withoutSignature = jws.substring(0, i+1);
Jwt<Header,Claims> untrusted = Jwts.parser().parseClaimsJwt(withoutSignature);
你可以“截取”最后一个句点字符(“.”)后面的最后一个部分,即JWS签名。然后将该JWT作为“普通”JWT(非JWS)读取。
你所要求的是忽略有效JWS上的签名并仍然读取JWT头和主体。这违反了JWS规范,因此JJWT不支持它。
这是从Github issue中获取的,我想这可能与您所面临的问题相同。

至于解决方法,我已经有一个了。不过你的回答明确表明该库实际上(并且是故意地)没有提供这个功能。 - Jaroslav Záruba
1
这是一个非常糟糕的方法,就像@Blink所说的那样,只需使用auth0库。 - f.trajkovski

4
也许可以考虑使用Auth0库代替?
DecodedJWT jwt = JWT.decode(token);
jwt.getToken();

依赖项:

<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>3.8.3</version>
</dependency>
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>jwks-rsa</artifactId>
  <version>0.9.0</version>
</dependency>

以下示例摘自https://medium.com/trabe/validate-jwt-tokens-using-jwks-in-java-214f7014b5cf


1

如果您可以使用其他库,可以按照此处的被接受答案执行: 如何使用nimbus-jose-jwt解码JWT令牌以获取标题和有效负载的详细信息?

重复答案如下:
依赖项: com.nimbusds:nimbus-jose-jwt:<version>
用法:

/**
 * accessToken: the JWT string text.
**/
private String parseJWT(String accessToken) {
    try {
        var decodedJWT = SignedJWT  // or PlainJWT or EncryptedJWT
                           .parse(accessToken);
        var header = decodedJWT.getHeader().toString();
        var payload = decodedJWT.getPayload().toString();
    } catch (ParseException e) {
        throw new Exception("Invalid token!");
    }
}

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