change package name,fixes error
This commit is contained in:
91
src/main/java/com/onekeycall/videotablet/dto/TokenPair.java
Normal file
91
src/main/java/com/onekeycall/videotablet/dto/TokenPair.java
Normal file
@@ -0,0 +1,91 @@
|
||||
package com.onekeycall.videotablet.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 双Token认证令牌对(AccessToken + RefreshToken)
|
||||
* 设计要点:
|
||||
* 1. 访问令牌短期有效(30分钟),刷新令牌长期有效(7天)
|
||||
* 2. 绑定设备ID防止跨设备滥用[1](@ref)
|
||||
* 3. 精确控制双Token过期时间
|
||||
*/
|
||||
@Data
|
||||
public class TokenPair {
|
||||
// 访问令牌(用于API请求认证)
|
||||
private String accessToken;
|
||||
// 刷新令牌(用于获取新AccessToken)
|
||||
private String refreshToken;
|
||||
// AccessToken过期时间戳(毫秒)
|
||||
private long accessExpiresAt;
|
||||
// RefreshToken过期时间戳(毫秒)
|
||||
private long refreshExpiresAt;
|
||||
// 关联设备指纹(防御中间人攻击)[1](@ref)
|
||||
private String deviceId;
|
||||
|
||||
/**
|
||||
* 全参数构造器(安全增强版)
|
||||
* @param accessToken JWT格式访问令牌
|
||||
* @param refreshToken JWT格式刷新令牌
|
||||
* @param accessExpireMs AccessToken有效期(毫秒)
|
||||
* @param refreshExpireMs RefreshToken有效期(毫秒)
|
||||
* @param deviceId 客户端设备指纹
|
||||
*/
|
||||
public TokenPair(String accessToken, String refreshToken,
|
||||
long accessExpireMs, long refreshExpireMs,
|
||||
String deviceId) {
|
||||
this.accessToken = accessToken;
|
||||
this.refreshToken = refreshToken;
|
||||
this.accessExpiresAt = System.currentTimeMillis() + accessExpireMs;
|
||||
this.refreshExpiresAt = System.currentTimeMillis() + refreshExpireMs;
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 快速创建方法(推荐)
|
||||
* @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() > accessExpiresAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查RefreshToken是否过期
|
||||
* @return true=已过期,false=有效
|
||||
*/
|
||||
public boolean isRefreshExpired() {
|
||||
return System.currentTimeMillis() > refreshExpiresAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全刷新令牌(生成新TokenPair)
|
||||
* @param newAccessToken 新访问令牌
|
||||
* @param newRefreshToken 新刷新令牌
|
||||
* @return 更新后的TokenPair(保留原设备ID)
|
||||
*/
|
||||
public TokenPair refresh(String newAccessToken, String newRefreshToken) {
|
||||
return new TokenPair(
|
||||
newAccessToken,
|
||||
newRefreshToken,
|
||||
this.accessExpiresAt - System.currentTimeMillis(), // 剩余时间延续
|
||||
this.refreshExpiresAt - System.currentTimeMillis(),
|
||||
this.deviceId // 保持设备一致性
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user