"""
滑动Token配置说明

这个文件展示了如何在FastAPI应用中配置滑动过期Token机制
"""

# 在主应用文件中（如 main.py 或 app.py）添加以下配置：

"""
from fastapi import FastAPI
from app.middleware.token_refresh_middleware import TokenRefreshMiddleware

app = FastAPI()

# 添加Token刷新中间件
app.add_middleware(
    TokenRefreshMiddleware,
    exclude_paths=[
        "/auth/login",
        "/auth/captcha", 
        "/auth/refresh",
        "/docs",
        "/openapi.json",
        "/redoc",
        "/favicon.ico",
        "/health"  # 健康检查接口
    ]
)
"""

# 前端JavaScript代码示例：
"""
// 前端处理Token自动刷新的示例代码

class ApiClient {
    constructor() {
        this.baseURL = 'http://localhost:8000';
        this.token = localStorage.getItem('access_token');
    }
    
    async request(url, options = {}) {
        const headers = {
            'Content-Type': 'application/json',
            ...options.headers
        };
        
        if (this.token) {
            headers['Authorization'] = `Bearer ${this.token}`;
        }
        
        const response = await fetch(`${this.baseURL}${url}`, {
            ...options,
            headers
        });
        
        // 检查是否有新的token
        const newToken = response.headers.get('X-New-Token');
        const tokenRefreshed = response.headers.get('X-Token-Refreshed');
        
        if (newToken && tokenRefreshed === 'true') {
            // 更新本地存储的token
            this.token = newToken;
            localStorage.setItem('access_token', newToken);
            console.log('Token已自动刷新');
        }
        
        return response;
    }
    
    // 使用示例
    async getDashboard() {
        const response = await this.request('/system/dashboard');
        const data = await response.json();
        
        if (data.token_refreshed) {
            console.log('服务端提示：Token已刷新');
        }
        
        return data;
    }
}

// 全局API客户端实例
const apiClient = new ApiClient();

// 定期检查token状态（可选）
setInterval(async () => {
    try {
        await apiClient.request('/system/dashboard');
    } catch (error) {
        if (error.status === 401) {
            // Token完全过期，需要重新登录
            window.location.href = '/login';
        }
    }
}, 5 * 60 * 1000); // 每5分钟检查一次
"""

# 配置说明
SLIDING_TOKEN_CONFIG = {
    "description": "滑动过期Token配置",
    "features": [
        "每次API请求时自动检查token是否需要刷新",
        "当token使用时间超过总有效期的一半时自动刷新",
        "新token通过响应头返回给前端",
        "前端自动更新本地存储的token",
        "只要用户保持活跃，token永远不会过期",
        "完全无活动时，token会在设定时间后过期"
    ],
    "config_items": {
        "ADMIN_TOKEN_EXPIRE_MINUTES": {
            "description": "后台管理token有效期（分钟）",
            "default": 10,
            "note": "用户无活动时token的最大有效期"
        },
        "ADMIN_REFRESH_TOKEN_EXPIRE_HOURS": {
            "description": "刷新token有效期（小时）", 
            "default": 24,
            "note": "用于刷新访问token的长期token有效期"
        }
    },
    "response_headers": {
        "X-New-Token": "新的访问token（当token被刷新时）",
        "X-Token-Refreshed": "token刷新标识（值为'true'）"
    },
    "usage_examples": [
        "使用装饰器：@require_auth_with_sliding_expiration",
        "使用中间件：自动处理所有需要认证的请求",
        "手动调用：auth_service.get_current_user(token)"
    ]
}