jwt生产token和校验token
需要注意的是:如果过期时间你总是以当前时间+3000(约定的过期时间),那么程序每次启动时这个时间是不同的,所以每次生成的token也是不一样的,如果想生成一直不变的token,请把起始时间写死,如1970-1-1,下面的例子起始时间是2022年,但是向后token的有效期最多有60年(以十年为单位测试的)
1 @Slf4j 2 public class JWTUtil { 3 /** 4 * 生产token 5 * @param api_key 约定 6 * @param api_secret 约定 7 * @param time token过期时间,毫秒 8 */ 9 public static String generateToken(String api_key, String api_secret, Long time){ 10 String token = null; 11 try { 12 //设置token过期时间 :如果想每次生成的token一样,这里的起始时间就写死 13 //Date date = new Date(System.currentTimeMillis()+time); 14 Date date = new Date(DateUtil.strToDate("2022-11-11").getTime()+time); 15 //设置加密算法 16 Algorithm algorithm = Algorithm.HMAC256(SALT); 17 //设置头部 18 /** 19 * { 20 * “type”: “JWT”, 声明类型,这里是jwt 21 * “alg”: “HS256” 声明加密的算法 通常直接使用 HMAC SHA256 22 * } 23 */ 24 Map<String ,Object> headers = new HashMap<>(); 25 headers.put(HEADS_TYPE_KEY,HEADS_TYPE_VALUE); 26 headers.put(HEADS_ALGORITHM_KEY,HEADS_ALGORITHM_VALUE); 27 //生产token 28 token = JWT.create() 29 .withClaim(API_KEY,api_key) 30 .withClaim(API_SECRET,api_secret) 31 .withExpiresAt(date) 32 .sign(algorithm); 33 } catch (Exception e) { 34 log.info(e.getMessage()); 35 } 36 return token; } 37 /** 38 * 校验token 39 * @param token 需要校验的token 40 */ 41 public static boolean verification(String token){ 42 try { 43 //根据盐获取加解密算法 44 Algorithm algorithm = Algorithm.HMAC256(SALT); 45 //获取解密对象 46 JWTVerifier jwtVerifier = JWT.require(algorithm).build(); 47 //解密 48 DecodedJWT decodedJWT = jwtVerifier.verify(token); 49 //获取客户信息 50 log.info("api_key:"+decodedJWT.getClaim(API_KEY).asString()); 51 log.info("api_key:"+decodedJWT.getClaim(API_SECRET).asString()); 52 return true; 53 }catch (Exception e){ 54 log.info(e.getMessage()); 55 return false; 56 } 57 } 58 //测试 59 public static void main(String[] args) throws Exception { 60 //过期时间60年 61 String token = JWTUtil.generateToken("ZhuanAn", "zhuanan2022", 60*12*31*24*60*60 * 1000L); 62 log.info("================成功获取token==================="+token); 63 boolean result = JWTUtil.verification("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcGlfa2V5IjoiWmh1YW5BbiIsImV4cCI6MTcwMDIzNjgwMCwiYXBpX3NlY3JldCI6InpodWFuYW4yMDIyIn0.Ze82ZNQdsKCS_FY1kZiRWs-Qx8plc2lOQW7itILQUhs"); 64 log.info("================token校验结果============"+result); 65 } 66 }
jwt中的一些常量封装
public class JWTConstant { private JWTConstant(){} public static final String API_KEY = "api_key"; public static final String API_SECRET = "api_secret"; public static final String HEADS_TYPE_KEY = "type"; public static final String HEADS_TYPE_VALUE = "jwt"; public static final String HEADS_ALGORITHM_KEY = "alg"; public static final String HEADS_ALGORITHM_VALUE = "HS256"; public static final String AUTH_HEAD = "Authentication"; public static final String SALT = "AWER@#$@"; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通