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: 想发表评论但不能,因为我需要一定的最低声誉
我目前正在尝试为我的网站实施第三方身份验证功能。这是我从网上得到的一个"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: 想发表评论但不能,因为我需要一定的最低声誉