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)); 
 | 
    } 
 | 
  
 | 
} 
 |