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);
}
}