我已按照此处的建议成功链接Accounts
到。如果登录用户使用 OAuth 2.0(例如 Google Contacts API)授权第 3 方,我可以将该信息保存在帐户中,然后将该帐户与登录用户绑定。Users
我想更进一步,使登录体验尽可能无缝。一旦用户将他们的身份绑定到第 3 方帐户,我希望他们不仅能够使用本地策略(用户名/密码)登录,然后提取相关的第 3 方信息,而且还可以通过其他方式:注销时,连接到 Google 将使他们以我的应用程序的用户身份登录,使 req.user = 他们的User
信息,就像他们使用本地策略登录时一样。这是相关的代码块(显示的还有很多,但重点就在那里。
passport.use(new GoogleStrategy({
clientID: google_params.client_id,
clientSecret: google_params.client_secret,
callbackURL: google_params.callbackURL,
passReqToCallback: true
},
function(req, token, refreshToken, profile, done) {
...
// If no user in session, set the req.user to the associated user
User.findOne({
'username': account.userId
}, function(err, user) {
console.log('Account exists already in DB, and is already tied to a user. Logging into users account.');
req.user = user;
return done(null, account);
});
etc...
在检查序列化/反序列化函数时,此代码永远不会将用户或帐户信息序列化到会话中,因此虽然该信息确实在验证回调结束时传递,但它会在页面刷新时消失(再次,因为没有保存到会话中)。我该怎么办?我是否正确地考虑了这一点?