WIP Implement token refreshing
This commit is contained in:
@@ -0,0 +1,77 @@
|
|||||||
|
// See https://www.techynovice.com/setting-up-JWT-token-refresh-mechanism-with-axios/
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
const authenticatedClient = axios.create({
|
||||||
|
headers: {
|
||||||
|
'Authentication': 'Bearer ' + sessionStorage.getItem('token')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
authenticatedClient.interceptors.response.use(
|
||||||
|
response => response,
|
||||||
|
error => {
|
||||||
|
const errorResponse = error.response;
|
||||||
|
if (isTokenExpiredError(errorResponse)) {
|
||||||
|
return resetTokenAndReattemptRequest(error)
|
||||||
|
}
|
||||||
|
return Promise.reject(error)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
function isTokenExpiredError (errorResponse) {
|
||||||
|
if (errorResponse.config.code !== 401) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return errorResponse.message.match(/expired/);
|
||||||
|
}
|
||||||
|
|
||||||
|
let isAlreadyFetchingAccessToken = false;
|
||||||
|
let subscribers = [];
|
||||||
|
|
||||||
|
async function resetTokenAndReattemptRequest (error) {
|
||||||
|
try {
|
||||||
|
const { response: errorResponse } = error;
|
||||||
|
const refreshToken = await getRefreshToken();
|
||||||
|
if (!refreshToken) {
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
const retryOriginalRequest = new Promise(resolve => {
|
||||||
|
addSubscriber(authToken => {
|
||||||
|
errorResponse.config.headers.Authorization = 'Bearer ' + authToken;
|
||||||
|
resolve(axios(errorResponse.config));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!isAlreadyFetchingAccessToken) {
|
||||||
|
isAlreadyFetchingAccessToken = true;
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: `<YOUR TOKEN REFREH ENDPOINT>`,
|
||||||
|
data: {
|
||||||
|
refresh_token: refreshToken
|
||||||
|
}
|
||||||
|
}).then(response => {
|
||||||
|
if (!response.data) {
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
const newToken = response.data.refresh_token;
|
||||||
|
saveRefreshToken(newToken);
|
||||||
|
isAlreadyFetchingAccessToken = false;
|
||||||
|
onAccessTokenFetched(newToken);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return retryOriginalRequest;
|
||||||
|
} catch (err) {
|
||||||
|
return Promise.reject(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onAccessTokenFetched(access_token) {
|
||||||
|
subscribers.forEach(callback => callback(access_token));
|
||||||
|
subscribers = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function addSubscriber(callback) {
|
||||||
|
subscribers.push(callback);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user