# 添加到 .env 文件
ACCESS_TOKEN_EXPIRES_IN=15m
REFRESH_TOKEN_EXPIRES_IN=7d
REFRESH_TOKEN_SECRET=your-refresh-token-secret-change-thisnpx prisma migrate dev --name add_refresh_token_system登录成功后,回调URL现在包含:
?access_token=eyJ...&refresh_token=eyJ...&expires_in=15m&success=true
POST /api/accounts/refresh
Content-Type: application/json
{
"refresh_token": "eyJ..."
}POST /api/accounts/logout
Authorization: Bearer <access_token>POST /api/accounts/logout-all
Authorization: Bearer <access_token>class TokenManager {
setTokens(accessToken, refreshToken) {
localStorage.setItem('access_token', accessToken);
localStorage.setItem('refresh_token', refreshToken);
}
async refreshToken() {
const refreshToken = localStorage.getItem('refresh_token');
const response = await fetch('/api/accounts/refresh', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ refresh_token: refreshToken })
});
const data = await response.json();
if (data.success) {
localStorage.setItem('access_token', data.data.access_token);
return data.data.access_token;
}
throw new Error(data.message);
}
}// 检查响应头中的新token
const newToken = response.headers.get('X-New-Access-Token');
if (newToken) {
localStorage.setItem('access_token', newToken);
}
// 401错误时自动刷新
if (response.status === 401) {
await tokenManager.refreshToken();
// 重试请求
}- ✅ 短期Access Token(15分钟)
- ✅ 长期Refresh Token(7天)
- ✅ Token版本控制
- ✅ 设备级登出
- ✅ 全局登出
- ✅ 自动刷新机制
- ✅ 向后兼容
- 更新环境变量
- 运行数据库迁移
- 更新前端OAuth回调处理
- 实现Token刷新逻辑
- 测试登出功能
详细文档请参考:REFRESH_TOKEN_API.md