Skip to content

Instantly share code, notes, and snippets.

@ebnersilva
Created November 20, 2020 23:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ebnersilva/f2c9c1c0ca38c2d33acc80b7f1a863a2 to your computer and use it in GitHub Desktop.
Save ebnersilva/f2c9c1c0ca38c2d33acc80b7f1a863a2 to your computer and use it in GitHub Desktop.
Axios Refreshtoken example
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