CORS 允许一些 GET 请求,但不允许 Facebook 登录请求

CORS allows some GET requests, but not Facebook login requests

我目前正在尝试为我的网站实施第三方身份验证功能。这是我从网上得到的一个"enableCORS"函数。它位于 "Server.js".

var enableCORS = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    if ('OPTIONS' == req.method) {
        res.send(200);
    }
    else {
      next();
    }
};


var express = require("Express");
var url = require("url");
var http = require("http");
var app;


var port = process.argv[2];
app = express();
http.createServer(app).listen(port);

app.use(enableCORS)

我从我的网站向我的 Server.js 发送了一个 httpGet 请求(我 运行 在我的控制台中使用 node --harmony server.js 3000)。这是 httpGet 函数:

function httpGet(URL) {
    var xmlHttp = null;
    xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", URL, false);
    xmlHttp.send(null);

    return xmlHttp.response;
}

我自己发送的请求是:

var items = JSON.parse(httpGet("http://localhost:3000/items"));

这工作正常,我的控制台显示 GET 请求成功,代码为 200。这有效的唯一原因是因为我使用了 "enableCORS" 函数。

现在我想创建一个登录功能,第三方身份验证,使用 Facebook。 为此,我找到了这段代码:

var passport = require('passport')
, FacebookStrategy = require('passport-facebook').Strategy;

    passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/auth/facebook/callback"
},

function(accessToken, refreshToken, profile, done) {
    User.findOrCreate(..., function(err, user) {
      if (err) { return done(err); }
      done(null, user);
    });
}
));

app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', 
passport.authenticate('facebook', { successRedirect: '/',
                                  failureRedirect: '/login' }));

但是,当我发送以下请求时:

httpGet("http://localhost:3000/auth/facebook");

它再次将另一个 CORS 错误推到我面前。该错误告诉我启用 CORS 或将发送方和接收方放在同一域中。因为我显然不能让 Facebook 进入我自己的域,所以我必须启用 CORS。但是,正如您在上面看到的,我已经启用了 CORS。我也在Facebook的Developers部分申请并填写了我自己的App ID和App Secret,所以不会出错。它实际上使用我的 ID 和 App Secret 将请求发送到 Facebook/Oauth,但 CORS 只是阻止了它。有人知道我还应该做什么吗?

使用 passport 登录 facebook 时遇到同样的错误。

我认为正在发生的事情是,passport 将 302 重定向发送回客户端。但是由于请求是通过 XMLHttpRequest 发生的,Facebook 拒绝重定向请求,因为它来自另一个域。

因此,我使用了 window.location.href = '/auth/facebook' 而不是 XMLHttpRequest。

希望对您有所帮助

P.S: 想发表评论但不能,因为我需要一定的最低声誉