JwtUtil.java 3.05 KB
package com.taover.bazhuayun.analysis.web.permission;

import java.io.IOException;
import java.security.Key;
import java.util.Date;

import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletException;
import javax.xml.bind.DatatypeConverter;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

 

/**
 *  Reserved claims(保留),它的含义就像是编程语言的保留字一样,属于JWT标准里面规定的一些claim。JWT标准里面定好的claim有:

 iss(Issuser):代表这个JWT的签发主体;
 sub(Subject):代表这个JWT的主体,即它的所有人;
 aud(Audience):代表这个JWT的接收对象;
 exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;
 nbf(Not Before):是一个时间戳,代表这个JWT生效的开始时间,意味着在这个时间之前验证JWT是会失败的;
 iat(Issued at):是一个时间戳,代表这个JWT的签发时间;
 jti(JWT ID):是JWT的唯一标识。
 * @param req
 * @param res
 * @param chain
 * @throws IOException
 * @throws ServletException
 */
public class JwtUtil {
	public static String TOKEN_PREFFIX = "Bearer==";
	public static int TOKEN_START_INDEX = TOKEN_PREFFIX.length();
	
	private static Audience audience = new Audience();
	private static JwtParser jwtParser;
	private static JwtBuilder jwtBuilder;
		
	static {
		//生成签名密钥
        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(audience.getBase64Secret());
        
        //初始化jwtParser
		jwtParser = Jwts.parser().setSigningKey(apiKeySecretBytes);
		
		//初始化jwtBuilder
		Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
		jwtBuilder = Jwts.builder()
				.setHeaderParam("typ", "JWT")
				.setIssuer(audience.getName())
                .setAudience(audience.getClientId())
                .signWith(SignatureAlgorithm.HS256, signingKey);
	}
	
    /**
     * 解析jwt
     */
    public static BzyClaims parseJWT(String token) {
        Claims claims = jwtParser.parseClaimsJws(token).getBody();
        Long userid = Long.valueOf(claims.get("userid", Object.class).toString());
        Long tenantId = Long.valueOf(claims.get("tenant", Object.class).toString());
        return new BzyClaims(claims,tenantId,userid);
    }

    /**
     * 构建jwt
     */
    public static String createJWT(String mobile, Long userId, Long tenantId) {
        //添加构成JWT的参数
    	jwtBuilder.claim("tenant", tenantId.toString())
                .claim("username", mobile)
                .claim("userid", userId.toString());
        //添加Token过期时间
        if (audience.getExpiresSecond() >= 0) {
        	long nowMillis = System.currentTimeMillis();
            Date now = new Date(nowMillis);
            Date exp = new Date(nowMillis + audience.getExpiresSecond()*1000);
            jwtBuilder.setExpiration(exp).setNotBefore(now);
        }
        //生成JWT
        return jwtBuilder.compact();
    }
     
}