Files
OneKeyCallVideoTablet/src/main/java/com/onekeycall/videotablet/dto/TokenPair.java

110 lines
3.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}