如何实现无感刷新token?

在前端开发中,实现无感刷新token通常涉及以下几个步骤:

  1. 设置拦截器

    使用前端框架(如Axios、Fetch API等)时,你可以设置一个请求拦截器。这个拦截器会在每个请求被发送之前执行。在拦截器中,你可以检查token的有效性和过期时间。

  2. 检查Token有效性

    在请求拦截器中,检查当前存储的token是否过期或即将过期。这通常涉及解析token中的过期时间(如果token是JWT类型的话)并与当前时间进行比较。

  3. 自动刷新Token

    如果检测到token过期或即将过期,可以自动发起一个请求到后端服务来刷新token。这个请求通常需要使用之前保存的refresh token或者其他认证信息。

  4. 替换Token并重新发送原始请求

    一旦从后端服务获得新的token,更新本地存储的token信息,并用新的token替换原始请求头中的旧token。然后重新发送原始请求。

  5. 处理刷新失败的情况

    如果刷新token的请求失败,可能需要将用户重定向到登录页面或执行其他适当的错误处理逻辑。

  6. 设置定时器或监听事件以提前刷新

    为了避免在每次请求时都检查token,你也可以设置一个定时器或者监听某些事件(比如用户重新变得活跃时),以便在token过期前的某个时间点自动刷新它。

以下是一个简化的示例流程(以Axios和JWT为例):

axios.interceptors.request.use(config => {
    const token = localStorage.getItem('token');
    if (token) {
        // 检查token是否过期(假设你的JWT包含过期时间信息)
        const decoded = jwt_decode(token);
        if (decoded.exp * 1000 < Date.now()) {
            // Token已过期,需要刷新
            return axios.post('/api/refresh', { refreshToken: localStorage.getItem('refreshToken') })
                .then(response => {
                    localStorage.setItem('token', response.data.token);
                    localStorage.setItem('refreshToken', response.data.refreshToken);
                    // 使用新token更新请求头
                    config.headers.Authorization = 'Bearer ' + response.data.token;
                    return config;
                })
                .catch(error => {
                    // 处理刷新失败的情况,例如重定向到登录页面
                    window.location.href = '/login';
                });
        } else {
            // Token未过期,正常使用
            config.headers.Authorization = 'Bearer ' + token;
            return config;
        }
    } else {
        // 没有Token,可能需要重定向到登录页面或其他处理
        window.location.href = '/login';
    }
}, error => {
    return Promise.reject(error);
});

注意:这个示例仅用于说明目的,并可能需要根据你的具体应用场景进行调整。务必确保你的后端API支持刷新token的机制,并且前端和后端在token和refresh token的处理上保持一致。

posted @ 2025-01-04 06:20  王铁柱6  阅读(176)  评论(0)    收藏  举报