package com.onekeycall.videotablet.dto; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * 双Token认证令牌对(AccessToken + RefreshToken) * 设计要点: * 1. 访问令牌短期有效(30分钟),刷新令牌长期有效(7天) * 2. 绑定设备ID防止跨设备滥用[1](@ref) * 3. 精确控制双Token过期时间 */ @Data public class TokenPair { // 访问令牌(用于API请求认证) private String access_token; // 刷新令牌(用于获取新AccessToken) private String refresh_token; // AccessToken过期时间戳(毫秒) private long access_expires; // RefreshToken过期时间戳(毫秒) private long refresh_expires; // 关联设备指纹(防御中间人攻击)[1](@ref) private String device_id; /** * 全参数构造器(安全增强版) * * @param access_token JWT格式访问令牌 * @param refresh_token JWT格式刷新令牌 * @param accessExpireMs AccessToken有效期(毫秒) * @param refreshExpireMs RefreshToken有效期(毫秒) * @param device_id 客户端设备指纹 */ public TokenPair(String access_token, String refresh_token, long accessExpireMs, long refreshExpireMs, String device_id) { this.access_token = access_token; this.refresh_token = refresh_token; this.access_expires = System.currentTimeMillis() + accessExpireMs; this.refresh_expires = System.currentTimeMillis() + refreshExpireMs; this.device_id = device_id; } /** * 快速创建方法(推荐) * * @param accessToken 访问令牌 * @param refreshToken 刷新令牌 * @param deviceId 设备指纹 * @return 初始化过期时间的TokenPair */ public static TokenPair create(String accessToken, String refreshToken, String deviceId) { return new TokenPair( accessToken, refreshToken, 30 * 60 * 1000, // 30分钟有效期 7 * 24 * 60 * 60 * 1000, // 7天有效期 deviceId ); } /** * 检查AccessToken是否过期 * * @return true=已过期,false=有效 */ public boolean isAccessExpired() { return System.currentTimeMillis() > access_expires; } /** * 检查RefreshToken是否过期 * * @return true=已过期,false=有效 */ public boolean isRefreshExpired() { return System.currentTimeMillis() > refresh_expires; } /** * 安全刷新令牌(生成新TokenPair) * * @param newAccessToken 新访问令牌 * @param newRefreshToken 新刷新令牌 * @return 更新后的TokenPair(保留原设备ID) */ public TokenPair refresh(String newAccessToken, String newRefreshToken) { return new TokenPair( newAccessToken, newRefreshToken, this.access_expires - System.currentTimeMillis(), // 剩余时间延续 this.refresh_expires - System.currentTimeMillis(), this.device_id // 保持设备一致性 ); } public Map toMap() { Map map = new HashMap<>(); map.put("access_token", access_token); map.put("refresh_token", refresh_token); map.put("access_expires", String.valueOf(access_expires)); map.put("refresh_expires", String.valueOf(refresh_expires)); map.put("device_id", device_id); return map; } }