进行预检复杂 CORS 请求时,headers 中应包含哪些内容?

What to include in headers when making preflight complex CORS request?

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

在 server.js 文件中,我有以下代码片段(据我所知可以启用 CORS pre-flight 检查):

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

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

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

front-end 进行以下 axios 调用:

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

在 back-end:

中对此作出回应
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');
...

当我在 back-end 上控制台记录响应 header 时,它包含:

x-session-token 匹配 MySQL

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

但是浏览器响应的 console.log 对于 session-token 为空,这告诉我浏览器正在阻止 CORS return 数据(X-Session-Token 在这个案件)。我在请求或响应中遗漏了什么 header?

我想你错过了你想要发回的暴露的Header。 "x-session-token" ? 也尝试使用 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'
})