Javascript PassportJS:连接帐户时是否可以不序列化用户?

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

我的应用程序允许用户通过PassportJS建立多个oAuth连接到他的帐户

每当我连接另一个应用程序时(使用Mailchimp策略和Salesforce策略),Passport都会将我注销(结束我的
快速会话
)。似乎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);
    })
});
做了,做了