OAuth 中的 CORS:对预检请求的响应未通过访问控制检查
Posted
技术标签:
【中文标题】OAuth 中的 CORS:对预检请求的响应未通过访问控制检查【英文标题】:CORS in OAuth: Response to preflight request doesn't pass access control check 【发布时间】:2017-11-09 13:07:36 【问题描述】:所以我正在尝试实现 OAuth 2 流程,而我的 webapp 是提供授权码/访问令牌的服务器。
将代码发送回第三方网站(本例中为zapier)时发生Cors错误:
XMLHttpRequest 无法加载 https://zapier.com/dashboard/auth/oauth/return/App505CLIAPI/?code=somecode&state=somestate。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://myurl' 因此不允许访问。
如果我手动打开一个新标签,粘贴该 zapier uri,一切正常。
似乎是典型的 CORS 问题,但流行的解决方案都不适合我:
-
添加
Access-Control-Allow-Origin
:我正在使用这个oauth2orize
图书馆,并且向预检发送响应似乎也是
图书馆。所以我不能添加标题。
使用cors:尝试了app.use(cors())
和app.options('*',
cors())
,它们应该适用于所有路由,但根本不起作用。
我的 webapp 位于 node express 服务器上,前面有一个 nginx 代理服务器。
感谢您提出问题的任何想法。
【问题讨论】:
【参考方案1】:错误消息指示的问题不是由运行在https://myurl/
的应用程序代码引起的。相反,只是 https://zapier.com/dashboard/auth/…
似乎不支持 CORS。
具体来说,来自 https://zapier.com/dashboard/auth/…
URL 的响应不包含 Access-Control-Allow-Origin
响应标头,因此您的浏览器不会让您的前端 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 代理的详细信息,如果您想走这条路。
【讨论】:
以上是关于OAuth 中的 CORS:对预检请求的响应未通过访问控制检查的主要内容,如果未能解决你的问题,请参考以下文章
cors(cors 策略:对预检请求的响应未通过访问控制检查)角度 7 中的错误
如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?
CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向