package com.vincent.rsf.server.common.utils;
|
|
import com.alibaba.fastjson.JSON;
|
import com.vincent.rsf.common.utils.Utils;
|
import com.vincent.rsf.framework.common.Cools;
|
import com.vincent.rsf.server.common.constant.Constants;
|
import com.vincent.rsf.server.common.security.JwtSubject;
|
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.SignatureAlgorithm;
|
import io.jsonwebtoken.io.Decoders;
|
import io.jsonwebtoken.io.Encoders;
|
import io.jsonwebtoken.security.Keys;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.security.Key;
|
import java.util.Date;
|
|
/**
|
* JWT工具类
|
*
|
* @author vincent
|
* @since 2018-01-21 16:30:59
|
*/
|
public class JwtUtil {
|
|
/**
|
* 获取请求中的access_token
|
*
|
* @param request HttpServletRequest
|
* @return String
|
*/
|
public static String getAccessToken(HttpServletRequest request) {
|
String access_token = request.getHeader(Constants.TOKEN_HEADER_NAME);
|
if (!Cools.isEmpty(access_token)) {
|
if (access_token.startsWith(Constants.TOKEN_TYPE)) {
|
access_token = Utils.removePrefix(access_token, Constants.TOKEN_TYPE).trim();
|
}
|
} else {
|
access_token = request.getParameter(Constants.TOKEN_PARAM_NAME);
|
}
|
return access_token;
|
}
|
|
|
/**
|
* 生成token
|
*
|
* @param subject 载体
|
* @param expire 过期时间
|
* @param base64EncodedKey base64编码的Key
|
* @return token
|
*/
|
public static String buildToken(JwtSubject subject, Long expire, String base64EncodedKey) {
|
return buildToken(JSON.toJSONString(subject), expire, decodeKey(base64EncodedKey));
|
}
|
|
/**
|
* 生成token
|
*
|
* @param subject 载体
|
* @param expire 过期时间
|
* @param key 密钥
|
* @return token
|
*/
|
public static String buildToken(String subject, Long expire, Key key) {
|
Date expireDate = new Date(new Date().getTime() + 1000 * expire);
|
return Jwts.builder()
|
.setSubject(subject)
|
.setExpiration(expireDate)
|
.setIssuedAt(new Date())
|
.signWith(key)
|
.compact();
|
}
|
|
/**
|
* 解析token
|
*
|
* @param token token
|
* @param base64EncodedKey base64编码的Key
|
* @return Claims
|
*/
|
public static Claims parseToken(String token, String base64EncodedKey) {
|
return parseToken(token, decodeKey(base64EncodedKey));
|
}
|
|
/**
|
* 解析token
|
*
|
* @param token token
|
* @param key 密钥
|
* @return Claims
|
*/
|
public static Claims parseToken(String token, Key key) {
|
return Jwts.parserBuilder()
|
.setSigningKey(key)
|
.build()
|
.parseClaimsJws(token)
|
.getBody();
|
}
|
|
/**
|
* 获取JwtSubject
|
*
|
* @param claims Claims
|
* @return JwtSubject
|
*/
|
public static JwtSubject getJwtSubject(Claims claims) {
|
return JSONUtil.parseObject(claims.getSubject(), JwtSubject.class);
|
}
|
|
/**
|
* 生成Key
|
*
|
* @return Key
|
*/
|
public static Key randomKey() {
|
return Keys.secretKeyFor(SignatureAlgorithm.HS256);
|
}
|
|
/**
|
* base64编码key
|
*
|
* @return String
|
*/
|
public static String encodeKey(Key key) {
|
return Encoders.BASE64.encode(key.getEncoded());
|
}
|
|
/**
|
* base64编码Key
|
*
|
* @param base64EncodedKey base64编码的key
|
* @return Key
|
*/
|
public static Key decodeKey(String base64EncodedKey) {
|
if (Cools.isEmpty(base64EncodedKey)) {
|
return null;
|
}
|
return Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64EncodedKey));
|
}
|
|
}
|