Axios interceptors and asynchronous login

前端 未结 2 1433
甜味超标
甜味超标 2020-12-02 07:23

I\'m implementing token authentication in my web app. My access token expires every N minutes and than a refresh token is used to log in and get a

2条回答
  •  抹茶落季
    2020-12-02 08:18

    Just use another promise :D

    axios.interceptors.response.use(undefined, function (err) {
        return new Promise(function (resolve, reject) {
            if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
                serviceRefreshLogin(
                    getRefreshToken(),
                    success => { 
                            setTokens(success.access_token, success.refresh_token) 
                            err.config.__isRetryRequest = true
                            err.config.headers.Authorization = 'Bearer ' + getAccessToken();
                            axios(err.config).then(resolve, reject);
                    },
                    error => { 
                        console.log('Refresh login error: ', error);
                        reject(error); 
                    }
                );
            }
            throw err;
        });
    });
    

    If your enviroment doesn't suport promises use polyfill, for example https://github.com/stefanpenner/es6-promise

    But, it may be better to rewrite getRefreshToken to return promise and then make code simpler

    axios.interceptors.response.use(undefined, function (err) {
    
            if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
                return getRefreshToken()
                .then(function (success) {
                    setTokens(success.access_token, success.refresh_token) ;                   
                    err.config.__isRetryRequest = true;
                    err.config.headers.Authorization = 'Bearer ' + getAccessToken();
                    return axios(err.config);
                })
                .catch(function (error) {
                    console.log('Refresh login error: ', error);
                    throw error;
                });
            }
            throw err;
    });
    

    Demo https://plnkr.co/edit/0ZLpc8jgKI18w4c0f905?p=preview

提交回复
热议问题