定义
JWT(JSON Web Token)简而言之,JWT是一个加密的字符串,JWT传输的信息经过了数字签名,因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息,以便于从资源服务器获取资源,也可以增加一些额外的业务逻辑所需的声明信息。
验证流程
使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名和密码请求登录
- 服务端收到请求,去验证用户名和密码
- 验证成功后,服务端会签发一个Token,再把这个Token发送给客户端
- 客户端收到Token以后可以把它存储起来,比如放到Cookie里或者Local Storage(浏览器缓存)里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的Token
- 服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据
导入的依赖
实现代码
package utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SecureDigestAlgorithm;
import javax.crypto.SecretKey;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class JwtUtil {
final static int LimitTime = 60*60*24*24*3;//设置token的时长单位为秒
private final static SecureDigestAlgorithm<SecretKey, SecretKey> ALGORITHM = Jwts.SIG.HS256;//指定加密方法,这里加密方法为HS256
private final static String SECRET = "secret"
//设置token的密匙只能在服务端使用,如果被他人知道了密匙就可以自己给自己发token了
//注意:密匙的长度必须达标(到达256位)不然会报错,密匙自己生成。
public static final SecretKey KEY = Keys.hmacShaKeyFor(SECRET.getBytes()); //把token转换为对应的格式
public static String getToken(Map<String, Integer> claims){ //map中是的为你要保存的用户数据,比如账号等
// 令牌id //通过这个函数把数据包装加密为token
String uuid = UUID.randomUUID().toString();
Date exprireDate = Date.from(Instant.now().plusSeconds(LimitTime));
return Jwts.builder()
// 设置头部信息header
.header()
.add("typ", "JWT")
.add("alg", "HS256")
.and()
// 设置自定义负载信息payload
.claims(claims)
// 令牌ID
.id(uuid)
// 过期日期
.expiration(exprireDate)
// 签发时间
.issuedAt(new Date())
// 签名
.signWith(KEY, ALGORITHM)
.compact();
}
public static Jws<Claims> parseClaim(String token) {//把token转化为对应的数据体,但此时还无法直接获取我们保存的数据
try {
Jws<Claims> claimsJws = Jwts.parser().verifyWith(KEY).build().parseSignedClaims(token);
return claimsJws;
}catch (Exception e){
return null;
}
}
//通过数据体和对应的键值把我们之前保存在map中的数据通过键值读取出来
public static Integer getValue(Jws<Claims> claimsJws,String key){
if(claimsJws == null)return null;
return claimsJws.getBody().get(key,Integer.class);
}
}
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<>();
map.put("account",123456);
String string=getToken(map);
System.out.println(string);
System.out.println(getValue(parseClaim(string),"account"));
}
输出为