//package com.inkasso.adapter.util;
//
//import com.inkasso.adapter.bean.AbstractUser;
//import com.inkasso.adapter.enums.ClientTypeEnum;
//import com.inkasso.adapter.exception.ServiceException;
//import com.inkasso.adapter.exception.enums.KafubaoExceptionEnum;
//import com.nimbusds.jose.JOSEException;
//import com.nimbusds.jose.JWSAlgorithm;
//import com.nimbusds.jose.JWSHeader;
//import com.nimbusds.jose.crypto.RSASSASigner;
//import com.nimbusds.jose.crypto.RSASSAVerifier;
//import com.nimbusds.jose.jwk.RSAKey;
//import com.nimbusds.jose.jwk.gen.RSAKeyGenerator;
//import com.nimbusds.jwt.JWTClaimsSet;
//import com.nimbusds.jwt.SignedJWT;
//
//import java.text.ParseException;
//import java.util.Date;
//
///**
// * @author 张超
// * @date 2021/11/8
// */
//public class JwtRS256Util {
//
//  /**
//   * 过期时间5秒
//   */
//  private static final long EXPIRE_TIME = 1000 * 5;
//  private static RSAKey rsaKey;
//  private static RSAKey publicRsaKey;
//
//  static {
//    /**
//     * 生成公钥，公钥是提供出去，让使用者校验token的签名
//     */
//    try {
//      rsaKey = new RSAKeyGenerator(2048).generate();
//      publicRsaKey = rsaKey.toPublicJWK();
//    } catch (JOSEException e) {
//      e.printStackTrace();
//    }
//  }
//
//
//  public static String buildToken(ClientTypeEnum clientTypeEnum, AbstractUser abstractUser) {
//    try {
//      /**
//       * 1. 生成秘钥,秘钥是token的签名方持有，不可对外泄漏
//       */
//      RSASSASigner rsassaSigner = new RSASSASigner(rsaKey);
//
//      /**
//       * 2. 建立payload 载体
//       */
//      JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
//          .subject("doi")
//          .issuer("https://www.kafubao.top")
//          .expirationTime(new Date(System.currentTimeMillis() + EXPIRE_TIME))
//          .claim("userId", abstractUser.getId())
//          .claim("username", abstractUser.getUsername())
//          .claim("clientType", clientTypeEnum.getCode())
//          .build();
//      /**
//       * 3. 建立签名
//       */
//      SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet);
//      signedJWT.sign(rsassaSigner);
//      /**
//       * 4. 生成token
//       */
//      String token = signedJWT.serialize();
//      return token;
//    } catch (JOSEException e) {
//      e.printStackTrace();
//    }
//    return null;
//  }
//
//
//  /**
//   * 校验token
//   *
//   * @param token
//   * @return
//   */
//  public static boolean vaildToken(String token) {
//    try {
//      SignedJWT jwt = SignedJWT.parse(token);
//      //添加私密钥匙 进行解密
//      RSASSAVerifier rsassaVerifier = new RSASSAVerifier(publicRsaKey);
//      //校验是否有效
//      if (!jwt.verify(rsassaVerifier)) {
//        throw new ServiceException(401, KafubaoExceptionEnum.ACCESS_ERROR);
//      }
//
//      //校验超时
////      Date expirationTime = jwt.getJWTClaimsSet().getExpirationTime();
////      if (new Date().after(expirationTime)) {
////        throw ResultException.of(-2, "Token 已过期");
////      }
//
//      //获取载体中的数据
////      JWTClaimsSet set = jwt.getJWTClaimsSet();
//
//      return true;
//    } catch (JOSEException e) {
//      e.printStackTrace();
//    } catch (ParseException e) {
//      e.printStackTrace();
//    }
//    return false;
//  }
//
//
//  /**
//   * 创建加密key
//   */
//  public static RSAKey getKey() throws JOSEException {
//    RSAKeyGenerator rsaKeyGenerator = new RSAKeyGenerator(2048);
//    RSAKey rsaJWK = rsaKeyGenerator.generate();
//    return rsaJWK;
//  }
//
//}
