您需要将密钥字符串转换为 JavaKey
实例。
您的密钥字符串是 Base64 编码的吗?如果是这样,请执行以下操作:
@Value("${jwt.token.secret}")
private String secret;
private Key getSigningKey() {
byte[] keyBytes = Decoders.BASE64.decode(this.secret);
return Keys.hmacShaKeyFor(keyBytes);
}
JwtToken.builder().value(Jwts.builder()
.setClaims(createClaims(account))
.setSubject(subject.toString())
.setIssuedAt(Date.from(createdDateTime))
.setExpiration(Date.from(expirationDateTime))
.signWith(getSigningKey())
.compact()).expiration(expirationDateTime.toString()).build()
如果您的密钥不是 base64 编码的(它可能应该是,因为如果您使用原始密码,例如,您的密钥可能不正确或格式不正确),您可以通过以下方式执行此操作:
private Key getSigningKey() {
byte[] keyBytes = this.secret.getBytes(StandardCharsets.UTF_8);
return Keys.hmacShaKeyFor(keyBytes);
}
但是,通常不推荐第二个示例,因为它可能意味着您的密钥格式不正确。格式良好的安全随机密钥不是人类可读的,因此要将其存储为字符串,通常首先对密钥字节进行 base64 编码。
从文档https://github.com/jwtk/jjwt#jws-key-create:
如果要生成足够强的 SecretKey 以用于 JWT HMAC-SHA 算法,请使用Keys.secretKeyFor(SignatureAlgorithm)
辅助方法:
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256); //or HS384 or HS512
在底层,JJWT 使用 JCA 提供者的 KeyGenerator 来为给定算法创建具有正确最小长度的安全随机密钥。
如果你有一个现有的 HMAC SHA SecretKey 的编码字节数组,你可以使用Keys.hmacShaKeyFor
helper 方法。例如:
byte[] keyBytes = getSigningKeyFromApplicationConfiguration();
SecretKey key = Keys.hmacShaKeyFor(keyBytes);