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

com.luues.security.jwt.JwtUtils Maven / Gradle / Ivy

package com.luues.security.jwt;

import cn.luues.tool.json.JsonUtils;
import com.luues.security.core.entity.Payload;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.DefaultJwsHeader;
import lombok.SneakyThrows;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class JwtUtils {

    private static final String JWT_PAYLOAD_USER_KEY = "user";
    private static final String JWT_PAYLOAD_ISSUER = "Mr-Wu";

    /**
     * 公钥加密jwt
     *
     * @param payload 载荷中的数据
     * @param privateKey     私钥
     * @param expire         过期时间
     * @param timeUnit       时间单位
     * @return JWT
     */
    @SneakyThrows
    public static String generateJwtExpire(Payload payload, PrivateKey privateKey, int expire, TimeUnit timeUnit) {
        Date date;
        switch (timeUnit){
            case DAYS:
                date = Date.from(LocalDateTime.now().plusDays(expire).atZone(ZoneId.systemDefault()).toInstant());
                break;
            case HOURS:
                date = Date.from(LocalDateTime.now().plusHours(expire).atZone(ZoneId.systemDefault()).toInstant());
                break;
            case MINUTES:
                date = Date.from(LocalDateTime.now().plusMinutes(expire).atZone(ZoneId.systemDefault()).toInstant());
                break;
            case SECONDS:
                date = Date.from(LocalDateTime.now().plusSeconds(expire).atZone(ZoneId.systemDefault()).toInstant());
                break;
            default:
                throw new Exception("暂只支持days,hours,minutes,seconds");
        }
        return Jwts.builder()
                .setId(payload.getPrincipal().getId())
                .setSubject(payload.getPrincipal().getUsername())
                .setHeader((Map) new DefaultJwsHeader().setType("jwt"))
                .setIssuer(JWT_PAYLOAD_ISSUER)
                .setIssuedAt(new Date())
                .claim(JWT_PAYLOAD_USER_KEY, JsonUtils.toJson(payload))
                .setExpiration(date)
                .signWith(SignatureAlgorithm.RS256, privateKey)
                .compact();
    }

    /**
     * 公钥解析jwt
     *
     * @param jwt       用户请求的令牌
     * @param publicKey 公钥
     * @return
     */
    private static Jws parserJwt(String jwt, PublicKey publicKey) {
        return Jwts.parser()
                .setSigningKey(publicKey)
                .parseClaimsJws(jwt);
    }

    /**
     * 获取jwt中用户信息
     *
     * @param jwt       用户请求的令牌
     * @param publicKey 公钥
     * @return 用户信息
     */
    public static Payload getInfoFormJwt(String jwt, PublicKey publicKey) {
        Jws claimsJws = parserJwt(jwt, publicKey);
        Claims body = claimsJws.getBody();
        Payload payload = JsonUtils.parse(JsonUtils.toJson(body.get(JWT_PAYLOAD_USER_KEY)), Payload.class);
        return payload;
    }

    /**
     * 通过jwt获取解密后的payload
     * @param jwt
     * @return Payload
     */
    public static Payload getPayload(String jwt){
        String payload_ = jwt.substring(jwt.indexOf(".") + 1, jwt.lastIndexOf("."));
        payload_ = new String(Base64.getDecoder().decode(payload_));
        Map map = JsonUtils.parse(payload_, Map.class);
        Payload payload = JsonUtils.parse(JsonUtils.toJson(map.get(JWT_PAYLOAD_USER_KEY)), Payload.class);
        return payload;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy