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

时间:2018-02-15 11:23:00

标签: node.js passport.js passport-google-oauth

我遇到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);
}
}));

1 个答案:

答案 0 :(得分:0)

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