尽管 Access-Control-Allow-Origin 设置为 express ,但请求标头字段 Authorization

Posted

技术标签:

【中文标题】尽管 Access-Control-Allow-Origin 设置为 express ,但请求标头字段 Authorization【英文标题】:Request header field Authorization despite Access-Control-Allow-Origin being set in express 【发布时间】:2019-02-17 00:10:42 【问题描述】:

我使用 Vue-cli 制作了一个 Vue.js 应用程序,并希望从后端使用受限 api。

为了避免 CORS 问题在我的应用程序的 server.js 中,我设置了这个:

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Credentials", "true");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");

  next();
);

但是,当我使用 Vue.js 组件的授权标头发出请求时:

 axios.get('http://127.0.0.1:3000/api/article', headerConfig)
        .then( res => this.article = res.data)
         .catch(error => console.log(error))            
    

我还是明白了:

Failed to load http://127.0.0.1:3000/api/article: Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.

感谢您帮助解决此问题。

【问题讨论】:

检查这个enable-cors.org/server_expressjs.html。在您的“Access-Control-Allow-Headers”标题中还有一个Access-Control-Allow-Headers 正常吗? 抱歉,不知道您所说的“正常”是什么意思,我将此headers: Authorization: this.token, crossdomain: true 作为请求 axios'headerConfig 发送。 我在谈论app.use(),检查这一行:res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); 你发送Access-Control-Allow-Headers 作为Access-Control-Allow-Headers 中的标题 那应该是什么?我刚刚从 SO 的回复中复制了它以解决 CORS 问题。 您尝试过enable-cors.org/server_expressjs.html 中的内容吗? 【参考方案1】:

您必须明确允许“授权”标头用于跨域请求,并提到 Access-Control-Allow-Headers 标头:

res.header("Access-Control-Allow-Headers", "X-Requested-With, Authorization");

顺便说一句,由于they are "simple" headers,您已经包含在其中的大多数标头实际上不需要提及 CORS - 有dedicated list。

它仅与您明确发送的标头有关。 假设 originaccess-control-request-headers 由浏览器生成以进行预检 - 除非您没有明确发送它们,否则您也不需要为 Access-Control-Allow-Headers 列出它们作为响应。

【讨论】:

以上是关于尽管 Access-Control-Allow-Origin 设置为 express ,但请求标头字段 Authorization的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot跨域

SpringBoot跨域

SpringBoot跨域

如何通过CORS传递cookie?

node.js创建简单服务测试请求数据

利用Filter解决跨域请求的问题