JWT 入门
什么是JWT
JWT:Java WEB Token 是一种标准,用于在各方之间安全地传输信息作为 JSON 对象。此信息可以被验证和信任,因为它是经过数字签名的,JWT 可以使用秘密(使用HMAC算法)或使用RSA或ECDSA 的公钥/私钥对进行签名。
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"));
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭