110 lines
3.6 KiB
Java
110 lines
3.6 KiB
Java
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<String, Object> toMap() {
|
||
Map<String, Object> 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;
|
||
}
|
||
}
|