Como enviar cabeçalho de autorização com axios


96

Como posso enviar um cabeçalho de autenticação com um token via axios.js? Tentei algumas coisas sem sucesso, por exemplo:

const header = `Authorization: Bearer ${token}`;
return axios.get(URLConstants.USER_URL, { headers: { header } });

Me dá este erro:

XMLHttpRequest cannot load http://localhost:8000/accounts/user/. Request header field header is not allowed by Access-Control-Allow-Headers in preflight response.

Consegui fazer funcionar definindo o padrão global, mas acho que essa não é a melhor ideia para uma única solicitação:

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

Atualização:

A resposta de Cole me ajudou a encontrar o problema. Estou usando o middleware django-cors-headers que já gerencia o cabeçalho de autorização por padrão.

Mas eu fui capaz de entender a mensagem de erro e corrigi um erro no meu código de solicitação do axios, que deve ser parecido com este

return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });

Respostas:


87

Em solicitações http não simples, seu navegador enviará uma solicitação de "comprovação" (uma solicitação do método OPTIONS) primeiro para determinar o que o site em questão considera informações seguras para enviar (veja aqui as especificações de política de origem cruzada sobre isso). Um dos cabeçalhos relevantes que o host pode definir em uma resposta de comprovação é Access-Control-Allow-Headers. Se algum dos cabeçalhos que você deseja enviar não estiver listado na lista de cabeçalhos da lista de permissões ou na resposta de comprovação do servidor, o navegador se recusará a enviar sua solicitação.

No seu caso, você está tentando enviar um Authorizationcabeçalho, o que não é considerado universalmente seguro para enviar cabeçalhos. O navegador então envia uma solicitação de comprovação para perguntar ao servidor se ele deve enviar esse cabeçalho. O servidor está enviando um Access-Control-Allow-Headerscabeçalho vazio (que significa "não permitir cabeçalhos extras") ou está enviando um cabeçalho que não inclui Authorizationem sua lista de cabeçalhos permitidos. Por causa disso, o navegador não enviará sua solicitação e, em vez disso, opta por notificá-lo emitindo um erro.

Qualquer solução alternativa de Javascript que você encontrar que permita enviar esta solicitação de qualquer maneira deve ser considerada um bug, pois é contra a política de solicitação de origem cruzada que seu navegador está tentando impor para sua própria segurança.

tl; dr - Se você quiser enviarAuthorizationcabeçalhos, é melhor seu servidor estar configurado para permitir isso. Configure seu servidor para que ele responda a umaOPTIONSsolicitação nesse url com umAccess-Control-Allow-Headers: Authorizationcabeçalho.


11
Obrigado, Cole! Sua resposta me ajudou a encontrar o problema. Estou usando o middleware django-cors-headers que já gerencia o cabeçalho de autorização por padrão. Mas eu consegui entender a mensagem de erro e consertei um erro no meu código de solicitação do axios, que deveria ser parecido com este return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });
— foobar

1
De nada! Eu encontro esse tipo de problema com minhas APIs o tempo todo. Estou feliz por ter ajudado você a entender o processo pelo qual ele deve passar.
— Cole Erickson

43

Experimente isto:

axios.get(
    url,
    {headers: {
        "name" : "value"
      }
    }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

1
Portanto, o nome do cabeçalho será 'Access-Control-Allow-Headers' e o valor é o que você deseja.
— Matija Župančić

Então, você quer dizer que eu teria algo como: axios.get (url, {headers: {'Access-Control-Allow-Headers': 'Bearer <my token>'}})? Isso não funciona.
— foobar

11
Eu acredito que deveria ser {'Autorização': 'Portador <meu token>'}
— John Harding

35

Isso tem funcionado para mim:

let webApiUrl = 'example.com/getStuff';
let tokenStr = 'xxyyzz';
axios.get(webApiUrl, { headers: {"Authorization" : `Bearer ${tokenStr}`} });

Há menos detalhes na resposta em comparação com o anterior, mas esta é a resposta que todos procuram quando pesquisam no google.
— Black Mamba

32

Em vez de adicioná-lo a todas as solicitações, você pode apenas adicioná-lo como uma configuração padrão.

axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

como você coloca essa configuração? na raiz (index.js, App.js)? Ou em um arquivo separado?
— ibubi

8

Você está quase correto, apenas ajuste seu código desta forma

const headers = { Authorization: `Bearer ${token}` };
return axios.get(URLConstants.USER_URL, { headers });

observe onde coloco os crases, adicionei '' após o Bearer, você pode omitir se tiver certeza de manipular no lado do servidor


6
Normalmente (por especificação) há um espaço, não um traço ( -), entre o esquema de autenticação e o token. Nunca vi nenhum tipo de servidor exigir um traço como você mostrou, e a maioria, senão todos, enviaria de volta um erro se um deles fosse fornecido.
— Raman

6

Em vez de chamar a função axios.get, use:

axios({ method: 'get', url: 'your URL', headers: { Authorization: `Bearer ${token}` } })

0
res.setHeader('Access-Control-Allow-Headers',
            'Access-Control-Allow-Headers, Origin,OPTIONS,Accept,Authorization, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');

Blockquote: você deve adicionar OPÇÕES e autorização ao setHeader ()

esta mudança corrigiu o meu problema, experimente!


0

Instale o corsmiddleware. Estávamos tentando resolvê-lo com nosso próprio código, mas todas as tentativas falharam terrivelmente.

Isso fez funcionar:

cors = require('cors')
app.use(cors());

Link original


isso é para servidores de nó, não para axios
— Marc Garcia

Os usuários que encontrarem esta pergunta podem achar esta resposta útil. Esta questão pode ser usada para trabalhar com servidores de nó em casos de uso e ser um lembrete de que os cors podem resolver seu problema ou para mover sua verificação de cabeçalho de backend abaixo do código acima. Ajudou a me salvar de tanta frustração, Obrigado campainha.
— DORRITO

0

Você pode tentar isso.

axios.get(
    url,
    {headers: {
            "Access-Control-Allow-Origin" : "*",
            "Content-type": "Application/json",
            "Authorization": `Bearer ${your-token}`
            }   
        }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.