什么是JWT
JWT 是 “JSON Web Token” 的简写,也就是通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全的将信息作为 JSON 对象传输. 在数据传输过程中还可以完成数据加密,签名等相关处理。
为什么使用JWT认证
http 协议是一种无状态的协议,也就意味着当用户第一次通过用户名和密码登录成功以后,下一次再请求的时候,用户还需要再进行登录才行,因为根据 http 协议,我们不能知道是哪个用户发出的请求。
所以我们在用户登录成功的时候给用户发布一个令牌,这个令牌就是token,通过token可以鉴定用户是否已经登录过,从而实现权限校验。
Token校验流程图:
JWT token结构
JWT 令牌由三个部分组成,分别是 标头(Header)、有效载荷(Payload)、签名(Signature),并且由 “.” 分割,类似于 xxxx.yyyy.zzzzz ,也就是 Header.Payload.Signature,简单来说可以当成是一串字符串。
引入maven依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.3.0</version>
</dependency>
生成Token
package com.example.utils;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* Token工具类
*/
@Component
public class TokenUtils {
/**
* 生成JWT token
*/
public static String createToken(String data, String sign) {
// audience是存储数据的一个媒介 存储用户ID和用户的角色 1-ADMIN
return JWT.create().withAudience(data)
.withExpiresAt(DateUtil.offsetDay(new Date(), 1)) // 设置过期时间1天后
.sign(Algorithm.HMAC256(sign));
}
}
在login方法里使用TokenUtils生成token
// 生成token
String token = TokenUtils.createToken(dbAdmin.getId() + "-" + dbAdmin.getRole(), dbAdmin.getPassword());
JWT拦截器 JWTInterceptor
package com.example.common.config;
import cn.hutool.core.util.ObjectUtil;
import com.auth0.jwt.JWT;
import com.