2017-11-19 2 views
0

Ich versuche, die Möglichkeit zu erstellen, um sich bei Google zu meiner App anmelden/registrieren. Ich habe versucht, Passport zu verwenden, um diese Funktionalität zu erstellen, aber ich erhalte diesen Fehler:Kann Passport.js nicht mit Google OAuth 2.0 arbeiten

Error: Failed to serialize user into session.

Ich versuchte mit express-session und cookie-session, aber ich bekomme immer noch den gleichen Fehler.

Das ist mein 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}`)); 

Und dies ist der Passport-Setup (Strategie):

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

Dank.

Antwort

0

Das Problem war, dass ich User.find() anstelle von User.findOne() verwendet habe. User.find() gibt ein Array mit einem Objekt statt dem Objekt selbst zurück.

0

Sie müssen eine if Anweisung in deserializeUser überprüfen, dass ein Benutzer mit id tatsächlich existiert. Andernfalls werden Sie einen Benutzer deserialisieren und damit serialisieren, der nicht existiert. Versuchen Sie in deserializeUser, eine DB-Suche für den Benutzer hinzuzufügen, und rufen Sie dann done(null, false) auf, wenn dieser Benutzer nicht vorhanden ist.

Verwandte Themen