JWT讲解

package com.dalong.learn.singlesignon01.atw;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.Test;

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

public class AwtTest {

    /**
     * 私有秘钥
     */
    public static String SECRET="secret";

    @Test
    public void createTOken(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,1);
        HashMap<String, Object> header = new HashMap<>();
        header.put("header-user","dalong1");
        String token = JWT.create()
                // 设定签署人
                // Issuer 如果设置了这个值,那么验证时可以提供也可以不提供,但是如果提供的是错误的则无法通过验证
                .withIssuer("issuer-dalong")
                // 指定头声明,并同时传递声明的映射。
                // 通过调用getHeaderClaim() 获取,即使无法找到,也会返回
                // 可用来存放公共(模块)信息,不可用于构建验证
                .withHeader(header)
                // 指定自定义声明, 并同时传递名称和值
                // 可以通过调用getClaims()或 getClaim()和传递声明名来获得
                // 可用来存放登陆用户的信息
                // Claim 如果设置了,那么验证时可以提供也可以不提供,但是如果提供的是错误的则无法通过验证
                .withClaim("claim-name", "dalong")
                .withClaim("claim-id", 1)
                .withIssuedAt(new Date())//签发时间
                .withExpiresAt(calendar.getTime())//过期时间,
                .sign(Algorithm.HMAC256(SECRET));//这个就是私有秘钥,构建验证时必须提供
        System.out.println(token);
    }

    @Test
    public void verifyToken(){
        String token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImhlYWRlci11c2VyIjoiZGFsb25nMSJ9.eyJpc3MiOiJpc3N1ZXItZGFsb25nIiwiY2xhaW0taWQiOjEsImV4cCI6MTU4NDk0MzQ0NiwiaWF0IjoxNTg0ODU3MDQ2LCJjbGFpbS1uYW1lIjoiZGFsb25nIn0.oRO4zI4hiucbdaCUYJnRwDjqM1z7Q4bnDjWZa8dj0xE";

        //可以直接解码拿到claim,和issuer,和header
        System.out.println("---------------------------------");
        DecodedJWT decode = JWT.decode(token);
        System.out.println(decode.getIssuer());
        System.out.println(decode.getClaim("claim-id").asInt());
        System.out.println(decode.getHeaderClaim("header-user").as(String.class));
        Map<String, Claim> claims = decode.getClaims();
        System.out.println(claims.toString());
        System.out.println("---------------------------------");

        //构建验证实例,验证主要还是靠秘钥require,其他信息都是公开的,验证的目的就是看过期没有,秘钥对不对
        JWTVerifier verifier  = JWT
                .require(Algorithm.HMAC256(SECRET))//私有秘钥错误,无法通过验证,是必须提供的值
                .withIssuer("issuer-dalong")//和生成token时的值不一样,无法通过验证
                .withClaim("claim-name", "dalong")//和生成token时的值不一样,无法通过验证
                .build();//构建秘钥验证实例
        DecodedJWT verify=null;
        try {
            verify = verifier.verify(token);//验证秘钥
        }catch (JWTVerificationException e){
            System.out.println("token失效");
            return;
        }
        String issuer = verify.getIssuer();
        String user = verify.getHeaderClaim("header-user").as(String.class);//获取头声明
        String name = verify.getClaim("claim-name").as(String.class);//获取自定义声明
        System.out.println(issuer);
        System.out.println(user);
        System.out.println(name);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值