一、登录认证
令牌就是一段字符串
承载业务数据, 减少后续请求查询数据库的次数
防篡改, 保证信息的合法性和有效性

二、JWT简介

三、使用JWT
pom.xml引入起步依赖
XML
<!--java jwt坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
编写工具类JwtUtil
utils/JwtUtil.java
java
package com.devops.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
private static final String KEY = "devops";
//接收业务数据,生成token并返回
public static String genToken(Map<String, Object> claims) {
return JWT.create()
.withClaim("claims", claims)
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
.sign(Algorithm.HMAC256(KEY));
}
//接收token,验证token,并返回业务数据
public static Map<String, Object> parseToken(String token) {
return JWT.require(Algorithm.HMAC256(KEY))
.build()
.verify(token)
.getClaim("claims")
.asMap();
}
}
单元测试类JwtTest
java
package com.example.demo;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
public class JwtTest {
// 生成加密后的token
@Test
public void testGen() {
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1);
claims.put("username", "张三");
// 生成jwt代码
String token = JWT.create()
.withClaim("user", claims) // 添加载荷
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)) // 设置过期时间
.sign(Algorithm.HMAC256("yange")); // 指定算法,生成密钥
System.out.println(token);
}
// 验证加密后的token
@Test
public void testVerify() {
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NjczMTg5ODV9.jRY2E19_CC3qKkZl5poHaHInC7CVLf9bc36geEU2S04";
try {
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256("yange"))
.build()
.verify(token);
Map<String, Claim> claims = decodedJWT.getClaims();
System.out.println(claims.get("user"));
} catch (Exception e) {
System.out.println("验证失败");
}
}
}
在项目中可以这样使用:
java
//使用JwtUtil工具类生成token
Map<String, Object> claims = new HashMap<>();
claims.put("id", user.getId());
claims.put("username", username);
String token = JwtUtil.genToken(claims);
return Result.success(token);
最终的结果:
