OAuth 中的 CORS:对预检请求的响应未通过访问控制检查

CORS in OAuth: Response to preflight request doesn't pass access control check

所以我正在尝试实施 OAuth 2 流程,而我的 Web 应用程序是提供授权 code/access 令牌的服务器。

将代码发送回 third-party 网站(在本例中为 zapier)时发生 Cors 错误:

XMLHttpRequest cannot load https://zapier.com/dashboard/auth/oauth/return/App505CLIAPI/?code=somecode&state=somestate. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://myurl' is therefore not allowed access.

如果我手动打开一个新标签,粘贴那个 zapier uri,一切都会完美。

似乎是典型的 CORS 问题,但 none 流行的解决方案对我有用:

  1. 添加Access-Control-Allow-Origin:我正在使用这个oauth2orize 库,并向预检发送响应似乎也是 图书馆。所以我不能添加 header.
  2. 使用 cors:已尝试 app.use(cors())app.options('*', cors()),它们应该适用于所有路由,但根本不起作用。

我的 webapp 位于一个 node express 服务器上,在它前面有一个 nginx 代理服务器。

如果您知道问题出在哪里,我们将不胜感激。

错误消息指出的问题不是由 https://myurl/ 的应用程序代码 运行 引起的。相反,只是 https://zapier.com/dashboard/auth/… 似乎不支持 CORS。

具体来说,https://zapier.com/dashboard/auth/… URL 的响应不包括 Access-Control-Allow-Origin 响应 header,因此您的浏览器不会让您的前端 JavaScript代码访问响应。

这似乎是 Zapier 有意为之——他们不打算从浏览器中的前端 AJAX/XHR/Fetch 代码 运行 访问该身份验证端点。相反,我猜它的目的是让您只能从后端代码访问该身份验证端点。或者什么的。

无论如何,您无法解决 Zapier API 端点的响应不包括 Access-Control-Allow-Origin.

的事实

并且只要它不包含 Access-Control-Allow-Origin,您的浏览器就会阻止您的前端代码获取响应——并且没有办法让您的浏览器以其他方式运行,只要您的前端代码正试图直接访问 API 端点。

所以唯一的解决办法是不要直接从你的前端代码点击那个 API 端点,而是设置一个代理并更改你的前端代码以通过它发出请求,或者只是处理它如上所述,以其他方式在您现有的后端代码中。

Why does my JavaScript code receive a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error, while Postman does not? 的答案提供了一些关于如何设置特殊 CORS 代理的详细信息,如果您想走那条路的话。