本文介绍基于 FusionAuth JWT 的 JWT 实现方法。
目录
- FusionAuth JWT 简介
- 代码示例
FusionAuth JWT 简介
FusionAuth JWT 只有一个外部依赖 Jackson,不依赖于 Bouncy Castle、Apache Commons 或 Guava.
特性:
- JWT 签名支持 HMAC、RSA 和 Elliptic Curve(椭圆曲线) 算法,包括:HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512;
- PEM 解码 / 编码
- 从 PEM 文件解码出私钥或公钥
- 将私钥或公钥编码成 PEM 文件
- JSON Web Key
- 通过私钥构建 JWK
- 通过公钥构建 JWK
- 通过 PEM 构建 JWK
- 工具类
- 生成 2048、3072、4092 位的 RSA 密钥对
- 生成 256、384、512 位 EC 密钥对
- 通过 X.509 证书生成
x5t
和x5t#256
- 为 SHA-256,SHA-384 和 SHA-512 生成理想的 HMAC 密码长度
- 为 OpenID Connect 生成 at_hash 和 c_hash 声明
代码示例
package tutorial.jwt;
import io.fusionauth.jwt.Signer;
import io.fusionauth.jwt.Verifier;
import io.fusionauth.jwt.domain.JWT;
import io.fusionauth.jwt.hmac.HMACSigner;
import io.fusionauth.jwt.hmac.HMACVerifier;
import org.junit.Assert;
import org.junit.Test;
import java.time.ZonedDateTime;
public class FusionAuthJwtTest {
@Test
public void testHmacSha256() {
String secret = "HMAC SHA256 SECRET";
Signer signer = HMACSigner.newSHA256Signer(secret);
String issuer = "Issuer";
String subject = "Subject";
JWT jwt = new JWT()
.setIssuer(issuer)
.setExpiration(ZonedDateTime.now().plusMinutes(60))
.setSubject(subject)
.setAudience("Audience X")
.setNotBefore(ZonedDateTime.now().minusMinutes(60))
.setIssuedAt(ZonedDateTime.now())
.setUniqueId("jwt-id-1");
String encodedJwt = JWT.getEncoder().encode(jwt, signer);
System.out.println(encodedJwt);
Verifier verifier = HMACVerifier.newVerifier(secret);
JWT decodedJwt = JWT.getDecoder().decode(encodedJwt, verifier);
Assert.assertEquals(issuer, decodedJwt.issuer);
Assert.assertEquals(subject, decodedJwt.subject);
// 其它校验略...
}
}
网友评论