Token无感刷新

43 阅读1分钟

核心思想

1、请求拦截器 请求拦截器中将access_token存储在请求头的Authorization中

2、响应拦截器 拦截请求中第一个401的请求并进行处理,调用刷新token的接口,然后携带新的token再次对返回401的请求发起请求

```// 刷新token的方法

// promise
let promise;

export async function refreshToken() {
    if(promise){
        return promise
    }
    promise = new Promise (async (resolve) =>{
        // 刷新token
        const resp - await request.get('/refresh_token',{
            headers:{
                    Authorization:`Bearer ${getRefresh()}`
            },
            __isRefreshToken:true,
        })
            resolve(resp.code === 0)
    })
    promise.finally( () =>{
        promise = null;
    })
    return promise;
}

export const isRefleshRequest = (params) => {
return !!params.__isRefreshToken
}

```const ins = axios.create({
    baseURL:'http://localhost:9527',
    headers:{
        Authorization:`Bearer ${getToken()}`
    }
)

ins.interceptors.response.use(async (res)=>{
    
    // 未授权且为不是刷新token的接口报的401
    if(res.data.code === 401 && !isRefreshRequest(res.config)){
        const isSuccess = await refreshToken();
       if(isSuccess){
        console.log('重新登陆');
        res.config.headers.Authorization = `Beara ${getToken()}`
        const resp = await ins.request(res.config)
        return resp
    
        }else{
        // 无权限
           console.log('跳转到登陆');
          return res.data
     }
    }
    return res.data
})