所以,我正在构建一个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);
})
}}
)}
)}
))