Token
Token是一种广泛使用的身份验证机制,它代表了一种凭证,通常用于在客户端和服务端之间传递身份验证信息。通常在http请求头中包含token用以验证身份,并在请求结束后返回一个新的token并交由客户端保存。
使用JWT生成Token
Token的形式是多种多样的,生成的方式也具有很多选择性,如何选择取决于应用场景和技术需求。
JWT(Json Web Tokens)具有无状态性、安全性、易于集成等优点,这里选择使用JWT来生成Token。
pom.xml文件中引入JWT的依赖
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
新建一个Token工具类TokenUtils
package cool.tch.util;
/**
* @author denchouka
* @description TODO
* @date 2024/10/26 21:07
*/
public class TokenUtils {
/**
* 生成token
* @param username 用户名
* @param ip 用户的ip
* @return 生成的token
*/
public static String token(String username, String ip) {
return null;
}
/**
* 校验token
* @param token 请求头中携带的token
* @return 校验结果
*/
public static boolean verify(String token) {
return false;
}
}
生成token的方法
/**
* 生成token
* @param username 用户名
* @param ip 用户的ip
* @return 生成的token
*/
public static String token(String username, String ip) {
// 参数校验
if (StringUtils.isBlank(username) || StringUtils.isBlank(ip)) {
throw new BusinessException("用户名和ip不能为空");
}
// Header
HashMap<String, Object> header = new HashMap<>(2);
// Token类型
header.put("typ","JWT");
// 签名算法类型
header.put("alg","HS256");
try{
// 生成token签名
return JWT.create()
.withHeader(header)
// 添加声明
.withClaim("username", username)
.withClaim("ip", ip)
.withClaim("time", Instant.now())
// 加盐
.withClaim("salt", Constant.TOKEN_SECRET_SALT)
// 1H后过期
.withExpiresAt(Date.from(Instant.now().plusSeconds(Constant.TOKEN_EXPIRE_DATE)))
// 密钥
.sign(Algorithm.HMAC256(Constant.TOKEN_SECRET_KEY));
} catch (Exception e) {
throw new BusinessException("生成token失败");
}
}
校验token的方法
/**
* 校验token
* @param token 请求头中携带的token
* @return 校验结果
*/
public static boolean verify(String token) {
// 判空
if (StringUtils.isBlank(token)) {
return false;
}
// 验证token有效性
try{
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(Constant.TOKEN_SECRET_KEY)).build();
verifier.verify(token);
return true;
} catch (JWTVerificationException e) {
return false;
}
}
写在最后
以上生成和校验token方法的实现方式不是固定的,可根据自己的业务场景灵活实现。如果项目中使用了Redis等还可以将token存入缓存中,在服务端也保存token。