我正在使用 jose4j 来验证和处理 JWT。 JWT 如下所示,并通过了 JWT 主页中的验证。
但是,我无法使用 jose4j java 库执行相同的操作。异常提示我设置的验证 key 。但是库中定义了很多类型的键,我试过了但没有成功。代码如下:
import java.util.Map;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.InvalidJwtException;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.keys.HmacKey;
public class YGJWT {
public static void main(String args[]) throws InvalidJwtException {
String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
String secret = "secret";
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setVerificationKey(new HmacKey(secret.getBytes())) //what kind of key do i need to use it here?
.build();
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
Map<String, Object> claimsMap = jwtClaims.getClaimsMap();
claimsMap.forEach((String key, Object val) -> {
System.out.println(key + ": " + val.toString());
});
}
}
感谢任何帮助。
最佳答案
我猜你会遇到这样的异常?
org.jose4j.lang.InvalidKeyException: A key of the same size as the hash output (i.e. 256 bits for HS256) or larger MUST be used with the HMAC SHA algorithms but this key is only 48 bits
HmacKey
是 HS256
的正确类型,但根据 https://www.rfc-editor.org/rfc/rfc7518#section-3.2 的第二段, key 在技术上太短了与异常消息具有相同的文本。
您可以通过使用 .setRelaxVerificationKeyValidation()
构建 JwtConsumer
来解决这个问题,这将允许使用更短的 key 。
看起来像这样(仅向示例中的片段添加一行):
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setVerificationKey(new HmacKey(secret.getBytes()))
.setRelaxVerificationKeyValidation()
// allow shorter HMAC keys when used w/ HSxxx algs
.build();
一般来说,我会尽量避免使用像“secret”这样的 key 这样的短密码,并建议尽可能使用更强的 key 。
关于java - jose4j JwtConsumer 的验证 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779585/