是什么?
JWT(JSON Web Token)
什么用?
为了识别无状态的http协议对应的客户端身份。简单来说:就是服务端用来确定接收到的请求是来自哪个客户端的。
为什么?
怎么用?
jwt关注的是底层的加密实现,所以对于他而言,关键方法就两个,分别是计算加密字符串token和校验解密字符串token。底层实现很复杂,感激前辈们的努力,我们直接使用auth0提供的方法即可。
生成token代码如下:
//过期时间15分钟
private static final long EXPIRE_TIME = 15*60*1000;
/**
* 密钥
*/
private static final String SECRET = "111";
public static String getToken(String id,String sec){
//指定签名加密算法
Algorithm algorithm = Algorithm.HMAC256(sec);
Map<String,Object> header = new HashMap<>();
//填入token头信息
header.put("typ","JWT");
header.put("alg","HS256");
return JWT.create().withClaim("userId",id)
.withExpiresAt(new Date(System.currentTimeMillis()+EXPIRE_TIME)).withIssuedAt(new Date())
.withHeader(header).sign(algorithm);
}
- Algorithm 用来指定签名算法,常用的是HMAC256,加密因子可以是固定值,也可以是变量。
- withClaim指定签名里面存储的一些基本信息。
- withExpiresAt指定过期时间。
- withIssuedAt指定签发时间。
- withHeader指定token头,里面包含typ和alg,常用信息为JWT和HS256
- 最终产生的token为base64url(header)+.+base64url(playload),然后再用head里面指定的算法进行加密,获取对应token信息。
校验token代码如下:
public static boolean verity(String token,String password){
try {
Algorithm algorithm = Algorithm.HMAC256(password);
JWTVerifier jwtVerifier = JWT.require(algorithm).build();
DecodedJWT jwt = jwtVerifier.verify(token);
}catch (Exception e){
e.printStackTrace();
return false;
}
//jwt.getClaims();
return true;
}
- 解密之后获取到的是DecodedJWT类,通过getClaims()方法可以获取token里面存储的信息。
- 获取该类需要调用JWTVerifier 的verify方法。
- 获取JWTVerifier 类需要通过require().build()获取。