什么是JWT

JWT:Java WEB Token 是一种标准,用于在各方之间安全地传输信息作为 JSON 对象。此信息可以被验证和信任,因为它是经过数字签名的,JWT 可以使用秘密(使用HMAC算法)或使用RSAECDSA 的公钥/私钥对进行签名。

JWT又三部分组成,以.分隔:1.请求头、2.载荷,3.签名(由请求头和有效载荷以及秘钥组成)

上面三部分由Base64编码转成:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

使用JWT

package com.blog.qh;

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

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

public class JwtTest {

    public static void main(String[] args) {

//        设置token的过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,43200); // 12个小时

//        生成JWT
        String token = JWT.create()
                .withClaim("userId", 1)
                .withClaim("userName", "qh")
                .withExpiresAt(instance.getTime())
//               设置签名指定算法
                .sign(Algorithm.HMAC256("!@32errfsfwer--"));
        System.out.println("token:" + token);


//        解析token:
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!@32errfsfwer--")).build();
        DecodedJWT verify = jwtVerifier.verify(token);
//      获取token中的信息
        System.out.println("请求头" + verify.getHeader());
        System.out.println("载荷-userId:" + verify.getClaim("userId").asInt());
        System.out.println("载荷-userName:" + verify.getClaim("userName").asString());
        System.out.println("过期时间:" + verify.getExpiresAt());


//        常见异常:
//        SignatureVerificationException //签名不一致异常
//        okenExpiredException //令牌过期异常
//        AlgorithmMismatchException //算法不匹配异常
//        InvalidClaimException //失效的payload异常(传给客户端后,token被改动,验证不一致)

    }
}

封装JWT工具类

package com.blog.qh.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.Calendar;
import java.util.Map;
import java.util.function.BiConsumer;

public class JwtUtils {

    private static final String SING = "!@#$qwer";
    /**
     * 生成一个Token
     * @param payload 需要传入的信息:载荷
     * @return
     */
    public static String getToken(Map<String,String> payload) {
//       过期时间
        Calendar date = Calendar.getInstance();
        date.add(Calendar.SECOND,43200);

        JWTCreator.Builder builder = JWT.create();
        payload.forEach((k, v) -> builder.withClaim(k,v));
        builder.withExpiresAt(date.getTime());
        return builder.sign(Algorithm.HMAC256(SING));
    }

    /**
     * 用于验证或者获取payload值
     * @param token
     */
    public static DecodedJWT verify(String token) {
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

}

测试:

    @Test
    public void testJwt() {
        HashMap<String, String> map = new HashMap<>();
        map.put("userid","1");
        map.put("username","qh");
        String token = JwtUtils.getToken(map);
        System.out.println(token);

        DecodedJWT verify = JwtUtils.verify(token);
        System.out.println("载荷" + verify.getClaim("userid"));
    }
文章目录