我正在试图验证JWT上的签名。这是我代码的一部分:
DecodedJWT jwt = JWT.decode(token);
...
JwkProvider provider = new JwkProviderBuilder(jwksUrl).build();
Jwk jwk = provider.get(jwt.getKeyId());
Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
algorithm.verify(jwt);
我只知道一个错误:
com.auth0.jwt.exceptions.SignatureVerificationException: The Token's Signature resulted invalid when verified using the Algorithm: SHA256withRSA
但是,在jwt中,我可以看到算法显示为PS256而不是RSA256。这就是问题所在吗?我怎样才能得到这个来验证JWT?对于算法上的PS256,没有枚举选项。在某个地方看到可能是RSASSA,但我也看不出有什么选择。
更多信息: JWT是由外部提供者以一种奇怪的方式传递给我的,它不仅仅是HTTP头中的承载令牌,所以我需要自己来处理,而不是依赖框架来处理它。我正在使用Java 17。相关的依赖关系:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>jwks-rsa</artifactId>
<version>0.21.2</version>
</dependency>
发布于 2022-10-20 20:09:51
我用白龙计算出了答案,但我确实需要自己增加一些价值。以下是解决办法:
DecodedJWT jwt = JWT.decode(token);
URL url = new
JwkProvider provider = new JwkProviderBuilder(jwksUrl)
.build();
Jwk jwk = provider.get(jwt.getKeyId());
SignatureAlgorithm sa = SignatureAlgorithm
.forName(jwt.getAlgorithm());
DefaultJwtSignatureValidator validator =
new DefaultJwtSignatureValidator(sa, jwk.getPublicKey());
if (!validator.isValid(jwt.getHeader()+"."+jwt.getPayload(), jwt.getSignature())) {
throw new Exception("Could not verify JWT token integrity!");
}
为了完成这项工作,我必须向我的依赖项添加jjwt:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
.forName()
调用意味着它处理不同的算法,具体取决于JWT中指定的alg
。
https://stackoverflow.com/questions/74001668
复制相似问题