所以,我正在构建一个NodeJS应用程序,我正在使用护照进行身份验证 . 我也使用passport-facebook设置了Facebook身份验证 . 我现在的设置方式,如果想要合并本地帐户和Facebook帐户,用户可以这样做的一种方法是首先使用本地帐户登录并点击“与Facebook连接”,这会触发此链接:

<a href="/connect/facebook" class="btn btn-primary">Connect Facebook</a>

在后端,这条路线看起来像这样:

app.get('/connect/facebook', passport.authorize('facebook', { scope: 'email' }));

这非常有效 . 但是,如果用户首先使用Facebook登录该怎么办?如果他们点击“连接本地”,则会触发此链接:

<a href="/connect/local" class="btn btn-default">Connect Local</a>

,在后端,这条路线看起来像这样:

app.get('/connect/local', function(req, res){
        res.render('connect-local.ejs', { message: req.flash('signupMessage')});
    });

该EJS文件包含一个注册表单,该表单发布到/ connect / local:

app.post('/connect/local',  passport.authenticate('local-signup', {
            successRedirect: '/profile',
            failureRedirect: '/connect/local',
            failureFlash: true
    }));

这也有效 . 但是,如果用户首先使用Facebook登录然后希望与已注册的本地帐户合并,该怎么办?当用户尝试连接已注册的本地帐户时,我已尝试为上述路由执行类似的操作:

app.post('connect/local', function(){
        passport.authenticate('local-login', {
            successRedirect: '/profile',
            failureRedirect: '/connect/local',
            failureFlash: true
        });
        passport.authorize('local-login', {
            successRedirect: '/profile',
            failureRedirect: 'connect/local',
            failureFlash: true
        });
    })

这似乎不起作用 . 我还注意到,如果我在登录Facebook时尝试对本地用户进行身份验证,它只会将我登录到本地帐户并退出Facebook帐户,但如果我以相反的方式执行此操作,则会合并 . 我很乐意提供您可能会审核的任何其他代码以给出一个好的答案 . 非常感谢提前!

Update :我也是've tried writing a new passport Strategy (which is used when the user is logged in with Facebook and is trying to connect a local account), but this didn'工作 . 控制台登录以下代码都返回Facebook凭据,即使我希望req.user返回Facebook凭据和用户返回本地凭据 . 以下是我的新护照策略:

passport.use('local-connect', new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true
    },
        function (req, accessToken, refreshToken, profile, email, password, done) {
            process.nextTick(function () {
                User.findOne({ 'local.password': password }, function (err, user) {
                    console.log('req.user = ' + req.user);
                    console.log('user = ' + user)
                    if (err)
                        return done(err);
                    if (req.user) {
                        if (!user) {
                            req.user.local.email = email;
                            req.user.local.password = req.user.generateHash(password);

                            user.save(function (err) {
                                if (err)
                                    throw err;
                                return done(null, req.user)
                            })
                        }}
                        else {
                            user.facebook.id = profile.id;
                            user.facebook.token = accessToken;
                            user.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
                            user.facebook.email = profile.emails[0].value;

                            newUser.save(function (err) {
                                if (err)
                                    throw err;
                                return done(null, user);
                            })
                        }}
                    )}
                )}
    ))