栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java生成、解析JWT【java-jwt】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java生成、解析JWT【java-jwt】

文章目录
  • 一、简介
    • 1.Header
    • 2.Payload
    • 3.Signature
    • 4.组合
  • 二、封装类
    • 1.引入依赖
    • 2.封装方法
  • 三、使用方法


一、简介

JWT是token的一种,一个JWT字符串包含三个部分

1.Header

头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型

{
  "alg": "HS256",    // 指定签名算法
  "typ": "JWT"		 // 指定token令牌类型
}
2.Payload

包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息

iss: 发行人
exp: 到期时间
sub: 主题
aud: 用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID用于标识该JWT
3.Signature

数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】

HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)
4.组合

最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT

Header.Payload.Signature

二、封装类 1.引入依赖


    com.auth0
    java-jwt
    3.10.3

2.封装方法
package com.cxstar.utils;

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

import java.util.Calendar;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    // 签名密钥
    private static final String SECRET = "hello JWT *%$#$&";

    
    public static String generateToken(Map payload){
        // 指定token过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.HOUR, 24);  // 24小时

        JWTCreator.Builder builder = JWT.create();
        // 构建payload
        payload.forEach(builder::withClaim);
        // 指定签发时间、过期时间 和 签名算法,并返回token
        String token = builder.withIssuedAt(new Date()).withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));
        return token;
    }


    
    public static DecodedJWT decodeToken(String token){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        return decodedJWT;
    }
}





三、使用方法
package com.cxstar;

import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.cxstar.utils.JwtUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Map;

@SpringBootTest
class JwtLoginApplicationTests {
    
    @Test
    void tokenTest() {

        // 根据用户信息生成令牌 --------------------------
        Map payload = new HashMap<>();
        payload.put("userId", "233");
        payload.put("userName", "ps");
        String token = JwtUtil.generateToken(payload);
        System.out.println("token: " + token);
        // --------------------------------------------

        // 解析令牌并获取用户信息 ------------------------------------------------
        try {
            DecodedJWT decodedJWT = JwtUtil.decodeToken(token);
            String userId = decodedJWT.getClaim("userId").asString();
            String userName = decodedJWT.getClaim("userName").asString();
            String exp = decodedJWT.getExpiresAt().toString();
            System.out.println("userId: " + userId);      // 取出自定义属性【用户id】
            System.out.println("userName: " + userName);  // 取出自定义属性【用户名】
            System.out.println("exp: " + exp);            // 取出默认属性【过期时间】
        } catch (JWTDecodeException e) {
            System.out.println("令牌错误");
        } catch (TokenExpiredException e) {
            System.out.println("令牌过期");
        }
        // -------------------------------------------------------------------

    }


}


ps:最后附一篇写的很详细的JWT文章https://blog.csdn.net/weixin_45070175/article/details/118559272

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955944.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号