JWT
Json Web Token(JWT)
用于记录用户的登录状态,或者为用户创建身份认证的凭证
对比单纯的token
单纯的token还需要 将用户信息使用redis存储
JWT不用存储,JWT将需要的用户信息加密到token里面,返回客户端,存在客户端,请求时带上,服务器拿到JWT后可以解密到用户信息
JWT结构
payload不要放用户敏感信息,还是有可能会被获取
使用编码后的Header和payload与密钥secret(要保存好,不能外传)签名,签名后发给客户端
其他人如果截取修改了payloard的内容,后端拿到的时候使用密钥验证,如果改了签名验证就会不成功
例如编码前:
编码后
实现
加依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.15.0</version>
</dependency>
生成token:其中withheader(map)可以省略,因为默认自带的就是HS256和jwt,如需特别指定在设置
//header信息
HashMap<String,Object> map=new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
//令牌签发时间
Calendar calendar_now=Calendar.getInstance();
//令牌失效时间指定类
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.MINUTE,10);
//生成token
String token=JWT.create()
.withHeader(map) //header,指定加密方法和返回类型
.withClaim("userId",21) //payload有效负载
.withClaim("username","xiaochen")
.withIssuedAt(calendar_now.getTime()) //令牌签发时间
.withExpiresAt(calendar.getTime()) // 令牌失效时间
.sign(Algorithm.HMAC256("CJL"));
System.out.println(token);
验证token:获取payload的两种方式,一种直接获取,一种获取Map
//验证token
//创建验证对象
JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("CJL")).build();
DecodedJWT verify=jwtVerifier.verify(token);
第一种直接获取
System.out.println(verify.getClaim("userId"));
//输出的是claim 结果带引号:"username"
System.out.println(verify.getClaim("username"));
//输出的是String 结果不带引号:username
System.out.println(verify.getClaim("username").asString());
使用map获取
//使用Map获取
Map<String, Claim> claims = verify.getClaims();
Claim nameClaim=verify.getClaim("username");
System.out.println(claims.get("username").asString);