15分钟学会JWT使用

15分钟学会JWT使用

什么是JWT?

JSON Web Token ,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。

jwt 可以生成 一个加密的token,做为用户登录的令牌,当用户登录成功之后,发放给客户端。

请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。

JWT有什么用?

JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全效验,通过之后再进行处理。

JWT的组成

JWT由3部分组成,用 . 拼接

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ

jwt 有三部分组成:A.B.C

​ A:Header,{“type”:“JWT”,“alg”:“HS256”} 固定

​ B:playload,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息

​ C: 签证,A和B加上秘钥 加密而成,只要秘钥不丢失,可以认为是安全的。

​ jwt 验证,主要就是验证C部分 是否合法。

这三部分分别是;

  • Header(头)
{
	'type':'JwT',
	'alg':'HS256'
}
  • Payload(载荷)
{
	"sub":'1234567890',
	"name":'john',
	"admin":true
}
  • Signature(签名,对前两个信息的再次加密,用.拼接起来)
var encodedString = base64UrlEncode(header)+"."+base64UrlEncode(payload);

var signature = HMACSHA256(encodedString,'secret');

pom.xml

 <!--jwt依赖-->
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
    </dependency>
<!--高于1.8版本的jdk需要加入以下依赖-->
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>

测试案例一

package com.jihu;

import io.jsonwebtoken.*;
import org.junit.Test;

import java.util.Date;
import java.util.UUID;


public class JwtTest {
    private long time = 1000 * 60 * 60 *24; //一天的有效期
    private String signature = "admin";

    @Test
    public void jwt(){
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtToken = jwtBuilder
                //header
                .setHeaderParam("type","JWT")
                .setHeaderParam("alg","HS256")
                //payload
                .claim("username","tom")
                .claim("role","admin")
                .setSubject("admin-test")  //自己定义的
                .setExpiration(new Date(System.currentTimeMillis()+time)) //设置过期时间
                .setId(UUID.randomUUID().toString())
                //signature
                .signWith(SignatureAlgorithm.HS256,signature)
                .compact();  //compact()是用来拼接.的
        System.out.println(jwtToken);

    }

    
    @Test
    public  void parse(){
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ";
        JwtParser jwtParser = Jwts.parser();
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        System.out.println(claims.get("username"));
        System.out.println(claims.get("role"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());  //签名
        System.out.println(claims.getExpiration());
    }

}

测试结果

生成的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ

解密的过程    
tom
admin
4e1a3f79-05e5-4aa3-8d84-1cffb98320a8
admin-test
Wed Apr 13 16:43:23 CST 2022

测试案例二

package com.jihu.utils;

import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

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

public class JWTUtils {

    private static final String jwtToken = "123456Mszlu!@#$$";

    public static String createToken(Long userId){
        Map<String,Object> claims = new HashMap<>();
        claims.put("userId",userId);
        JwtBuilder jwtBuilder = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
                .setClaims(claims) // body数据,要唯一,自行设置
                .setIssuedAt(new Date()) // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
        String token = jwtBuilder.compact(); //compact()是用来拼接.的
        return token;
    }

    public static Map<String, Object> checkToken(String token){
        try {
            Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
            return (Map<String, Object>) parse.getBody();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;

    }

    //测验一下
    public static void main(String[] args) {
        String token = JWTUtils.createToken(100L);
        System.out.println(token);
        Map<String, Object> map = JWTUtils.checkToken(token);
        System.out.println(map.get("userId"));
    }
}

测试结果为

eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTA2NDMyMDgsInVzZXJJZCI6MTAwLCJpYXQiOjE2NDk3NTQxNzV9.JpDXT6b-cQCfCB1GRzMupKJ77U_AHWd7r7kjg7YMlVM

100
posted @ 2022-04-12 17:07  爲誰心殇  阅读(562)  评论(0编辑  收藏  举报
>