读取jwt里负载的信息

众所周知,JWT 的三个部分依次如下:

Header(头部) ,
元数据描述 Payload(负载) ,
传输的数据 Signature(签名),Header + Payload的签名

写成一行,就是下面的样子

Header.Payload.Signature

所谓读取jwt负载的信息,就是读取payload里的信息。

一、信息写入

首先,生成token时,要将信息写入payload。

Map<String, String> payload = new HashMap<>();
payload.put("time", System.currentTimeMillis() + "");
payload.put("userId",user.getUserid().toString());//写入用户ID
//生成JWT令牌
String token = JwtUtils.getToken(payload);

二、信息读取

每次前端请求后端,后端就可以读取里面的信息。jwt的token,都要附在request的header里。

import com.auth0.jwt.interfaces.DecodedJWT;

public User getCurUser() {
    User user = null;

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    String token = request.getHeader("authorization");
    if(token != null) {
        token = token.split(" ")[1];
        DecodedJWT dtoken = JwtUtils.getToken(token);
        String userId = dtoken.getClaim("userId").asString();
        user = queryById(Integer.parseInt(userId));
    }

    return user;
}

三、附录

1、pom.xml


<dependency>
    <groupId>com.auth0groupId>
    <artifactId>java-jwtartifactId>
    <version>3.10.0version>
dependency>

2、工具类JwtUtils

package com.landtool.szdata.modules.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.*;

public class JwtUtils {
    private static String SIGNATURE = "你的密钥";

    /**
     * 生成token
     * @param map //传入payload
     * @return 返回token
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.HOUR,1);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
    }

    /**
     * 验证token
     * @param token
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 获取token中payload
     * @param token
     * @return
     */
    public static DecodedJWT getToken(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
}

3、前端请求,附上jwt token

import axios from "axios";

// 创建一个 axios 实例
const service = axios.create({
  baseURL: "/api", // 所有的请求地址前缀部分
  timeout: 60000, // 请求超时时间毫秒
  withCredentials: true, // 异步请求携带cookie
  headers: {
    // 设置后端需要的传参类型
    "Content-Type": "application/json",
    //'token': 'your token',
    "X-Requested-With": "XMLHttpRequest",
  },
});

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken();//这个token就是jwt的token,前端保存在cookie或localStorage
    if (token) {
      config.headers["Authorization"] = "Bearer " + token;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    console.log(error);
    return Promise.reject(error);
  }
);

相关文章
SpringBoot采用jwt作为REST API安全机制的应用示例

你可能感兴趣的:(Java,计算机安全,jwt,payload,DecodedJWT)