Reputation: 4972
I'm new to Node.js. Trying to set up user account creation and log in using Passport.
I chose Passport due to its popularity, however I can't seem to piece together a working authentication process based off of the documentation on the Passport site.
Does anyone know of a tutorial for setting this up? Preferably one where you can download the source code.
I'll share my app.js file, perhaps that will reveal what is lacking.
var express = require('express')
, routes = require('./routes')
, home = require('./routes/home')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, flash = require('connect-flash');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ cookie: { maxAge: 60000 }, secret: 'keyboard cat' }));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(username, password, done) {
User.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);
});
}
));
app.get('/', routes.index);
app.post('/login',
passport.authenticate('local', {
successRedirect: '/home',
failureRedirect: '/',
failureFlash: true
})
);
app.get('/home', home.dashboard);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Note: This code simply returns me to the root page when attempting to log in. I realize that I don't have any actual user accounts at this point, however I would like to at least get a successful log in with a fake user. What am I missing?
Upvotes: 3
Views: 4405
Reputation: 4972
var express = require('express')
, routes = require('./routes')
, home = require('./routes/home')
, user = require('./routes/user')
, http = require('http')
, mongodb = require('mongodb')
, mongoose = require('mongoose')
, path = require('path')
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, flash = require('connect-flash')
;
var app = express();
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
console.log('Connected to DB');
});
var userSchema = mongoose.Schema({
username: String,
password: String
});
userSchema.methods.validPassword = function (password) {
if (password === this.password) {
return true;
} else {
return false;
}
}
var User = mongoose.model('User', userSchema);
var user = new User({ username: 'andrew', password: 'secret' });
user.save();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ cookie: { maxAge: 60000 }, secret: 'keyboard cat' }));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use(new LocalStrategy(function(username, password, done) {
User.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);
});
}
));
app.get('/', routes.index);
app.post('/login',
passport.authenticate('local', {
successRedirect: '/home',
failureRedirect: '/',
failureFlash: true
})
);
app.get('/home', home.dashboard);
app.get('/users', user.list);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
Upvotes: 7
Reputation: 2336
There is an example using passport-local
with Express
as a part of the passport-local source. It may be helpful to set the failureRedirect
of the passport.authenticate
call to the login
page and add the necessary code to your login view template to show flash messages, see the linked source. If you need more help, check out the source of the other passport modules.
It appears that the problem might be in the callback for the LocalStrategy
. The User
model does not appear to have been required.
Upvotes: 0