405 方法不允许,尽管 CORS

Sim*_*mon 7 http xmlhttprequest http-headers cors angular-httpclient

我正在尝试使用 Angular 开发前端应用程序。由于我向HTTP POST 和 GET 请求添加了授权标头,因此我收到了405 Method Not Allowed,尽管我似乎允许服务器端的所有内容。

在此处输入图片说明

我的浏览器 Chrome 中的调试器说它要求Access-Control-Request-Method: POSTAccess-Control-Request-Headers: authorization,我的后端允许同时,access-control-allow-methods: GET, POSTaccess-control-allow-headers: authorization,以及access-control-allow-credentials: true

我不明白我在这里缺少什么。服务器是一个 node.js express 服务器,标头设置如下:

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.setHeader('Access-Control-Allow-Headers', 'authorization');
Run Code Online (Sandbox Code Playgroud)

前端代码(Angular 5)如下所示:

this.http.request('post', apiUrl, {
  headers: new HttpHeaders().set('Authorization', 'Bearer abc'),
}).subscribe(response => {
  // some code
});
Run Code Online (Sandbox Code Playgroud)

哪里this.http是角的实例HttpClient

我的前端应用程序是从我的本地主机域“ http://frontend.localhost/app ”提供的,我的后端服务器位于“ http://backend.localhost ”。

我的问题是,我是否缺少一些必须在后端设置的标头?我需要在我的前端应用程序中设置一些选项吗?

Sim*_*mon 9

我发现我的问题与 CORS没有直接关系。我的后端目前只是一个 GraphQL 服务器,它允许 GET 和 POST 请求。

如果我在客户端添加其他标头,浏览器将通过预检OPTIONS请求检查GraphQL 服务器所在 URL 的 CORS。这会导致405 Method Not Allowed 错误由 GraphQL 服务器产生,而不是由 Express 或浏览器产生。

  • 西蒙,在旁注中,“Access-Control-Allow-Credentials: true”不允许与“Access-Control-Allow-Origin: *”一起使用。如果您要传递凭据(授权标头和/或 cookie),则必须在 ACAO 标头中指定特定来源 - 最容易实现为`Access-Control-Allow-Origin: {value of Origin request header}`。 (3认同)