使用PassportJS和NodeJS的Connect来validationFacebook用户

我试图使用连接将护照集成到我的nodejs服务器,但似乎无法正确执行。 所有的指南/例子使用expressJS,所以我尽我所能重新格式化代码来处理我的代码,但我似乎无法得到它的工作。 相关部分如下所示。 有没有人对这个问题有什么build议? passport.authenticate()似乎永远不会被调用(至less在Facebook身份validationcallback内的console.log消息从不打印)。 我目前没有保存任何东西到数据库,所以这个问题应该希望是一个非常简单的东西,我只是想念。

唯一想到的是我对Facebook的潜在callback,这是一个本地主机url(因为我仍然在本地开发)。 我能够通过使用everyauth(来自纯粹的本地实例)来正确validationfacebook,但转而使用passportJS,因为我遇到了PassportJS似乎要解决的不同问题。

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.'); } 

有没有人有任何build议或看到我在做什么小故障? 我的其他两个select是切换到everyauth,并找出那里正在发生的事情,或切换到ExpressJS,但我宁愿不去与这两个选项之一。

最好,
萨米

passport.authenticate返回一个通常在中间件链中使用的函数,它通过reqres调用。

它将在其他中间件或路由处理程序(如checkLoggedIn函数)中checkLoggedIn工作,但是您必须显式调用reqresnext返回的函数才能处理请求。

 else if(req.url == '/auth/facebook'){ // NOTE: call the function returned to process the request passport.authenticate('facebook')(req, res, next); return; } 

否则看起来不错。 让我知道,如果这让你启动和运行。

UPDATE

Jared帮了我一点点时间,我们已经find了这个问题。 我正在更新这个答案,包括我们发现的新信息。

1)一个问题很明显,redirect()中间件存在于Express中,而不是在Connect中(至less不是当前版本)。 当使用connect时,你需要将return res.redirect(options.successRedirect);模块中的authenticate.js的第97行从return res.redirect(options.successRedirect); 至:

 var redirect = function(redirectionURL){ res.writeHead(302, {'location':redirectionURL}); res.end(); } return redirect(options.successRedirect); 

注意 – 上面的options.successRedirect与callback函数代码中的successRedirect相同。 这将是行passport.authenticate('facebook', {failureRedirect: '/failbook', successRedirect:'/'}); 在我的问题代码。

2)另一个是我在我的应用程序中使用集群模块(不是在我的代码片段中显示的东西)。 这意味着sessionJS应用程序没有正确读取会话数据,这导致了我的问题。 这个问题会影响任何依靠会话的库,包括所有使用会话的其他authentication模块(例如everyauth,connect-auth等)。我将引用Jared的解决scheme:

快速回复:您是使用群集还是启动多个服务器实例?

如果是这样,会话的内置MemoryStore将无法正常工作,并且需要切换到如下所示: https : //github.com/visionmedia/connect-redis

或者在此列出的其他会话商店之一: https : //github.com/senchalabs/connect/wiki

原因是你最终会碰到一个服务器没有提供原始请求,因此没有在自己的内存中的会话信息。 这听起来像是如果deserializeUser不被称为100%的时间会发生什么。

希望这有助于谁使它在这里!