JWT技术详解

欢迎来到Katerina的文章,这里记录了一些日常学习和BUG希望对您有帮助!!看完的小伙伴一键三连!!蟹蟹~~

一、JWT是什么?

  • JSON Web Tokenjson格式的web令牌技术,属于令牌技术的一种。用于解决web开发中的身份识别问题

二、使用步骤

1.添加依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2.生成过程:测试类

package com.sky;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.jupiter.api.Test;

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


public class JWTTest {
    @Test
    public void JWTTest(){
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("userName","tom");
        String token = Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 5))//过期时间设置五分钟
                .signWith(SignatureAlgorithm.HS256, "GerayInfo")
                .compact();
        System.out.println("token = " + token);
        Claims claims1 = Jwts.parser()//这里的Claims  public interface Claims extends Map<String, Object>, ClaimsMutator<Claims>  就是一个map集合
                .setSigningKey("GerayInfo")
                .parseClaimsJws(token)
                .getBody();
        System.out.println("claims = " + claims1);
    }
}

运行结果:

token = eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ0b20iLCJleHAiOjE2OTk4NjIxMzV9.yQZHM2PnIeWKwiPHypD3m7XVOqcOuiam81EW3CRpCQA
claims = {id=1, userName=tom, exp=1699862135}

总结

JWT的结构:三部分组成:
Header--头:里面放的是令牌的类型、签名算法等原数据信息。使用Base64编码得到的。头部分会自动生成不需要我们去处理。

Body--载荷:里面放的是用户的身份信息和过期时间。使用Base64编码得到的。不可以存放关键的信息,比如:密码。会泄露。Base64是可以解码的,得到token的body就可以把对应的信息读出来。上面代码已经展示了。       

Signature--签名:Header+Body+密钥字符串,通过签名算法生成签名,用于防止篡改和校验。
        签名算法一般是用:HS256算法。这个是不可逆的。


工具类

package com.sky.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法,也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 设置jwt的body
        String token = Jwts.builder()
                // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                .setClaims(claims)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置过期时间
                .setExpiration(exp).compact();

        return token;
    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        // 得到DefaultJwtParser
        Claims claims = Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置需要解析的jwt
                .parseClaimsJws(token).getBody();
        return claims;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值