通过PassortJS将本地用户连接到Facebook / Twitter

我有一个现有的用户群,我想让他们与他们的Facebook / Twitter帐户链接。 看起来我可以使用passportjs但是有困难,

现在,一个url传递给他/她的用户/传递,我做了一个本地stragety,并查找用户。 然后我想执行一个我认为的授权。 我得到了facebook promopts询问是否允许,并且我用accessToken命中了callback,但是我没有办法将该令牌绑定到我的db中的现有用户,因为我现在看到了获取请求信息的方式。

passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { Users.findOne({_id: user._id}, function(err, user) { return done(err, user); }); }); passport.use(new LocalStrategy({ passReqToCallback: true }, function(req, username, password, done) { Users.findOne({_id: username}, function(err, user) { return done(null, user); }); } )); passport.use(new FacebookStrategy({ clientID: 'xxxx', clientSecret: 'xxxx', callbackURL: "http://xxxx/facebook/callback", passReqToCallback: true }, function(req, accessToken, refreshToken, profile, done) { // How would I get access to the user found in the LocalStrategy here so I can associate the accessToken to the user in the db? console.log(accessToken); console.log(refreshToken); var err = null; var user = {}; return done(err, user); } )); server.get('/facebook', passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), function (req, res) { if (req && req.user) { passport.authorize('facebook', { scope: ['publish_actions','manage_pages'] })(req, res); } }); server.get('/facebook/callback', passport.authorize('facebook', { failureRedirect: '/facebook/failure', successRedirect: '/facebook/success' }), function(req, res) { res.redirect('/'); } ); 

假设用户已经使用本地策略login,则用户应该可以根据请求使用req.user。 然后,您可以将Facebook凭证信息添加到现有的用户对象。

检查您在Facebookcallback中redirect到的URL,并确保您在本地login的时间与从Facebook回拨的时间之间没有生成不同的会话。

我有一个类似的问题,这让我发疯,这是因为我的redirect是不同的。

例如,我在Chrome浏览器中导航到http://localhost:3000 ,login并且正确设置了req.user。 在我的Facebook开发设置和Passportconfiguration,我redirect到http://hostname.local:3000/auth/facebook

只要你的本地login和redirect共享同一个会话,那么req.user应该是可用的。