token生成规则:
JWT包含三部分:Header(头部),Payload(负载),Signature(签名)
//Signature生成
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
//通过header中声明的加密方式进行加盐secret组合加密
var signature = HMACSHA256(encodedString, secret);
//token生成,用.连接三部分组成一个完整的字符串
var token=base64UrlEncode(header)+'.'+base64UrlEncode(payload)+'.'+signature;
token生成工具依赖包:com.auth0:java-jwt:3.9.0
基于生成规则,token生成
private static String manualToken(String secret) throws JsonProcessingException {
ObjectMapper mapper=new ObjectMapper();
//生成header
Map<String,String> header=new HashMap<>();
header.put("alg","HS256");
header.put("typ","JWT");
byte[] headerBytes = mapper.writeValueAsBytes(header);
String headerPart = new String(Base64.encodeBase64(headerBytes,false ,true), StandardCharsets.US_ASCII);
//生成playload,存放传递信息
Map<String,String> mapPlayload=new HashMap<>();
mapPlayload.put("appId","appId");
mapPlayload.put("phone","phone");
byte[] payloadBytes = OBJECT_MAPPER.writeValueAsBytes(mapPlayload);
String payloadPart = new String(Base64.encodeBase64(payloadBytes,false ,true), StandardCharsets.UTF_8);
//生成signature
String content = headerPart + "." + payloadPart;
Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, secret.getBytes(StandardCharsets.UTF_8));
byte[] output = mac.doFinal(content.getBytes(StandardCharsets.UTF_8));
String signaturePart = new String(Base64.encodeBase64(output, false ,true), StandardCharsets.UTF_8);
String token=headerPart+"."+payloadPart+"."+signaturePart;
return token;
}
依赖包,token生成代码:
private static String getToken(String secret){
String appId="appId";
String phone="phone";
String token= JWT.create()
.withClaim("appId",appId)
.withClaim("phone",phone)
.sign(Algorithm.HMAC256(secret));
return token;
}
token解析代码:
private static void getInfo(String token,String secret){
HashMap<String,String> map=new HashMap<>();
DecodedJWT jwt=JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
String appId=jwt.getClaim("appId").asString();
String phone=jwt.getClaim("phone").asString();
log.info("appId is {}",appId);
log.info("phone is {}",phone);
}