Eu tenho um aplicativo react / redux que busca um token de um servidor API. Após a autenticação do usuário, gostaria de fazer com que todas as solicitações axios tivessem esse token como um cabeçalho de autorização sem ter que anexá-lo manualmente a cada solicitação na ação. Eu sou bastante novo no react / redux e não tenho certeza sobre a melhor abordagem e não estou encontrando nenhum hit de qualidade no google.
Aqui está minha configuração redux:
// actions.js
import axios from 'axios';
export function loginUser(props) {
const url = `https://api.mydomain.com/login/`;
const { email, password } = props;
const request = axios.post(url, { email, password });
return {
type: LOGIN_USER,
payload: request
};
}
export function fetchPages() {
/* here is where I'd like the header to be attached automatically if the user
has logged in */
const request = axios.get(PAGES_URL);
return {
type: FETCH_PAGES,
payload: request
};
}
// reducers.js
const initialState = {
isAuthenticated: false,
token: null
};
export default (state = initialState, action) => {
switch(action.type) {
case LOGIN_USER:
// here is where I believe I should be attaching the header to all axios requests.
return {
token: action.payload.data.key,
isAuthenticated: true
};
case LOGOUT_USER:
// i would remove the header from all axios requests here.
return initialState;
default:
return state;
}
}
Meu token está armazenado na loja redux em state.session.token
.
Estou um pouco perdido em como proceder. Eu tentei fazer uma instância de axios em um arquivo no meu diretório raiz e atualizar / importar em vez de de node_modules, mas não é anexar o cabeçalho quando o estado muda. Quaisquer comentários / ideias são muito apreciados, obrigado.
Respostas:
Existem várias maneiras de fazer isso. Aqui, expliquei as duas abordagens mais comuns.
1. Você pode usar interceptores axios para interceptar quaisquer solicitações e adicionar cabeçalhos de autorização.
2. A partir da documentação de
axios
você pode ver que há um mecanismo disponível que permite definir o cabeçalho padrão que será enviado com cada solicitação que você fizer.Então, no seu caso:
Se desejar, você pode criar uma função autoexecutável que definirá o próprio cabeçalho de autorização quando o token estiver presente na loja.
Agora você não precisa mais anexar o token manualmente a cada solicitação. Você pode colocar a função acima no arquivo que tem a garantia de ser executado todas as vezes ( por exemplo: Arquivo que contém as rotas).
Espero que ajude :)
fonte
axios.defaults.header.common[Auth_Token] = token
tão simples quanto isso.Se você usar "axios": versão "^ 0.17.1", você pode fazer assim:
Crie uma instância de axios:
Em seguida, para qualquer solicitação, o token será selecionado em localStorage e adicionado aos cabeçalhos da solicitação.
Estou usando a mesma instância em todo o aplicativo com este código:
Boa sorte.
fonte
A melhor solução para mim é criar um serviço de cliente que você instancie com seu token e o use para embrulhar
axios
.Nesse cliente, você também pode recuperar o token do localStorage / cookie, conforme desejar.
fonte
Da mesma forma, temos uma função para definir ou excluir o token de chamadas como esta:
Sempre limpamos o token existente na inicialização e, em seguida, estabelecemos o recebido.
fonte
Se você quiser chamar outras rotas de API no futuro e manter seu token na loja, tente usar o middleware redux .
O middleware pode escutar a ação de uma api e despachar solicitações de api por meio de axios de acordo.
Aqui está um exemplo muito básico:
actions / api.js
middleware / api.js
fonte
Às vezes, você obtém um caso em que algumas das solicitações feitas com axios são apontadas para endpoints que não aceitam cabeçalhos de autorização. Assim, a forma alternativa de definir o cabeçalho de autorização apenas no domínio permitido é como no exemplo abaixo. Coloque a seguinte função em qualquer arquivo executado sempre que o aplicativo React for executado, como no arquivo de rotas.
fonte
Tente fazer uma nova instância como eu fiz abaixo
Como usá-lo
fonte
Encontrei algumas pegadinhas ao tentar implementar algo semelhante e, com base nessas respostas, foi isso que eu descobri. Os problemas que eu estava enfrentando eram:
fonte
O objetivo é definir o token nos interceptores para cada solicitação
fonte