【SpringBoot】使用JWT验证
文章目录
- 简介
- 使用
- 生成Token
- 验证Token
- 获取Token载荷中的信息
- 完整代码
简介
JWT,全称为 JSON Web Token,是一种基于 JSON 的开放标准(RFC 7519),用于在不同应用之间传递信息的简洁、安全的标准。JWT 通常被用来在客户端和服务器之间传递身份信息,以实现用户认证和授权等功能。
JWT 主要由三部分组成:
- 头部(Header) :头部包含 JWT 的类型(即“JWT”)和所使用的算法(如 HS256 或 RS256 等)。
- 载荷(Payload) :载荷部分用于存储 JWT 的有效负载信息,包括用户信息、权限、过期时间等。
- 签名(Signature):签名部分是对头部和载荷进行签名的结果,用于保证 JWT 的完整性和真实性。
JWT 的主要优点是简洁、安全、易于传递和存储。由于 JWT 包含了完整的用户信息,因此不需要在每次请求时重新向服务器发送用户信息,从而减少了网络流量和服务器压力。此外,JWT 还可以使用公钥和私钥进行签名和验证,确保 JWT 的安全性。
使用
在pom.xml中引入
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
测试环境为Spring Boot 2.3.3
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User; // 用户实体类
import java.util.Calendar;
生成Token
用于用户登陆成功时,生成Token返回给前端,前端浏览器通本地存储。
/**
* 生成token
* @param user //传入payload
* @return 返回token
*/
public static String getToken(User user){
// 创建Token 并存入信息
JWTCreator.Builder builder = JWT.create();
builder.withClaim("userName",user.getUserName());
builder.withClaim("phone",user.getPhone());
builder.withClaim("id",user.getId());
builder.withClaim("role",user.getRole());
builder.withClaim("age",user.getAge());
// 存入过期时间
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE,1);
builder.withExpiresAt(instance.getTime());
// 加密并返回
return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
}
验证Token
用于验证前端提交到后端的Token是否有效未过期。
/**
* 验证token
* @param token
* @return
*/
public static void verify(String token){
JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
}
获取Token载荷中的信息
获取在生产Token时存入的用户信息。
/**
* 得到token中的信息
* @param token
* @return
*/
public static User getInfo(String token){
DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
User user = new User();
user.setId(verify.getClaim("id").asLong());
user.setUserName(verify.getClaim("userName").asString());
user.setPhone(verify.getClaim("phone").asString());
user.setRole(verify.getClaim("role").asString());
System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());
return user;
}
完整代码
package com.peng.framework.jwt;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User;
import java.util.Calendar;
/**
* @Author
* @Date 2021-02-08 7:46 下午
* @Description
*/
public class JWTUtils {
private static String TOKEN = "token!Q@W3e4r";
/**
* 生成token
* @param user //传入payload
* @return 返回token
*/
public static String getToken(User user){
// 创建Token 并存入信息
JWTCreator.Builder builder = JWT.create();
builder.withClaim("userName",user.getUserName());
builder.withClaim("phone",user.getPhone());
builder.withClaim("id",user.getId());
builder.withClaim("role",user.getRole());
builder.withClaim("age",user.getAge());
// 存入过期时间
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE,1);
builder.withExpiresAt(instance.getTime());
// 加密并返回
return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
}
/**
* 验证token
* @param token
* @return
*/
public static void verify(String token){
JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
}
/**
* 获取token中payload
* @param token
* @return
*/
public static DecodedJWT getTokenPayload(String token){
return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
}
/**
* 得到token中的信息
* @param token
* @return
*/
public static User getInfo(String token){
DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
User user = new User();
user.setId(verify.getClaim("id").asLong());
user.setUserName(verify.getClaim("userName").asString());
user.setPhone(verify.getClaim("phone").asString());
user.setRole(verify.getClaim("role").asString());
System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());
return user;
}
}