JSON Web Token (https://jwt.io/)
组成
- Header 头
- Payload 有效载荷
- Signature 签名
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
前两部分为JSON进行了Base64编码。
签名防止数据被篡改(修改任意一位则校验不通过)
具体使用
Github主页:
io.jsonwebtoken: https://github.com/jwtk/jjwt
0.12.3
工具类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class JwtUtils {
public static String genJwt(String secretString, Map<String, Object> claims) {
SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));
String jwt = Jwts.builder() .signWith(key, Jwts.SIG.HS256) .expiration(new Date(System.currentTimeMillis() + 10 * 60 * 1000)) .claims(claims) .compact();
return jwt; }
public static Claims parseJwt(String secretString, String jwt) {
SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));
Claims claims = Jwts.parser() .verifyWith(key) .build() .parseSignedClaims(jwt) .getPayload();
return claims; } }
|
旧版本
下列为 0.9.1 的旧版,不适用于新版,新版使用看Github页面
Maven依赖
1 2 3 4 5 6
| <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
|
此依赖在高版本JDK需要额外引入一个依赖:
1 2 3 4 5 6
| <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency>
|
生成 JWT
秘钥过短会报错
1 2 3 4 5 6 7 8 9
| Map<String, Object> claims = new HashMap<>(); claims.put("id", 1); claims.put("name", "tom");
String jwt = Jwts.builder() .signWith(SignatureAlgorithm.HS256, key) .setClaims(claims) .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) .compact();
|
解析 JWT
1 2 3 4
| Claims claims = Jwts.parser() .setSigningKey(key) .parseClaimsJws(jwt) .getBody();
|
parseClaimsJwt
方法适用于未签名的 JWT。
parseClaimsJws
方法适用于带有 JWS 签名的 JWT。
claims.toString()
输出