Добрый день, пытаюсь доделать авторизацию. Есть сама api логина и если не получается, пытаемся получить рефреш токен по старому. Используя интерсепторы всё нафиг зависает потому что используется опять таки та же обработка 401 ошибки. А если токен совсем не валидный, то 401 вернется и для неё. Я не могу понять как лучше обработать именно refresh-token адрес, если там 401 ошибка. Неделю не могу правильно решить вопрос. Подскажите советом?
То есть надо как-то вернуть ошибку для рефреш токена запроса, если там 401.
import axios from "../../../axios/index.js"
import store from "../../../../store/store.js"
// Token Refresh
let isAlreadyFetchingAccessToken = false
let subscribers = []
let tokenIsValidAndFethed = false;
function onAccessTokenFetched(access_token) {
localStorage.setItem("accessToken", access_token);
subscribers = subscribers.filter(callback => callback(access_token))
}
function addSubscriber(callback) {
subscribers.push(callback)
}
export default {
init() {
axios.interceptors.response.use(function (response) {
return response
}, function (error) {
// const { config, response: { status } } = error
const { config, response } = error;
const originalRequest = config;
// if (status === 401) {
if (response && response.status === 401) {
if (!isAlreadyFetchingAccessToken) {
isAlreadyFetchingAccessToken = true
store.dispatch("auth/fetchAccessToken")
.then((access_token) => {
isAlreadyFetchingAccessToken = false
onAccessTokenFetched(access_token.data.access_token)
})
}
const retryOriginalRequest = new Promise((resolve) => {
addSubscriber(access_token => {
originalRequest.headers.Authorization = 'Bearer ' + access_token;
resolve(axios(originalRequest))
})
});
return retryOriginalRequest;
}
return Promise.reject(error)
})
},
login(email, pwd) {
return axios.post("/api/auth/login", {email: email, password: pwd}, {
headers: { Authorization: "Bearer " + localStorage.getItem("accessToken") ? localStorage.getItem("accessToken") : ""}
})
},
registerUser(name, email, pwd) {
return axios.post("/api/auth/register", {displayName: name, email: email, password: pwd})
},
refreshToken() {
return axios.post("/api/auth/refresh-token", {}, {
headers: { Authorization: "Bearer " + localStorage.getItem("accessToken") ? localStorage.getItem("accessToken") : ""}
})
}
}