读取jwt里负载的信息

Posted 左直拳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取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

<!--引入JWT-->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.0</version>
</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安全机制的应用示例

以上是关于读取jwt里负载的信息的主要内容,如果未能解决你的问题,请参考以下文章

解析 JWT 令牌以仅在 C# 或 Blazor 中没有外部库的情况下获取有效负载内容

firebase如何发送一个有效负载包含下划线字符的JWT令牌?

Satellizer JWT 令牌将用户信息添加到有效负载中

Spring Boot认证:整合Jwt

SpringBoot整合JWT Token

真的有必要在 JWT 中内置有效负载吗?