JWT的生成和校验

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
1、头部(Header): 包含了关于生成该 JWT 的信息以及所使用的算法类型。
2、载荷(payload): 包含了要传递的数据,例如身份信息和其他附属数据。
3、签名(Signature): 使用密钥对头部和载荷进行签名,以验证其完整性。 
 
记录JWT如何生成和校验
使用hutool工具生成和校验
1、引入hutool依赖
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>

2、在业务代码中简单生成JWT,接口返回token

@PostMapping("/login")
public ResponseResult login(String username,String password){
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
return ResponseResult.fail(1,"参数有误");
}
// 账号密码的校验
LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserInfo::getUserName,username);
UserInfo userInfo = userService.getOne(wrapper);
if (ObjectUtils.isEmpty(userInfo)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
if (!userInfo.getPassword().equals(password)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
Map<String,Object> map = new HashMap<>(){
private static final long serialVersionUID = 1L;
{
put("uid",userInfo.getUid());
// 15天时间后过期
put("exp",System.currentTimeMillis() + 1000 * 60 * 60 * 24* 15);
}
};
String token = JWTUtil.createToken(map, AppVariable.JWT_SECRET.getBytes());
return ResponseResult.success(token);
}

这里不用在意前面的密码校验,主要就是map开始生成。

map其实就是载荷,保存用户信息,至于保存什么,可自行决定。

下面是关于如何校验token,和生成一样,也是采用hutool里面的JWTUtil,以下是代码

package org.ongoal.gateway.filter;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import org.ongoal.common.ResponseResult;
import org.ongoal.common.config.AppVariable;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

@Component
public class AuthFilter implements GlobalFilter , Ordered {

private String[] skipAuthUrl = {"/user/login"};


@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String url = exchange.getRequest().getURI().getPath();
List<String> list = Arrays.asList(skipAuthUrl);
if (list.contains(url)){
return chain.filter(exchange);
}
// for (String s : skipAuthUrl) {
// if (s.equals(url)){
// return chain.filter(exchange);
// }
// }
ServerHttpResponse response = exchange.getResponse();
//登陆判断
List<String> tokens = exchange.getRequest().getHeaders().get(AppVariable.TOKEN_KEY);
if (CollUtil.isEmpty(tokens)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
// token不为空
String token = tokens.get(0);
boolean verify = false;
try {
verify = JWTUtil.verify(token, AppVariable.JWT_SECRET.getBytes());
}catch (Exception e){
verify = false;
}
if (!verify){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}else {
//看下是否过期
final JWT jwt = JWTUtil.parseToken(token);
// 得到过期时间
Object expObj = jwt.getPayload("exp");
if (ObjUtil.isEmpty(expObj)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
long exp = Long.parseLong(expObj.toString());
if (System.currentTimeMillis() >= exp){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
}
return chain.filter(exchange);
}

@Override
public int getOrder() {

return 0;
}
}

主要就是这段校验

 至此,简单的JWTUtil生成token和校验token完成。

以上为demo,只作为个人学习笔记!

 
 
 
 
 
 
posted @ 2024-02-02 11:26  多多指教~  阅读(167)  评论(0编辑  收藏  举报