Last active
September 24, 2021 18:28
-
-
Save Ronnasayd/74c359a21a3bd74c752f8c2afd7cf1ec to your computer and use it in GitHub Desktop.
Exemplo de como fazer o refresh token com axios
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import axios from "axios"; | |
import { getBaseURL } from "./config"; | |
export const client = axios.create({ | |
baseURL: getBaseURL() | |
}); | |
// for multiple requests | |
let isRefreshing = false; | |
let failedQueue = []; | |
const processQueue = (error, token = null) => { | |
failedQueue.forEach(prom => { | |
if (error) { | |
prom.reject(error); | |
} else { | |
prom.resolve(token); | |
} | |
}); | |
failedQueue = []; | |
}; | |
client.interceptors.request.use( | |
async config => { | |
const access = localStorage.getItem("AccessToken"); | |
if (access) { | |
config.headers = { | |
Authorization: `JWT ${access}` | |
}; | |
} | |
config.baseURL = await getBaseURL(); | |
return config; | |
}, | |
error => Promise.reject(error) | |
); | |
client.interceptors.response.use( | |
function(response) { | |
return response; | |
}, | |
function(error) { | |
const originalRequest = error.config; | |
if (error.response.status === 401 && originalRequest.url === "/refresh/") { | |
window.location.href = "/login/"; | |
return Promise.reject(error); | |
} | |
if (error.response.status === 401 && !originalRequest._retry) { | |
if (isRefreshing) { | |
return new Promise(function(resolve, reject) { | |
failedQueue.push({ resolve, reject }); | |
}) | |
.then(access => { | |
originalRequest.headers["Authorization"] = "JWT " + access; | |
return client(originalRequest); | |
}) | |
.catch(err => { | |
return Promise.reject(err); | |
}); | |
} | |
originalRequest._retry = true; | |
isRefreshing = true; | |
const refresh = window.localStorage.getItem("RefreshToken"); | |
const access = window.localStorage.getItem("AccessToken"); | |
return new Promise(function(resolve, reject) { | |
client | |
.post("/refresh/", { | |
refresh, | |
access | |
}) | |
.then(({ data }) => { | |
window.localStorage.setItem("AccessToken", data.access); | |
window.localStorage.setItem("RefreshToken", data.refresh); | |
client.defaults.headers.common["Authorization"] = | |
"JWT " + data.access; | |
originalRequest.headers["Authorization"] = "JWT " + data.access; | |
processQueue(null, data.access); | |
resolve(client(originalRequest)); | |
}) | |
.catch(err => { | |
processQueue(err, null); | |
reject(err); | |
}) | |
.then(() => { | |
isRefreshing = false; | |
}); | |
}); | |
} | |
return Promise.reject(error); | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment