如何使用axios

时间:2017-05-29 15:05:12

标签: javascript axios

如何通过axios.js发送带有令牌的身份验证标头? 我尝试了一些没有成功的事情,例如:

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

给我这个错误:

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

我设法通过设置全局默认设置让它工作,但我猜这不是单个请求的最佳选择:

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

更新:

科尔的回答帮助我找到了问题所在。我正在使用 django-cors-headers中间件,默认情况下已经处理了授权标头。

但是我能够理解错误信息并修复了我的axios请求代码中的错误,这应该是这样的

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

11 个答案:

答案 0 :(得分:57)

在非简单的http请求中,您的浏览器将首先发送“预检”请求(OPTIONS方法请求),以确定相关网站认为要发送的安全信息(请参阅here关于此的原产地政策规范)。主机可以在预检响应中设置的相关标头之一是Access-Control-Allow-Headers。如果您要发送的任何标题未列在规范列入白名单的标题或服务器的预检响应中,则浏览器将拒绝发送您的请求。

在您的情况下,您尝试发送Authorization标头,该标头不被视为通用安全标头之一。然后,浏览器发送预检请求,询问服务器是否应该发送该标头。服务器要么发送一个空的Access-Control-Allow-Headers标头(这被认为是“不允许任何额外的标头”),要么是在其允许的标头列表中发送一个不包含Authorization的标头。因此,浏览器不会发送您的请求,而是选择通过抛出错误来通知您。

您发现的任何Javascript变通方法都可以让您发送此请求,因为它违反了您的浏览器为了您自己的安全而强制执行的跨源请求策略。

tl; dr - 如果您想发送Authorization标头,最好配置您的服务器以允许它。设置您的服务器,以便在该网址上使用OPTIONS标头响应Access-Control-Allow-Headers: Authorization请求。

答案 1 :(得分:26)

试试这个:

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

答案 2 :(得分:17)

这对我有用:

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

答案 3 :(得分:11)

除了将其添加到每个请求之外,您还可以像这样将其添加为默认配置。

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

答案 4 :(得分:3)

你几乎是正确的,只需这样调整你的代码

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

注意我放置反引号的位置,我添加了' - '在Bearer之后,如果您确定要在服务器端处理

,则可以省略

答案 5 :(得分:3)

而不是调用axios.get函数使用:

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

答案 6 :(得分:2)

您可以尝试一下。

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
    }
  );

答案 7 :(得分:1)

安装cors中间件。我们试图用自己的代码解决它,但是所有尝试都失败了。

这使它起作用:

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

Original link

答案 8 :(得分:1)

为您的请求创建一个新的 axios 实例

  const instance=axios.create({
    baseURL:'www.google.com/'
    headers:{
        'Content-Type':'application/json',
                    'Acess-Control-Allow-Origin':'*',
                    'Authorization':`Bearer ${token}`,
                    'Accept': "application/json"
        }
    })

await instance.get(url,data)

答案 9 :(得分:0)

Derric的页面对描述CORS,预检和GET请求的工作方式非常有帮助,尤其是在您尝试将GET与授权标头一起使用的情况下。 https://www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/#

我无法使用任何Chrome浏览器插件,但是我无法在没有安全性且没有CORS的情况下启动Chrome,因此预检请求不会与GET + Authorization标头一起发送。

在Windows 10上,命令为:

“ C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe” --disable-web-security --disable-gpu --user-data-dir =〜/ chromeTemp < / em>

感谢: https://alfilatov.com/posts/run-chrome-without-cors/

答案 10 :(得分:-1)

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   :您必须将选项和授权添加到setHeader()

此更改已解决我的问题,请尝试一下!