
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