【发布时间】:2018-05-01 21:04:45
【问题描述】:
我需要在每个端点上为匹配 /api/v1/support/* 路径的 POST 请求启用 CORS。
我正在向/api/v1/support/graphql 发出 POST 请求,凭据为 true,但预检请求(OPTIONS 请求)返回 401。我不确定自己做错了什么。
这是我的配置(请注意,我在下面的示例中更改了虚拟域的实际域):
const corsOptions = {
origin: /mydomain\.com$/,
credentials: true,
maxAge: 3600
};
app.options('/api/v1/support/*', cors(corsOptions));
app.post('/api/v1/support/*', cors(corsOptions));
// graphQLRouter is an instance of express.Router()
app.use('/api/v1/support/graphql', [ fowardIP, validateTokenInCookie ], graphQLRouter);
【问题讨论】:
-
服务器上的 request.OPTIONS 根据规范合法,即 Access-Control-Allow-Methods', '.....,OPTIONS' 所以除了浏览器发出 'preflight' 请求,您可能还需要调整服务器以符合规范。请参阅 access_control 标头下的 'ALLOW_ORIGIN' 、 'ALLOW_METHODS' 、 'ALLOW_HEADERS'
-
浏览器不会在 CORS 预检 OPTIONS 请求中发送凭据。显然,在您的应用程序代码中的某处,您有
/api/v1/support/graphql路由所需的身份验证,这对于 POST 请求很好,因为如果您的前端代码将凭据作为该 POST 的一部分发送,那将按预期工作。但这对于 OPTIONS 请求并不好。这需要在不发送任何凭据的情况下工作 - 无需服务器要求身份验证。