【问题标题】:Can't get Passport.js to work with Google OAuth 2.0无法让 Passport.js 与 Google OAuth 2.0 一起使用
【发布时间】:2018-05-03 00:29:30
【问题描述】:

我正在尝试在我的应用中添加使用 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}`));

这是护照设置(策略):

'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));
});

谢谢。

【问题讨论】:

    标签: javascript node.js mongoose passport.js


    【解决方案1】:

    您需要在deserializeUser 中有一个if 语句来检查具有id 的用户是否确实存在。否则,您将反序列化并因此序列化不存在的用户。在deserializeUser 中,尝试为用户添加数据库查找,然后如果该用户不存在,则调用done(null, false)

    【讨论】:

      【解决方案2】:

      问题是我使用了 User.find() 而不是 User.findOne()。 User.find() 返回一个带有对象的数组,而不是对象本身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 2020-12-09
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多