網(wǎng)上jwt例子基本上使用這兩種工具(忘記參考的哪里了)
第一種
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
代碼:
public class JavaJWTUtil {
// 過期時(shí)間5分鐘
private static final long EXPIRE_TIME = 5 * 60 * 1000;
/**
* 生成簽名,5min后過期
*
* @param username 用戶名
* @param secret 用戶的密碼
* @return 加密的token
*/
public static String sign(String username, String secret) {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
// 附帶username信息
return JWT.create()
.withClaim("username", username)
.withClaim("as", "a")
.withExpiresAt(date)
.sign(algorithm);
}
public static boolean verify(String token, String username, String secret) {
try {
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", username)
.build();
DecodedJWT jwt = verifier.verify(token);
System.out.println(token);
System.out.println(jwt.getHeader());
System.out.println(jwt.getPayload());
System.out.println(jwt.getSignature());
System.out.println(jwt.getToken());
return true;
} catch (Exception exception) {
exception.printStackTrace();
return false;
}
}
public static void main(String[] args) {
String zhangsan = JavaJWTUtil.sign("zhangsan", "123");
JavaJWTUtil.verify(zhangsan, "zhangsan", "123");
}
}
第二種
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
代碼
public class JJWTUtil {
public static String createJWT(String id, String subject, long ttlMillis) throws Exception {
//指定簽名的時(shí)候使用的簽名算法,也就是header那部分,jjwt已經(jīng)將這部分內(nèi)容封裝好了。
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//生成JWT的時(shí)間
long nowMillis = System.currentTimeMillis();
//創(chuàng)建payload的私有聲明(根據(jù)特定的業(yè)務(wù)需要添加,如果要拿這個(gè)做驗(yàn)證,一般是需要和jwt的接收方提前溝通好驗(yàn)證方式的)
Date now = new Date(nowMillis);
Map<String, Object> claims = new HashMap<>();
claims.put("uid", "DSSFAWDWADAS...");
claims.put("user_name", "admin");
claims.put("nick_name", "DASDA121");
//生成簽名的時(shí)候使用的秘鑰secret,這個(gè)方法本地封裝了的,一般可以從本地配置文件中讀取,切記這個(gè)秘鑰不能外露哦。
// 它就是你服務(wù)端的私鑰,在任何場(chǎng)景都不應(yīng)該流露出去。一旦客戶端得知這個(gè)secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。
SecretKey key = generalKey();
//下面就是在為payload添加各種標(biāo)準(zhǔn)聲明和私有聲明了
JwtBuilder builder = Jwts.builder() //這里其實(shí)就是new一個(gè)JwtBuilder,設(shè)置jwt的body
.setClaims(claims) //如果有私有聲明,一定要先設(shè)置這個(gè)自己創(chuàng)建的私有的聲明,這個(gè)是給builder的claim賦值,一旦寫在標(biāo)準(zhǔn)的聲明賦值之后,就是覆蓋了那些標(biāo)準(zhǔn)的聲明的
.setId(id) //設(shè)置jti(JWT ID):是JWT的唯一標(biāo)識(shí),根據(jù)業(yè)務(wù)需要,這個(gè)可以設(shè)置為一個(gè)不重復(fù)的值,主要用來作為一次性token,從而回避重放攻擊。
.setIssuedAt(now) //iat: jwt的簽發(fā)時(shí)間
.setSubject("hehehhe") //sub(Subject):代表這個(gè)JWT的主體,即它的所有人,這個(gè)是一個(gè)json格式的字符串,可以存放什么userid,roldid之類的,作為什么用戶的唯一標(biāo)志。
.signWith(signatureAlgorithm, key);//設(shè)置簽名使用的簽名算法和簽名使用的秘鑰
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp); //設(shè)置過期時(shí)間
}
return builder.compact(); //就開始?jí)嚎s為xxxxxxxxxxxxxx.xxxxxxxxxxxxxxx.xxxxxxxxxxxxx這樣的jwt
}
public static SecretKey generalKey() {
String stringKey = "21341234243134";//本地配置文件中加密的密文7786df7fc3a34e26a61c034d5ec8245d
byte[] encodedKey = Base64.decodeBase64(stringKey);//本地的密碼解碼[B@152f6e2
// 根據(jù)給定的字節(jié)數(shù)組使用AES加密算法構(gòu)造一個(gè)密鑰,使用 encodedKey中的始于且包含 0 到前 leng 個(gè)字節(jié)這是當(dāng)然是所有
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
public static Claims parseJWT(String jwt) throws Exception {
try {
SecretKey key = generalKey(); //簽名秘鑰,和生成的簽名的秘鑰一模一樣
Claims claims = Jwts.parser() //得到DefaultJwtParser
.setSigningKey(key) //設(shè)置簽名的秘鑰
.parseClaimsJws(jwt).getBody();//設(shè)置需要解析的jwt
return claims;
} catch (SignatureException | MalformedJwtException e) {
throw e;
} catch (ExpiredJwtException e) {
// jwt 已經(jīng)過期,在設(shè)置jwt的時(shí)候如果設(shè)置了過期時(shí)間,這里會(huì)自動(dòng)判斷jwt是否已經(jīng)過期,如果過期則會(huì)拋出這個(gè)異常,我們可以抓住這個(gè)異常并作相關(guān)處理。
}
return null;
}
public static void main(String[] args) throws Exception {
String jwt = JJWTUtil.createJWT("", "", new Date().getTime());
System.out.println(jwt);
System.out.println(JJWTUtil.parseJWT(jwt));
}
}