2016-01-01 5 views
0

Имея вопрос с Passport-local. Он не появляется ни serializeuser, ни deserializeUser. После чтения других сообщений на SO, кажется, что многие люди, у которых была эта проблема, не включали bodyParser.Passport.js serializeUser и desializeUser не вызываются никогда?

Вот мой app.js:

var express = require('express'); 
var app = express(); 

var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var db_config = require('./config/database'); 
var mongoose = require ('mongoose'); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

//loads passport implementation 
require('./config/passport')(app); 

//loads all routes 
require('./config/routes')(app); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    //initialize connection to database 
    mongoose.connect(db_config.development); 

    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'test') { 
    //initialize connection to database 
    mongoose.connect(db_config.test); 

    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

if(app.get('env') === 'production'){ 
    //initialize connection to database 
    mongoose.connect(db_config.production); 

    // production error handler 
    // no stacktraces leaked to user 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
    }); 
} 

module.exports = app; 

Здесь вы конфиг/passport.js:

module.exports = function(app){ 
    var passport = require ('passport'); 
    var LocalStrategy = require('passport-local').Strategy; 
    var session = require('express-session'); 
    var User = require('../models/user.js'); 
    // ========================================================================= 
    // passport session setup ================================================== 
    // ========================================================================= 
    // required for persistent login sessions 
    // passport needs ability to serialize and unserialize users out of session 

    // used to serialize the user for the session 
    passport.serializeUser(function(user, done) { 
    console.log('serialize'); 
    done(null, user._id); 
    }); 

    // used to deserialize the user 
    passport.deserializeUser(function(id, done) { 
    console.log('deserialize'); 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
    }); 

    //configure passport http-basic strategy 
    passport.use(new LocalStrategy({ 
    usernameField: "username", 
    passwordField: "password" 
    }, 
    function(username, password, done){ 
    User.findOne({username: username}, function(err, user){ 
     if(err) return done(err); 
     if(!user || !user.validatePassword(password)) return done(null, false); 
     console.log("inside LocalStrategy: " + user); 
     return done(null, user); 
    }); 
    })); 

//setup express-session 
app.use(session({ 
    secret: "secret", 
    saveUninitialized: true, 
    resave: true 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 

return passport; 
}; 

Вот мой routes.js:

module.exports = function(app){ 
    var routes = require('../routes/index'); 
    var users = require('../routes/users'); 
    var walks = require('../routes/walks'); 

    var isAuthenticated = function(req, res, next){ 
    if(req.isAuthenticated()) 
     next(); 
    res.status(401).send('You must login first.'); 
    }; 

    app.use('/', routes); 
    app.all('*', isAuthenticated); 
    app.use('/users', users); 
    app.use('/walks', walks); 
}; 

Здесь вы маршруты/index.js:

var router = require('express').Router(); 
var passport = require('passport'); 
var controller = require('../controllers/index'); 

router.get('/', controller.index); 

router.post('/signup', controller.signup); 

router.post('/login', passport.authorize('local'), controller.login); 

module.exports = router; 

И, наконец, вот контроллер/index.js:

var User = require('../models/user.js'); 
var handleError = require('../handlers/error'); 
var controller = {}; 

controller.index = function(req, res, next) { 
    res.render('index', { title: 'Express' }); 
}; 

controller.signup = function(req, res){ 
    console.log(req.body); 
    var user = new User(); 
    user.username = req.body.username; 
    user.password = req.body.password; 

    user.save(function(err, user){ 
    if(err) { 
     console.log(err.code); 
     handleError(res, err); 
    } 
    return res.send(user); 
    }); 
}; 

controller.login = function(req, res){ 
    console.log('inside /login'); 
    console.log('req.user: ' + req.user); 
    console.log('req.session: '); 
    console.log(req.session); 
    console.log('req.body: '); 
    console.log(req.body); 
    res.send(req.user); 
}; 

module.exports = controller; 

В POSTMAN я первый создающего user с запросом POST к /signup с:

{ 
"username": "bob", 
"password": "password123" 
} 

Тогда я отправляю в /login с те же учетные данные, вот вывод:

inside LocalStrategy: { __v: 0, 
    username: 'bob', 
    password: '$2a$10$Oa/Q9C5Elsoa0P4427P6fOXWIKerlD937FYgLFrwCWwXxGW1gbsoW', 
    _id: 5685d6845c7b208693b71091 } 
inside /login 
req.user: undefined 
req.session: 
Session { 
    cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true } } 
req.body: 
{ username: 'bob', password: 'password123' } 
POST /login 200 205.704 ms - - 

Как вы можете видеть, console.log() в обоих serializeUser и deserializeUser не вызывается. Почему это? У меня здесь полная потеря, я честно понятия не имею, что еще попробовать.

ответ

1

Это:

router.post('/login', passport.authorize('local'), controller.login); 

Должно быть так:

router.post('/login', passport.authenticate('local'), controller.login); 

passport.authorize() предназначен для подключения ответов авторизации третьих сторон в уже прошедших проверку подлинности пользователей.

+0

ха-ха, ничего себе! Спасибо! Не могу поверить, что я этого не понимал. Написал это супер устало прошлой ночью. Теперь все мои испытания проходят, и все золото. Знал, мне нужен был еще один глаз, спасибо. Итак, 'authorize()' подходит для входа в facebook или для какого-то пользователя или? – Dustin

+0

@ Dustin мне понадобилось некоторое время, чтобы определить это тоже: D и да, 'authorize()' используется для связывания FB/Twitter/любых данных учетной записи с существующим пользователем. – robertklep

+0

О, круто, я буду помнить об этом в ближайшем будущем :) спасибо миллион – Dustin

Смежные вопросы