护照facebook登录时出现“不允许需要预检的跨域请求”错误?

时间:2013-11-26 22:23:02

标签: node.js facebook-graph-api redirect cross-domain passport.js

我有一个node.js express app,提供RESTful API,我使用护照进行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);

所以基本上它被重定向到Facebook的API(302),它不允许CORS。 有什么方法可以解决这个问题吗?或者我需要从服务器端调用Facebook API?

2 个答案:

答案 0 :(得分:4)

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

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

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

现在(2013-12-05)解决此问题的最佳方法是尽可能使呼叫服务器端。您可能需要服务器端请求以允许IE 8兼容性,因为IE 8不支持大部分CORS规范。我使用同域代理来使IE 8工作。

祝你好运。

答案 1 :(得分:0)

你不能调用服务器api,这将导致前端302(重定向)。 因此,您必须将用户直接发送到服务器并将其从那里重定向到Facebook获取结果保存用户,然后将其重定向到您想要的地方