JWT介绍
JWT工具
JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上
JWT最重要的作用就是对 token信息的防伪作用。
JWT的原理,
一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行base64编码得到JWT。
介绍
1、公共部分
主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。
Key=ATGUIGU
2、私有部分
用户自定义的内容,根据实际需要真正要封装的信息。
userInfo{用户的Id,用户的昵称nickName}
3、签名部分
SaltiP: 当前服务器的Ip地址!{linux 中配置代理服务器的ip}
主要用户对JWT生成字符串的时候,进行加密{盐值}
最终组成 key+salt+userInfo token!
base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息。
集成JWT
1、pom.xml添加依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
2、编写JwtHelper类
/**
* jwt工具类
* <p>
* 创建时间: 2022-03-20 17:14
*
* @author fuxshen
* @version v1.0.0
* @since v1.0.0
*/
public class JwtHelper {
//token的过期时间
private static long tokenExpiration = 24 * 60 * 60 * 1000;
//token签名秘钥
private static String tokenSignKey = "123456";
/**
* 根据参数生成token
*
* @param userId
* @param userName
* @return java.lang.String
* @Description
* @author fuxshen
* @date 2022-03-20 17:17:15
**/
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
.setSubject("YYGH-USER")
//设置过期时间(当前系统时间+设置的时间) 当前系统时间,往后延迟我们设置的时间
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
//加密的主体信息
.claim("userId", userId)
.claim("userName", userName)
//签名hash
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
.compressWith(CompressionCodecs.GZIP).compact();
return token;
}
/**
* 根据token字符串,得到用户id
*
* @param token
* @return java.lang.Long
* @Description
* @author fuxshen
* @date 2022-03-20 17:18:15
**/
public static Long getUserId(String token) {
if (StringUtils.isEmpty(token)) return null;
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
Integer userId = (Integer) claims.get("userId");
return userId.longValue();
}
/**
* 根据token字符串,得到用户名称
*
* @param token
* @return java.lang.String
* @Description
* @author fuxshen
* @date 2022-03-20 17:19:01
**/
public static String getUserName(String token) {
if (StringUtils.isEmpty(token)) return "";
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (String) claims.get("userName");
}
public static void main(String[] args) {
String token = JwtHelper.createToken(1L, "55");
System.out.println(token);
System.out.println(JwtHelper.getUserId(token));
System.out.println(JwtHelper.getUserName(token));
}
}
在需要使用jwt,调用JwtHelper中的createToken方法,传递参数生成token
String token = JwtHelper.createToken(userInfo.getId(), name);