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