这可以像下面那样完成,使用私钥签名生成令牌并使用公钥解析声明
@Configuration
public class KeyGeneratorConfig {
@Value("${jwt.privateKey}")
private String privateKey; //Encoded private key string
@Value("${jwt.publicKey}")
private String publicKey;//Encoded public key string
@Bean
public PrivateKey generatePrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec privKeySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
return kf.generatePrivate(privKeySpecPKCS8);
}
@Bean
public PublicKey generatePublicKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec pubKeySpecX509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
return kf.generatePublic(pubKeySpecX509EncodedKeySpec);
}
}
并且生成令牌和解析可以像这样完成
@Autowired
private PublicKey publicKey;
@Autowired
private PrivateKey privateKey;
private String doGenerateToken(Map claims) {
return Jwts.builder()
.setClaims(claims)
.setExpiration(generateExpirationDate("token"))
.signWith(SignatureAlgorithm.RS512, privateKey)
.compact();
}
public Claims getClaimsFromToken(String token) throws ExpiredJwtException, UnsupportedJwtException,
MalformedJwtException, SignatureException, IllegalArgumentException {
Claims claims;
claims = Jwts.parser()
.setSigningKey(publicKey)
.parseClaimsJws(token)
.getBody();
return claims;
}