我一直在使用Passport在我的服务器上进行用户身份验证。
当用户在本地登录(使用用户名和密码)时,服务器会向他们发送JWT它存储在 localstorage 中,并在每次需要用户身份验证的 api 调用时发送回服务器。
现在我想支持Facebook 和 Google 登录以及。自从我开始使用 Passport 以来,我认为最好继续使用 Passport 策略,使用护照脸书 and 护照-谷歌-oauth.
我将参考 Facebook,但这两种策略的行为是相同的。它们都需要重定向到服务器路由('/auth/facebook' and '/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});
});
上面的代码将我重定向到我的应用程序主页,但我没有获得令牌。
如果我删除 successRedirect,我确实获得了令牌,但没有重定向到我的应用程序.
有什么解决办法吗?我的做法有错吗?任何建议都会做。