无法使Passport.js与Google OAuth 2.0一起使用

时间:2017-11-19 19:17:50

标签: javascript node.js mongoose passport.js

我正在尝试将登录/注册Google的功能添加到我的应用中。我尝试使用Passport来创建该功能,但我收到此错误:

Error: Failed to serialize user into session

我尝试使用express-sessioncookie-session,但我仍然遇到同样的错误。

这是我的app.js:

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const keys = require('./config/keys');
const expressSession = require('express-session');
const cookieParser = require('cookie-parser');
const passport = require('passport');

// Set Mongoose Promise Library To Default
mongoose.Promise = global.Promise;

// Connect To The Database
mongoose.connect(keys.mongodb.dbURI, {useMongoClient: true})
.catch(err => console.log(err));

// -------------------------//
// Middlewares              //
// -------------------------//
// Set View Engine To Pug
app.set('view engine', 'pug');

// Cookie Parser Middleware
app.use(cookieParser());

// Express-Session Config & Middleware
app.use(expressSession({
  secret: keys.session.cookieKey,
  resave: false,
  saveUninitialized: true,
  cookie: {
    maxAge: 60000 
  }
}));

// Passport Middlewares
app.use(passport.initialize());
app.use(passport.session());

// Serve Static Assets
app.use(express.static('public'));

// -------------------------//
// Routes                   //
// -------------------------//
app.get('/', (req, res) => {
  res.render('home');
});

const authRoutes = require('./routes/auth');
app.use('/auth', authRoutes);

// -------------------------//
// Initalize                //
// -------------------------//
const portNum = 5000;
app.listen(portNum, () => console.log(`Started On Port ${portNum}`));

这是Passport-setup(策略):

'use strict';
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('./keys');
const User = require('../models/user');

passport.use(
  new GoogleStrategy({
    clientID: keys.google.clientID,
    clientSecret: keys.google.clientSecret,
    callbackURL: '/auth/google/redirect'
  }, (accessToken, refreshToken, userInfo, done) => {
    User.find({googleId: userInfo.id}).then(foundUser => {
      if (!foundUser) {
        new User({
          userName: userInfo.displayName,
          googleId: userInfo.id
        })
        .save().then(createdUser => done(null, createdUser))
        .catch(err => console.log(err));
      } else {
        done(null, foundUser);
      }
    })
    .catch(err => console.log(err));
  })
);

passport.serializeUser((user, done) => {
  done(null, user.id)
});

passport.deserializeUser((id, done) => {
  User.findById(id).then(foundUser => done(null, foundUser))
    .catch(err => console.log(err));
});

感谢。

2 个答案:

答案 0 :(得分:0)

您需要在if中使用deserializeUser语句检查实际存在id的用户。否则,您将反序列化并因此序列化不存在的用户。在deserializeUser中,尝试为用户添加数据库查找,如果该用户不存在,请致电done(null, false)

答案 1 :(得分:0)

问题在于我使用了User.find()而不是User.findOne()。 User.find()返回一个包含对象而不是对象本身的数组。

相关问题