package com.test.jwt;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.util.Base64;
import java.util.Date;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import org.junit.Test;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtHelper {
//Token过期时间
private final static int expiresSecond = 172800000;
/*
* 把秘钥转成base64格式
*/
@Test
public static String base64for(String keyText) throws UnsupportedEncodingException {
final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final byte[] keyByte = keyText.getBytes("UTF-8"); // base64Secret.getBytes("UTF-8");
// 编码
final String encodedKey = encoder.encodeToString(keyByte);
//System.out.println("加密后秘钥 " + encodedKey);
// 解base64码
//System.out.println("解密后秘钥 " + new String(decoder.decode(encodedKey), "UTF-8"));
return encodedKey;
}
// 根据秘钥,解密jwt加密内容,转成实体Claim,就可以从Claim中取出内容。Claims实际上是个Map
public static Claims parseJWT(String jsonWebToken, String encodedKey) {
try {
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(encodedKey))
.parseClaimsJws(jsonWebToken).getBody();
return claims;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/*
*根据秘钥以及设置的内容,建立 jwt字符串
*/
public static String createJWT(String sub, String name, String orgnization,String role[],
String scope[], String iat,String encodedKey) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
// 生成签名密钥
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(encodedKey);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
// 设置要添加的参数"alg": "HS256",
JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256")
.claim("sub", sub)
.claim("name", name)
.claim("orgnization", orgnization)
.claim("role", role)
.claim("scope", scope)
.claim("iat", iat)
.signWith(signatureAlgorithm, signingKey);
// 添加Token过期时间
if (expiresSecond >= 0) {
long expMillis = nowMillis + expiresSecond;
Date exp = new Date(expMillis);
builder.setExpiration(exp).setNotBefore(now);
}
// 生成JWT字符串
return builder.compact();
}
public static void main(String[] args) throws UnsupportedEncodingException {
String myKey =base64for("abc");
String[] role= {"user","contributor","admin"};
String[] scope= {"mine","orgnization","platform"};
String iat="1516239022";
String jwt = createJWT("9123657", "张三", "XX信息中心", role,scope,iat,myKey);
System.out.println("jwt加密后的 " + jwt);
String jwtString = jwt;
Claims cla = parseJWT(jwtString, myKey);//Claims实际上是个Map
//下面是取出来的内容
System.out.println(cla.get("sub"));
System.out.println(cla.get("name"));
System.out.println(cla.get("orgnization"));
System.out.println(cla.get("role"));
System.out.println(cla.get("scope"));
System.out.println(cla.get("iat"));
}
}
写个一个jwt的demo ,然而和https://jwt.io/上的效果不太一样,先忙别的了,对jwt了解还是不深