All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.yiuman.citrus.security.jwt.JwtUtils Maven / Gradle / Ivy

There is a newer version: 0.15.0
Show newest version
package com.github.yiuman.citrus.security.jwt;

import com.github.yiuman.citrus.security.properties.CitrusProperties;
import com.github.yiuman.citrus.support.cache.InMemoryCache;
import com.github.yiuman.citrus.support.utils.ConvertUtils;
import com.github.yiuman.citrus.support.utils.LambdaUtils;
import com.github.yiuman.citrus.support.utils.SpringUtils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * JWT工具
 *
 * @author yiuman
 * @date 2020/4/6
 */
public final class JwtUtils {

    private JwtUtils() {
    }

    private static final String JWT_CACHE_NAMESPACE = "JWT";

    protected static final Logger log = LoggerFactory.getLogger(JwtUtils.class);

    /**
     * 从缓存里边获取JWT命名空间配置,若没有则使用默认值
     */
    private static InMemoryCache getJwt() {
        CitrusProperties citrusProperties = SpringUtils.getBean(CitrusProperties.class, true);
        return InMemoryCache
                .get(JWT_CACHE_NAMESPACE,
                        LambdaUtils.consumerWrapper(cache -> ConvertUtils.objectToMap(citrusProperties.getJwt()).forEach(cache::save)),
                        true);
    }

    public static JwtToken generateToken(String identity, Map claims) {
        return generateToken(identity, null, claims);
    }

    public static JwtToken generateToken(String identity, Long expireInSeconds, Map claims) {
        claims = Optional.ofNullable(claims).orElse(new HashMap<>(1));
        claims.put(getIdentityKey(), identity);
        expireInSeconds = Optional.ofNullable(expireInSeconds).orElse((Long) getJwt().find(JwtProperties.JwtConstants.Attribute.VALIDATE_IN_SECONDS));
        long expireTimestamp = System.currentTimeMillis() + expireInSeconds * 1000;
        String token = Jwts.builder()
                .setSubject(identity)
                .setClaims(claims)
                .signWith(signKey(), SignatureAlgorithm.HS512)
                .setExpiration(new Date(expireTimestamp))
                .compact();
        return new JwtToken(token, expireTimestamp);
    }

    public static boolean validateToken(String token) {
        try {
            getClaims(token);
            return true;
        } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
            log.info("Invalid JWT signature.");
        } catch (ExpiredJwtException e) {
            log.info("Expired JWT token.");
        } catch (UnsupportedJwtException e) {
            log.info("Unsupported JWT token.");
        } catch (IllegalArgumentException e) {
            log.info("JWT token compact of handler are invalid.");
        }
        return false;
    }

    public static String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader((String) getJwt().find(JwtProperties.JwtConstants.Attribute.HEADER));
        String tokenPrefix = (String) getJwt().find(JwtProperties.JwtConstants.Attribute.PREFIX);
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(tokenPrefix)) {
            return bearerToken.substring(tokenPrefix.length());
        }
        return null;
    }

    public static String getIdentityKey() {
        return (String) getJwt().find(JwtProperties.JwtConstants.Attribute.IDENTITY);
    }

    public static Claims getClaims(String token) {
        JwtParser jwtParser = Jwts.parserBuilder()
                .setSigningKey(signKey())
                .build();
        return jwtParser.parseClaimsJws(token)
                .getBody();
    }

    protected static Key signKey() {
        //对Secret进行Base64编码
        return Keys.hmacShaKeyFor(Decoders.BASE64.decode((String) getJwt().find(JwtProperties.JwtConstants.Attribute.SECRET)));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy