我不想使用密钥(我没有)来验证JWT,我只想解码JWT并读取有效负载。是否可以使用jsonwebtoken.io:jjwt实现这一点?API中似乎缺少一个方法。
当然,我可以自己拆分和Base64解码令牌,但这感觉像是JWT库最基本的功能;因此我怀疑我可能错过了什么。
尝试以下代码:
int i = jws.lastIndexOf('.')
String withoutSignature = jws.substring(0, i+1);
Jwt<Header,Claims> untrusted = Jwts.parser().parseClaimsJwt(withoutSignature);
你可以“截取”最后一个句点字符(“.”)后面的最后一个部分,即JWS签名。然后将该JWT作为“普通”JWT(非JWS)读取。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
如果您可以使用其他库,可以按照此处的被接受答案执行: 如何使用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!");
}
}