JWT详细内容参考官网: jwt.io , 同时可以快速校验我们生成的JWT是否正确
引入JWT依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
生成本地密钥对(公/私钥)
如果本地已生成则跳过此步骤, 生成的密钥仅用于练习
如果涉及到隐私相关的公私钥最好不要在这使用, 谨防泄露
// 一个JWT ES256的测试类
public class JwtEs256Test {
// ES256公钥
private ECPublicKey publicKey;
// ES256私钥
private ECPrivateKey privateKey;
// 密钥id
private final String keyId = "key-for-test";
/**
* 生成密钥对
* 此处是代码生成的方式, 另外jdk中也有工具可以在命令行生成, 这里不做展开
*/
private void generateKeyPair() {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1");
keyGen.initialize(ecSpec);
KeyPair keyPair = keyGen.generateKeyPair();
this.publicKey = (ECPublicKey) keyPair.getPublic();
this.privateKey = (ECPrivateKey) keyPair.getPrivate();
// (可选) 如果想查看密钥内容则执行, 并复制到文件中保存, 本例仅保存在内存中
Base64.Encoder encoder = Base64.getEncoder();
System.out.println(encoder.encodeToString(publicKey.getEncoded()));
System.out.println(encoder.encodeToString(publicKey.getEncoded()));
}
}
生成KeyProvider
/**
* JwtEs256Test
* 生成自定义ECDSAKeyProvider 关联之前生成的密钥对
*/
private ECDSAKeyProvider getKeyProvider() {
return new ECDSAKeyProvider() {
@Override
public ECPublicKey getPublicKeyById(String s) {
try {
return new ECPublicKeyImpl(publicKey.getEncoded());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public ECPrivateKey getPrivateKey() {