2017-07-03 4 views
1

bitte helfen Sie mir mit Passpjs lokalen Strategie. Wenn ich versuche, mich einzuloggen, lautet mein Passfluss: serialize, Success auth und redirect nach '/', wo req.user nicht definiert ist. In Pass Flow Deserialize ist Aufruf nach jeder Serialisierung, aber in meinem nie. Ich weiß nicht, wo der Käfer ist, danke für Hilfe.pass.deserializeUser nie anrufen

Erfordern:

var express = require('express'); 
    var bodyParser = require('body-parser'); 
    var objection = require('objection'); 
    var Model = objection.Model; 
    var Knex = require('knex'); 
    var bcrypt = require('bcrypt'); 
    var expressValidator = require('express-validator'); 
    var passport = require('passport'); 
    var cookieParser = require('cookie-parser'); 
    var session = require('express-session'); 
    var LocalStrategy = require('passport-local').Strategy; 
    var api = express(); 

Strategie Middleware:

passport.use(new LocalStrategy(
     async function (username, password, done) { 
      var user = await User.findOne(username); 
      if (!user) { 
       return done(null, false, {message: 'Incorrect username.'}); 
      } 
      if (!bcrypt.compareSync(password, user.password)) { 
       return done(null, false, {message: 'Incorrect password.'}); 
      } else { 
       return done(null, user); 
      } 
     } 
    )); 

Serialisieren eine Deserialize Methode:

passport.serializeUser(function (user, done) { 
     console.log("serialialize"); 
     done(null,user.id); 
    }); 

    passport.deserializeUser(async function (id, done) { 
     console.log("deserialialize"); 
     let user = await User.findById(id); 
     if (user) { 
      done(null, user); 
     } 
    }); 

Middlewares:

api.use((req, res, next) => { 
     res.setHeader('Access-Control-Allow-Origin', '*'); 
     res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 
     next(); 
    }); 

    api.use(bodyParser.json()); 
    api.use(expressValidator()); 
    api.use(cookieParser()); // required before session. 
    api.use(session({secret: 'keyboard cat', resave: false, saveUninitialized: false})); 
    api.use(passport.initialize()); 
    api.use(passport.session()); 

DB-Konfigurationen:

var knex = Knex({ 
     client: 'pg', 
     connection: { 
      user: 'marossmrek', 
      password: '12345', 
      database: 'ita-js' 
     } 
    }); 

    Model.knex(knex); 

    class Base extends Model { 

     static get tableName() { 
      return this.name.toLowerCase(); 
     } 

     static async findById(id) { 

      return await this.query().where({id: id}).limit(1).first(); 
     } 
    } 

    class User extends Base { 

     static async findOne(username) { 
      return await this.query().where({username: username}).limit(1).first(); 
     } 
    } 

Benutzeranmeldung Routen:

api.post('/login', 
     passport.authenticate('local', { failureRedirect: '/login' }), 
     function(req, res) { 
      console.log('Success auth'); 
      res.redirect('/'); 
     }); 

    api.get('/logout', (req, res) => { 
     req.logout(); 
     res.end(); 
    }); 

    api.get('/', (req,res)=> { 
     console.log("After redirect: " +req.user); 
     res.end(); 
    }); 

    api.listen(5000,() => { 
     console.log("I listen on port 5000"); 
    }); 

Antwort

-1

Wenn Sie ganze Benutzer serialisiert, deserialisieren dann ganze Benutzerobjekt nicht nur die ID.

passport.serializeUser(function (user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function (user, done) { 
    done(null, user); 
}); 
+0

Wie verhält es sich zu * passag.deserializeUser nie anrufen * Problem? – Green