2017-11-19 17 views
0

Googleにログイン/登録する機能を追加しようとしています。私はPassportを使用してその機能を作成しようとしましたが、このエラーが発生します:Google OAuth 2.0で動作するPassport.jsを取得できません

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

感謝。

答えて

0

問題はUser.findOne()の代わりにUser.find()を使用したことでした。 User.find()は、オブジェクト自体ではなくオブジェクトを持つ配列を返します。

0

idのユーザーが実際に存在することを確認するには、の文をdeserializeUserに入れる必要があります。それ以外の場合は、デシリアライズして存在しないユーザーをシリアル化します。 deserializeUserでは、ユーザーのDBルックアップを追加し、そのユーザーが存在しない場合はdone(null, false)に電話してください。

関連する問題