Javascript PassportJS:连接帐户时是否可以不序列化用户?
我的应用程序允许用户通过PassportJS建立多个oAuth连接到他的帐户 每当我连接另一个应用程序时(使用Mailchimp策略和Salesforce策略),Passport都会将我注销(结束我的Javascript PassportJS:连接帐户时是否可以不序列化用户?,javascript,node.js,express,serialization,passport.js,Javascript,Node.js,Express,Serialization,Passport.js,我的应用程序允许用户通过PassportJS建立多个oAuth连接到他的帐户 每当我连接另一个应用程序时(使用Mailchimp策略和Salesforce策略),Passport都会将我注销(结束我的快速会话)。似乎Passport正在尝试为我连接的每个策略使用新会话登录,这根本不是我想要的 我认为秘密在于我使用的策略回调,即返回done()函数: passport.use(new MailChimpStrategy({ clientID: auth.mailchimpAuth.clie
快速会话
)。似乎Passport正在尝试为我连接的每个策略使用新会话登录,这根本不是我想要的
我认为秘密在于我使用的策略回调,即返回done()
函数:
passport.use(new MailChimpStrategy({
clientID: auth.mailchimpAuth.clientID,
clientSecret: auth.mailchimpAuth.clientSecret,
callbackURL: auth.mailchimpAuth.callback
}, function(accessToken, refreshToken, profile, done) {
process.nextTick(function() {
Chimp.findOne({'login_name': profile._json.login.login_name},
function(err, chimp) {
if (err) {
return done(err);
}
if (!chimp) {
var newChimp = new Chimp();
newChimp.login_name = profile._json.login.login_name;
newChimp.profile = profile;
newChimp.authUsers = [];
newChimp.domain = '';
newChimp.accessToken = accessToken;
newChimp.lists = {};
newChimp.save(function(err) {
if (err) {
return done(err);
} else {
return done(null, newChimp);
}
});
} else {
var newChimp = chimp;
return done(null, newChimp);
}
});
});
}));
这大概是因为当我使用新的API进行身份验证时,我的用户正在更改Passport。我可以通过检查传递给passport.serializeuser()
和passport.deserializeuser()的user.id
对象来了解这一点。但我并不是在这里创建新用户——我只是将每个API返回的配置文件添加到我的原始用户帐户中
我如何防止这种情况发生并保持我原来的会话处于活动状态?提出了解决方案(无论是谁对此问题投了赞成票):
我正确地认为这与返回的done()
有关;发生的情况是done()
将对象返回给serializeUser()
,然后将其传递给反序列化user()
因此,在我的mailChimpStrategy
函数中,我添加了passReqToCallback:true
,然后从回调函数访问登录用户:
passport.use(new MailChimpStrategy({
clientID: auth.mailchimpAuth.clientID,
clientSecret: auth.mailchimpAuth.clientSecret,
callbackURL: auth.mailchimpAuth.callback,
passReqToCallback: true
}, function(req, accessToken, refreshToken, profile, done) {
var tempUser = {id: req.session.passport.user}
User.findById(tempUser.id, function(err, usr){
var newChimp = new Chimp(); // Make new Mongoose Chimp object
// Do Chimp profile setting here
// Then, when done, instead of passing the Chimp profile object, I pass the user ID.
return done(null, tempUser);
})
});
完成了,完成了。想出了解决这个问题的办法(无论是谁对这个问题投了赞成票):
我正确地认为这与返回的done()
有关;发生的情况是done()
将对象返回给serializeUser()
,然后将其传递给反序列化user()
因此,在我的mailChimpStrategy
函数中,我添加了passReqToCallback:true
,然后从回调函数访问登录用户:
passport.use(new MailChimpStrategy({
clientID: auth.mailchimpAuth.clientID,
clientSecret: auth.mailchimpAuth.clientSecret,
callbackURL: auth.mailchimpAuth.callback,
passReqToCallback: true
}, function(req, accessToken, refreshToken, profile, done) {
var tempUser = {id: req.session.passport.user}
User.findById(tempUser.id, function(err, usr){
var newChimp = new Chimp(); // Make new Mongoose Chimp object
// Do Chimp profile setting here
// Then, when done, instead of passing the Chimp profile object, I pass the user ID.
return done(null, tempUser);
})
});
做了,做了