我正在尝试使用connect将护照集成到我的nodejs服务器中,但似乎无法正常完成。所有指南/示例都使用expressJS,所以我尽力重新格式化代码以使用我的代码,但我似乎无法让它工作。相关部分如下。有没有人对可能出现的问题有任何建议?似乎永远不会调用passport.authenticate()(至少facebook认证回调中的console.log消息永远不会打印)。我目前没有将任何内容保存到数据库中,所以问题应该是非常简单的,我只是缺少。
唯一想到的是我对facebook的潜在回调,这是一个localhost url(因为我还在本地开发)。我可以使用everyauth(来自纯粹的本地实例)对facebook进行身份验证,但是切换到passportJS,因为我在那里遇到了护照jS似乎要处理的不同问题。
passport = require('passport');
fpass = require('passport-facebook').Strategy;
passport.serializeUser(function(user,done){
done(null, user);
});
passport.deserializeUser(function(obj,done){
done(null,obj);
});
passport.use(new fpass({
clientID:'facebook app id',
clientSecret:'facebook app secret',
callbackURL:'http://localhost:3000/auth/facebook/callback'
},
function(accessToken, refreshToken, fbUserData, done){
console.log('got here');
return done(null,fbUserData);
}
));
function checkLoggedIn(req, res, next){
console.log("req.user: " + req.user);
if(req.user)
next();
else{
console.log('\nNot LOGGED IN\n');
if(req.socket.remoteAddress || req.socket.socket.remoteAddress == '127.0.0.1'){
var folder,contentType;
console.log('req url = '+req.url);
if(req.url == '/'){
folder = __dirname + '/landingPage.html';
contentType = 'text/html';
}
else if(req.url == '/auth/facebook'){
passport.authenticate('facebook');
return;
}
else if(req.url == '/auth/facebook/callback'){
passport.authenticate('facebook', {failureRedirect: '/failbook', successRedirect:'/'});
return;
}
if(folder){
console.log('got to folder part\n\n');
fs.readFile(folder, function(error, content){
if(error){
res.writeHead(500);
res.end();
}
else{
res.writeHead(200, {'Content-Type': contentType});
res.end(content);
}
});
}
else{ res.writeHead(500); res.end();}
}
else {res.writeHead(500); res.end();}
}
}
connect.createServer(
connect.cookieParser(),
connect.bodyParser(),
connect.session({secret:'wakajakamadaka'}),
passport.initialize(),
passport.session(),
checkLoggedIn).listen(8888);
console.log('Server has started.');
}
有人有任何建议或看到我正在做的事情的故障吗?我的另外两个选择是切换回Everyauth并弄清楚那里发生了什么,或者切换到ExpressJS,但我不想选择其中任何一个选项。
最佳,
萨米
答案 0 :(得分:8)
passport.authenticate
返回一个通常在中间件链中使用的函数,该函数由Express调用req
和res
。
它将在其他中间件或路由处理程序(例如checkLoggedIn
函数)中独立运行,但您必须显式调用由req
,res
和{{返回的函数1}}让它处理请求。
next
看起来不错。让我知道是否能帮助您实现目标。
的更新强>
Jared在stackoverflow之外帮助了我一点点,我们已经完全弄明白了这个问题。我正在更新此答案以包含我们找到的新信息。
1)一个问题显然是redirect()中间件存在于Express中但不存在于Connect中(至少不是当前版本)。使用connect时,您需要将PassportJS模块中authenticate.js的第97行从else if(req.url == '/auth/facebook'){
// NOTE: call the function returned to process the request
passport.authenticate('facebook')(req, res, next);
return;
}
更改为:
return res.redirect(options.successRedirect);
注意 - 上面的var redirect = function(redirectionURL){
res.writeHead(302, {'location':redirectionURL});
res.end();
}
return redirect(options.successRedirect);
与回调函数代码中的options.successRedirect
相同。这将是我问题中代码中的successRedirect
行。
2)另一个是我在我的应用中使用群集模块(不是我上面的代码片段中显示的内容)。这意味着nodeJS应用程序无法正确读取会话数据,这导致了我的问题。 此问题将影响任何依赖会话的库,包括使用会话的所有其他身份验证模块(例如everyauth,connect-auth等)我将引用Jared的解决方案:
快速回复:您使用群集还是启动多个服务器 实例
如果是这样,会话的内置MemoryStore将无法正常工作, 你需要切换到这样的东西: https://github.com/visionmedia/connect-redis
此处列出的其他会话商店之一: https://github.com/senchalabs/connect/wiki
原因是你最终会击中一台没有服务的服务器 原始请求,因此没有该会话信息 在自己的记忆中。这听起来像是可能发生的事情 deserializeUser不会100%被调用。
希望这能帮助任何人在这里做到这一点!