Created
November 20, 2020 23:14
-
-
Save ebnersilva/f2c9c1c0ca38c2d33acc80b7f1a863a2 to your computer and use it in GitHub Desktop.
Axios Refreshtoken example
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 { DevSettings } from 'react-native'; | |
import { SERVER_URL } from '@env'; | |
import AsyncStorage from '@react-native-community/async-storage'; | |
import axios from 'axios'; | |
const api = axios.create({ | |
baseURL: SERVER_URL, | |
}); | |
api.interceptors.request.use(async config => { | |
try { | |
const token = await AsyncStorage.getItem('@Gorja:token'); | |
if (token) { | |
config.headers.Authorization = `Bearer ${token}`; | |
} | |
return config; | |
} catch (err) { | |
return err; | |
} | |
}); | |
let isRefreshing = false; | |
api.interceptors.response.use( | |
response => { | |
return response; | |
}, | |
async error => { | |
if (!error.response) return Promise.reject(error); | |
if (!error.response.status) return Promise.reject(error); | |
// Capturamos o status e as configurações do erro | |
const { status } = error.response; | |
const { config } = error; | |
// Dados da requisição original | |
const originalRequest = config; | |
// Se a requisição retornou com status 401 | |
if (status === 401) { | |
if (!isRefreshing) { | |
// Marcamos que estamos tentando atualizar o token | |
isRefreshing = true; | |
// Capturamos o refreshToken atual armazenado no dispositivo | |
const refreshToken = await AsyncStorage.getItem('@Gorja:refreshToken'); | |
if (!refreshToken) return Promise.reject(error); | |
// Capturamos o retorno da API com os dados atualizados de token e refreshToken | |
try { | |
const newAuth = await api.post('/session_refresh', { refreshToken }); | |
// Se por algum motivo não existir alguns dos valores abaixo, retornamos o erro | |
if (!newAuth.data.token || !newAuth.data.refreshToken) { | |
return Promise.reject(error); | |
} | |
// Desestruturamos os valores | |
const { | |
token: newToken, | |
refreshToken: newRefreshToken, | |
} = newAuth.data; | |
// Gravamos no async storage o token e o refresh token para futuras requisições | |
await AsyncStorage.setItem('@Gorja:token', newToken); | |
await AsyncStorage.setItem('@Gorja:refreshToken', newRefreshToken); | |
// Retentativa de requisição | |
originalRequest.headers.Authorization = `Bearer ${newToken}`; | |
// Marcamos que a rotina de atualização do token e refreshToken finalizou | |
isRefreshing = false; | |
} catch (err) { | |
await AsyncStorage.setItem('@Gorja:token', ''); | |
await AsyncStorage.setItem('@Gorja:refreshToken', ''); | |
DevSettings.reload(); | |
} | |
// Tentamos novamente a requisição que havia sido bloqueada com os dados de autorização atualizados | |
const retryRequest = await axios(originalRequest); | |
// Retornamos essa requisição | |
return retryRequest; | |
} | |
} | |
// Caso seja outro erro, retornamos para o fluxo continuar normalmente | |
return Promise.reject(error); | |
}, | |
); | |
export default api; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment