node.js - OAuth 中的 CORS : Response to preflight request doesn't pass access control check

标签 node.js express oauth-2.0 cors preflight

因此,我正在尝试实现 OAuth 2 流程,而我的 web 应用程序是提供授权代码/访问 token 的服务器。

将代码发送回第三方网站时发生 Cors 错误(本例为 zapier):

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 问题,但流行的解决方案都不适合我:

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

我的 web 应用程序位于 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 代理的一些详细信息。

关于node.js - OAuth 中的 CORS : Response to preflight request doesn't pass access control check,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44425186/

相关文章:

node.js - 无论路由如何,如何提供相同的静态文件?

node.js - fluent-ffmpeg display_aspect_ratio 没有改变

javascript - 错误 : Can't set headers after they are sent to the client

javascript - Web 开发人员如何查看用户控制台错误?

post - MVC POST 请求丢失授权 header - 检索后如何使用 API 承载 token

python httplib 到本地主机的超时

node.js - 如何使用nodejs下载git repo中的文件?

javascript - 如何每隔 'x' 小时向 Slack 发送一条消息?

c# - Google.Apis 共享访问和刷新 token

oauth-2.0 - Office365 SMTP 是否可以使用 OAuth 2.0?