护照Facebook登录中的“对于需要预检的跨域请求是不允许的”错误?

Posted

技术标签:

【中文标题】护照Facebook登录中的“对于需要预检的跨域请求是不允许的”错误?【英文标题】:"which is disallowed for cross-origin requests that require preflight" error in passport facebook login? 【发布时间】:2013-12-12 07:32:53 【问题描述】:

我有一个提供 RESTful API 的 node.js express 应用程序,我正在使用护照进行 Facebook 身份验证。我在服务器端启用了所有 CORS 配置,并且能够通过 jQuery Ajax 使用 API。但对于 Facebook 身份验证,我收到以下错误:

XMLHttpRequest cannot load http://localhost:3000/auth/facebook. The request was redirected to 'https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%…_me%2Cuser_checkins%2Cuser_likes&client_id=12345678&type=web_server', which is disallowed for cross-origin requests that require preflight. 

/auth/facebook 端点是这个。

app.get('/auth/facebook',
    passport.authenticate('facebook', 
        scope: ['email', 'user_about_me', 'user_checkins', 'user_likes'],
        failureRedirect: users.authFailCallback
    ), users.signin);

所以基本上它被重定向到不允许 CORS 的 Facebook 的 API (302)。 有没有办法解决这个问题?还是我需要从服务器端调用 Facebook API?

【问题讨论】:

我相信缩写是CORS(跨域资源共享) 正确。编辑。谢谢 【参考方案1】:

这看起来可能是一个 webkit 错误:

https://bugs.webkit.org/show_bug.cgi?id=112471

您是否尝试在最新的 Firefox 中重现此行为?

您现在 (2013-12-05) 解决此问题的最佳选择是尽可能在服务器端进行调用。无论如何,您可能需要服务器端请求以允许 IE 8 兼容性,因为 IE 8 不支持大部分 CORS 规范。我使用同域代理来让 IE 8 正常工作。

祝你好运。

【讨论】:

【参考方案2】:

您不能调用服务器 api,这将导致前端出现 302(重定向)。 所以你必须将用户直接发送到服务器并将他从那里重定向到 facebook 得到结果保存用户然后将他重定向到你想要的任何地方

【讨论】:

以上是关于护照Facebook登录中的“对于需要预检的跨域请求是不允许的”错误?的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用 angularjs 和 django-cors-headers 然后给出“这对于需要预检的跨域请求是不允许的。”

Facebook OAuth 安全使用护照-facebook

Passport.js:passport-facebook-token 策略,通过 JS SDK 登录然后验证护照?

护照-facebook中callbackUrl和函数的区别

req.user 未定义 - 节点 + 快递 + 护照-facebook

护照-facebook-token vs 护照-facebook