Facebook与智威汤逊护照

我一直在我的服务器上使用Passport进行用户authentication。 当用户在本地login(使用用户名和密码)时,服务器发送一个存储在本地存储中的JWT,并在需要用户authentication的每个api调用中发送回服务器。

现在我想支持Facebook和Googlelogin 。 自从我开始使用Passport以来,我认为最好是继续使用Passport策略,使用passport-facebookpassport-google-oauth

我会提到Facebook,但是这两种策略都是一样的。 他们都需要redirect到服务器路由( '/ auth / facebook''/ auth / facebook / callback' )。 这个过程是成功的保存用户,包括他们的Facebook的\谷歌ID和令牌的数据库。

在服务器上创build用户时,会创build一个JWT(不需要依赖从facebook \ google收到的令牌)。

... // Passport facebook startegy var newUser = new User(); newUser.facebook = {}; newUser.facebook.id = profile.id; newUser.facebook.token = token; // token received from facebook newUser.facebook.name = profile.displayName; newUser.save(function(err) { if (err) throw err; // if successful, return the new user newUser.jwtoken = newUser.generateJwt(); // JWT CREATION! return done(null, newUser); }); 

问题是,创build后, 我没有find一个正确的方式发送到客户端的JWT ,因为我也应该redirect到我的应用程序。

 app.get('/auth/facebook/callback', passport.authenticate('facebook', { session: false, successRedirect : '/', failureRedirect : '/' }), (req, res) => { var token = req.user.jwtoken; res.json({token: token}); }); 

上面的代码redirect到我的应用程序的主页,但我没有得到的令牌 。 如果我删除了successRedirect, 我得到的令牌,但我没有redirect到我的应用程序

任何解决scheme? 我的方法错了吗? 任何build议都可以做。

一个解决scheme是在客户端实现redirect。

只需使用:

 app.get('/auth/facebook/callback', passport.authenticate('facebook', { session: false, failureRedirect: '/login' }), (req, res) => { res.json({ token: req.user.jwtoken }) } ) 

如果客户端收到令牌,则从那里redirect到主页,如果login失败,则直接由服务器redirect。

或者,您可以像我一样去完整的客户端pipe理:

 app.get('/auth/facebook/callback', passport.authenticate('facebook', { session: false }), (req, res) => { if (req.user.jwtoken) { res.json({ success: true, token: req.user.jwtoken }) } else { res.json({ success: false }) } } ) 

如果success === true ,则将JWT存储在LocalStorage中,否则redirect到login页面。