首页 文章

Passport.js:没有req.user存储在会话中

提问于
浏览
0

我遇到Passport.js和express-session的问题 . 当我尝试登录请求时,就会挂起 . 我开始使用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);
}
}));

1 回答

  • 0

    现在解决了这个问题 . 我要求在与MongoDB数据库断开连接的种子文件中 . 这显然搞砸了用户查找 .

相关问题