首先流程圖來一波!!!!
JWT多系統登入鑒權、授權驗證--可用 具體實作代碼工具類JwtTokenUtils如下:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtTokenUtils {
//簽發者
private static final String ISS = "SUPERMAN";
//過期時間15分鐘
private static final long EXPIRATION_15_MIN = 900L;
//過期時間1小時
private static final long EXPIRATION_ONE_HOUR = 3600L;
//過期時間1天
private static final long EXPIRATION_ONE_DAY = 604800L;
/**
* 生成Token
* @param userInfoMap
* @param secretKey 用于簽名的私鑰
* @param expireTimeType
* @author yq
* @return String
*/
public static String createToken(Map<String,Object> userInfoMap, String secretKey , int expireTimeType){
//add by yangqing --生成Token 20200730 start
//過期時間 0:小時 1:分鐘 2:天
long expireTime = 0;
if (expireTimeType == 0){
expireTime = EXPIRATION_ONE_HOUR;
} else if(expireTimeType == 1){
expireTime = EXPIRATION_15_MIN;
}else {
expireTime = EXPIRATION_ONE_DAY;
}
//Jwt頭
Map<String,Object> header = new HashMap<String, Object>();
header.put("typ", "JWT");
header.put("alg", "HS256");
Map<String,Object> claims = new HashMap<String, Object>();
//自定義有效載荷部分
claims.put("userId", userInfoMap.get("userId"));
claims.put("userName", userInfoMap.get("userName"));
return Jwts.builder()
//發證人 超級經理人
.setIssuer(ISS)
//Jwt頭
.setHeader(header)
//有效載荷
.setClaims(claims)
//設定簽發時間
.setIssuedAt(new Date())
//設定過期時間
.setExpiration(new Date(System.currentTimeMillis() + expireTime * 1000))
//使用HS256算法簽名,PRIVATE_KEY為簽名密鑰
.signWith(SignatureAlgorithm.HS256,secretKey)
.compact();
//add by yangqing --生成Token 20200730 end
}
/**
* 驗證Token,傳回資料隻有userId和auserName的Map對象
* @param token
* @param secretKey 用于簽名的私鑰
* @author yq
* @return
*/
public static Map<String,Object> checkToken(String token, String secretKey){
//add by yangqing --驗證Token,傳回資料隻有userId和auserName的Map對象 20200730 start
Map<String,Object> userInfoMap = new HashMap<String, Object>();
//解析token後,從有效載荷取出值
Claims claims = getClaimsFromToken(token, secretKey);
if(null == claims){
return userInfoMap;
}
Object userId = getClaimsFromToken(token, secretKey).get("userId");
Object userName = getClaimsFromToken(token, secretKey).get("userName");
//封裝為Map對象
userInfoMap.put("userId", userId);
userInfoMap.put("userName", userName);
return userInfoMap;
//add by yangqing --驗證Token,傳回資料隻有userId和auserName的Map對象 20200730 end
}
/**
* 擷取有效載荷
* @param token
* @param secretKey 用于簽名的私鑰
* @author yq
* @return
*/
public static Claims getClaimsFromToken(String token, String secretKey){
//add by yangqing --擷取有效載荷 20200730 start
Claims claims = null;
try {
claims = Jwts.parser()
//設定解密私鑰
.setSigningKey(secretKey)
//傳入Token
.parseClaimsJws(token)
//擷取載荷類
.getBody();
}catch (ExpiredJwtException e){
return null;
}
return claims;
//add by yangqing --擷取有效載荷 20200730 end
}
}
謝謝大家的支援,希望對大佬們有幫助!