【问题标题】:What to include in headers when making preflight complex CORS request?发出预检复杂 CORS 请求时在标头中包含什么?
【发布时间】:2020-04-07 05:26:58
【问题描述】:

我正在制作的应用程序的前端和节点后端分别托管(跨源)。前端正在调用后端进行登录,其中 x-session-token 被发回。因为这是一个自定义标头,我理解这是一个复杂的请求,因此需要进行飞行前检查。

在 server.js 文件中,我有以下 sn-p(据我所知,它可以启用 CORS 飞行前检查):

const express = require('express');
const cors = require("cors");
const app = express();

const corsOptions = {
  origin: true,
  credentials: true
}

app.options('*', cors(corsOptions));

前端进行如下 axios 调用:

axios.post('/api/user/login', logInObj,
    {withCredentials:true},
    {crossDomain:true},
    {'Access-Control-Request-Headers': 'Content-Type'},
    {'Access-Control-Request-Method': 'post'}
    )
    .then(logInResponse => ...

后端对此有响应:

router.post('/api/user/login', (request, response) => {
...
response.setHeader('Access-Control-Allow-Credentials', true);
response.setHeader('Access-Control-Allow-Headers', 'Content-Type');
response.setHeader('Access-Control-Allow-Method', 'get', 'post', 'options');
response.setHeader('Access-Control-Allow-Origin', request.get('Origin'));
response.setHeader('Access-Control-Max-Age','86400')
response.setHeader('Access-Control-Expose-Headers', 'Access-Control-Allow-Origin');
...

当我在后端控制台记录响应标头时,它包含:

一个 x-session-token 与 MySQL 中的相匹配

Access-Control-Allow-Origin 被列为 http://localhost:3000 而不是通配符 (*)

但是,浏览器中响应的 console.log 中的 session-token 为 null,这告诉我浏览器正在阻止 CORS 返回数据(在本例中为 X-Session-Token)。我在请求或响应标头中缺少什么?

【问题讨论】:

    标签: node.js express cors axios session-cookies


    【解决方案1】:

    我认为您错过了要发回的公开标头。 “x 会话令牌”? 也尝试使用 app.use 而不是 app.options 并让 cors 包处理它,除非它只是特定于这条路线

    app.use(cors({
      credentials: true, 
      exposedHeaders: ['Set-Cookie', 'Content-Length', 'Accept', 'X-Requested-With', 'X-HTTP-Method-Override', 'x-session-token' ],
      methods: ['GET', 'POST', 'OPTIONS', 'HEAD'],
      optionsSuccessStatus: 204,
      origin: 'http://localhost:3000'
    })
    

    【讨论】:

    • 天哪,成功了!克劳迪奥你是圣人!如果您有时间,您介意详细说明使用 app.options 与 app.use 的陷阱吗?
    • app.use before your router 声明将始终在调用路由中间件之前将 cors 中间件应用于所有路由。
    • 感谢@Claudio Viola。您可能知道为什么这只适用于开发环境而不是生产环境吗? (来源改为生产url)
    • 您使用的是 HTTPS 吗?生产有何不同?服务推送到哪里?
    • 感谢@Claudio Viola。生产客户端构建和服务器通过 Heroku 上的 https 单独托管。每个链接都有帮助吗?也许标题需要添加到生产中的公开列表中?
    猜你喜欢
    • 2020-05-06
    • 2012-12-09
    • 2016-03-08
    • 2016-11-25
    • 2015-09-29
    • 2020-02-21
    • 1970-01-01
    • 2017-11-04
    • 2018-10-31
    相关资源
    最近更新 更多