I get an issue using PassportJS and my local strategy. I'm using ExpressJS 4.
My app.js (reduced, without express init) :
var express = require('express'),
ejs = require('ejs'),
path = require('path'),
expressLayouts = require('express-ejs-layouts'),
session = require('express-session'),
compression = require('compression'),
_ = require('lodash'),
fs = require('fs-extra'),
colors = require('colors'),
passport = require('passport'),
flash = require('connect-flash'),
localStrategyMiddleware = require('./middlewares/localStrategy'),
logMiddleware = require('./middlewares/log'),
localsMiddleware = require('./middlewares/locals'),
securityMiddleware = require('./middlewares/security');
this.app.use(session({
secret : 'd4qs45sdq6',
// name : 'sessionId',
// proxy: true,
resave: true,
saveUninitialized: true
}));
this.app.use(flash());
this.app.use(function(request, response, next) {
response.locals.flash = {
info: request.flash('info'),
success: request.flash('success'),
warning: request.flash('warning'),
danger: request.flash('danger')
};
next();
});
this.app.use(passport.initialize());
this.app.use(passport.session());
this.app.post('/test', passport.authenticate('local', {
successRedirect: '/user/success',
failureRedirect: '/user/failure',
failureFlash: true,
successFlash: true
}), function(request, response) {
console.log('test');
});
My strategy (./middlewares/localStrategy
) :
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
sequelize = require('../databases/Database').connexion,
UserModel = require('../app/models/UserModel')(sequelize);
passport.use(new LocalStrategy(
function(username, password, done) {
console.log('test');
UserModel.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
console.log(user);
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log(id);
UserModel.findById(id, function(err, user) {
done(err, user);
});
});
module.exports = passport;
Issue : I get no logs and I'm every time redirected to user/failure
.
Edit 1 :
<form action="/test" method="post">
<input type="hidden" name="_csrf" value="<%=csrfToken%>">
<input type="text" name="user[username]" placeholder="username">
<input type="text" name="user[password]" placeholder="password">
<input type="submit">
<input type="reset">
</form>
If you are getting no logs then that tells you that your app.js file doesn't have access to the code in ./middlewares/localStrategy
Try changing
localStrategyMiddleware = require('./middlewares/localStrategy')
to simply
require('./middlewares/localStrategy')
Also you need to change your name attributes on your form to match with those that passport uses, I think the default are username and password, so unless you want to specify alternatives in your localStrategy you should use the following.
<input type="text" name="username" placeholder="username">
<input type="text" name="password" placeholder="password">