我遇到Passport.js和快速会话问题。当我尝试登录请求时,就会挂起。我开始使用cookie-session而不是快速会话,并且使用Google和Facebook策略进行身份验证都没有问题。由于某种原因,没有调用serializeUser和deserializeUser函数,因此没有用户存储在req对象上。
我的代码如下。
index.js
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(session({
secret: sessionSecret,
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
路由
router.get('/google', passport.authenticate('google', {
scope: ['profile', 'email']
}));
router.get('/google/callback', passport.authenticate('google', {
successRedirect: '/',
failureRedirect: '/login'
}));
护照设置
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (e, user) => {
done(e, user);
});
});
passport.use(new GoogleStrategy({
clientID: googleClientID,
clientSecret: googleClientSecret,
callbackURL: '/auth/google/callback',
proxy: true
}, async (accessToken, refreshToken, profile, done) => {
try {
//Does email exist in DB?
const existingUser = await User.findOne({
email: profile.emails[0].value,
});
if(existingUser) {
//If email exists, is the profile id same as one in db?
if(existingUser.googleId === profile.id) return done(null,
existingUser);
//If email exists but no google id, set one
if(!existingUser.googleId) {
const user = await User.findOneAndUpdate({
email: profile.emails[0].value
}, {
$set: {
googleId: profile.id
}
}, {
new: true
});
return done(null, user);
}
}
const newUser = await new User({
email: profile.emails[0].value,
googleId: profile.id
}).save();
done(null, newUser);
} catch (e) {
console.log(e);
}
}));
答案 0 :(得分:0)
现在解决了这个问题。我要求在与MongoDB数据库断开连接的种子文件中。这显然搞砸了用户查找。