文章目录
- 概念
- 基本概念
- JWT组成
- JWT使用
- 准备工作
- JWT演示
- 参考来源
概念
基本概念
JWT全称是JSON Web Tokens,它是一种通用的基于文本的消息传输格式。常作为用户进入Web系统的令牌
JWT组成
JWT由三段Base64编码组成,它们之间用.分隔,从左到右依次是JWT头部的Base64编码、JWT载荷的Base64编码、JWT签名的Base64编码
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- JWT头部
JWT头部经过Base64解码后是一串JSON字符串,记录签名算法类型等信息 - JWT载荷
JWT载荷经过Base64解码后是一串JSON字符串,记录有效信息,如用户标识等信息就可以存储到载荷中 - JWT签名
*JWT签名记录签名信息,签名信息是JWT头部的base64编码+JWT载荷的base64编码+key通过签名算法生成的
JWT使用
准备工作
- 引入maven依赖
<dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.12.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --><version>0.12.5</version><scope>runtime</scope></dependency></dependencies>
JWT演示
- HS256算法 – 通过 subject 方法设置载荷信息
void jwtByHS256() {// 签名需要用到的keySecretKey key = Jwts.SIG.HS256.key().build();// 默认使用HS256算法进行签名,带有签名的JWT成为JWSString jws = Jwts.builder().subject("小红").signWith(key).compact();System.out.println("生成的JWS:" + jws);Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();System.out.println("载荷信息:" + payload);}
通过 subject 方法设置载荷信息,其实就是将载荷信息存到名为sub的属性中
- HS384算法 – 通过 claims 方法设置载荷信息
void jwtByHS384() {MacAlgorithm hs384 = Jwts.SIG.HS384;SecretKey key = hs384.key().build();Map<String, Object> info = new HashMap<>();info.put("name", "小北");info.put("age", 19);String jws = Jwts.builder().claims(info).signWith(key, hs384).compact();System.out.println("生成的JWS:" + jws);Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();System.out.println("载荷信息:" + payload);}
如果载荷信息是一个map集合,可以通过 claims 方法设置载荷信息
- HS512算法 – 通过 content 方法设置载荷信息
void jwtByHS512() throws JsonProcessingException {MacAlgorithm hs512 = Jwts.SIG.HS512;SecretKey key = hs512.key().build();Map<String, Object> info = new HashMap<>();info.put("name", "小林");info.put("age", 18);ObjectMapper objectMapper = new ObjectMapper();String infoStr = objectMapper.writeValueAsString(info);String jws = Jwts.builder().content(infoStr).signWith(key, hs512).compact();System.out.println("生成的JWS:" + jws);Claims payload = Jwts.parser().verifyWith(key).build().parseSignedClaims(jws).getPayload();System.out.println("载荷信息:" + payload);}
如果载荷信息是一个JSON字符串,可以通过 content 方法设置载荷信息
- RSA算法 – 通过 claims 方法设置载荷信息
void jwtByRSA() {SignatureAlgorithm rs512 = Jwts.SIG.RS512;KeyPair keyPair = rs512.keyPair().build();Map<String, Object> info = new HashMap<>();info.put("name", "小兰");info.put("age", 20);// 私钥加密String jws = Jwts.builder().claims(info).signWith(keyPair.getPrivate(), rs512).compact();System.out.println("生成的JWS:" + jws);Claims payload = Jwts.parser().verifyWith(keyPair.getPublic()).build().parseSignedClaims(jws).getPayload();System.out.println("载荷信息:" + payload);}
使用RS512非对称加密算法生成JWS
参考来源
- JWT官网
- JJWT