我正在尝试使用社交媒体(FB 和 Google)以及本地策略来实现登录。我的护照本地工作正常(除了允许重复的电子邮件,但单独的问题),但我看到 Facebook 和 Google 策略的一些奇怪行为。这是一个场景:
- 使用 Facebook 或 Google 登录
- 登出
- 使用与初始登录相反的方式登录(即第一个 FB,第二个 Google)
- 该应用程序使用初始帐户而不是第二个帐户登录。
我按照此页面上的教程设置了各种策略
http://mherman.org/blog/2013/11/10/social-authentication-with-passport-dot-js/#.Wk93wN-nFPb
策略示例:
passport.use(new googleStrategy({
clientID: config.google.clientID,
clientSecret: config.google.clientSecret,
callbackURL: config.google.callbackURL,
scope: ['profile', 'email'],
passReqToCallback: true
},
(request, accessToken, refreshToken, profile, done) => {
var emailArray = new Array();
profile.emails.forEach((email) => {
emailArray.push(email.value);
})
User.findOne({ $or: [{ oauthID: profile.id }, { email: { $in: [emailArray] } }] }, (err, user) => {
if (err) {
console.log(err);
}
if (!err && user !== null) {
console.log('Already existing user:' + user);
done(null, user);
} else {
console.log('Creating a new user');
user = new User({
email: emailArray[0],
username: profile.name.givenName,
oauthID: profile.id
});
user.save(function (err) {
if (err) {
console.log(err);
} else {
done(null, user);
}
});
}
});
}
));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
用户 MongoDB 模型
var mongoose = require('mongoose'),
passportLocalMongoose = require('passport-local-mongoose');
var userSchema = new mongoose.Schema({
email: String,
username: String,
password: String,
oauthID: Number
});
userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', userSchema);
和授权路线
router.get('/auth/google',
passport.authenticate('google'), (req, res) => {
console.log('Authenticating as: ' + req.user.email + ', oAuthID: ' + req.user.oauthID);
});
router.get('/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/auth' }), (req, res) => {
console.log('Authenticated as: ' + req.user.email + ', oAuthID: ' + req.user.oauthID);
res.redirect('/');
});
Facebook的策略基本相同。
我的第一个想法是User.findOne()
查询不正确,但如果我将查询输入 Mongo 控制台,我会收到预期的结果。
接下来,我登录以查看req.user
在身份验证过程的各个点上的值是多少。除了他们最终登录到他们最初登录的帐户之外,每一步看起来都很正常。
所以我不确定问题出在哪里......我对网络开发很陌生,所以非常感谢任何帮助/解释。