我一直在我的服务器上使用Passport进行用户身份验证。当用户在本地登录时(使用用户名和密码),服务器会向他们发送一个存储在本地存储中的JWT,并在每次需要用户身份验证的 api 调用时将其发送回服务器。
现在我也想支持Facebook 和 Google 登录。自从我开始使用 Passport 以来,我认为最好继续使用 Passport 策略,使用passport-facebook和passport-google-oauth。
我将参考 Facebook,但两种策略的行为相同。它们都需要重定向到服务器路由(“/auth/facebook”和“/auth/facebook/callback”)。该过程成功地保存了用户,包括他们的 facebook\google id 和数据库上的令牌。
在服务器上创建用户时,会创建一个 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);
});
问题是,在创建之后,我找不到将 JWT 发送到客户端的正确方法,因为我还应该重定向到我的应用程序。
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
session: false,
successRedirect : '/',
failureRedirect : '/'
}), (req, res) => {
var token = req.user.jwtoken;
res.json({token: token});
});
上面的代码将我重定向到我的应用程序主页,但我没有得到 token。如果我删除了successRedirect,我确实得到了令牌,但我没有被重定向到我的应用程序。
有什么解决办法吗?我的方法错了吗?任何建议都可以。