Skip to content

Instantly share code, notes, and snippets.

@krasu
Created May 31, 2013 21:49
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save krasu/5688235 to your computer and use it in GitHub Desktop.
Save krasu/5688235 to your computer and use it in GitHub Desktop.
Passport + Node.js / Automatic login after adding user
/**
* Module dependencies.
*/
var express = require('express')
, passport = require('passport')
, http = require('http')
, path = require('path')
, LocalStrategy = require('passport-local').Strategy;
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
var AuthProvider = function() {
var users = []
this.findUserById = function(role, id, next) {
if (!users[id]) next('User not found')
else next(null, users[id])
}
this.getUserByEmail = function(role, email, next) {
var found
for (var v in users) {
if (!users[v] || users[v].email != email) continue
found = users[v]
found._id = v
return next(null, found)
}
next('User not found')
}
this.saveUser = function(user, next) {
var user = {
email: user.username,
password: user.password
}
authProvider.getUserByEmail('users', user.email, function(error, exists){
if (exists) {
console.log('User alredy exists')
return next('User alredy exists');
} else {
users.push(user)
return next(null, user)
}
})
}
}
var authProvider = new AuthProvider()
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
authProvider.findUserById('users', id, function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy( function(email, password, done) {
authProvider.getUserByEmail('users', email, function(error, user){
if(error) { return done(error); }
if (!user) { return done(null, false, { message: 'Unknown user ' + email });}
if (user.password != password) { return done(null, false);}
return done(null, user);
});
}
));
app.post('/login',
passport.authenticate('local', { failureRedirect: '/'}),
function(req, res) { res.redirect('/');});
app.post('/sign', function(req, res){
authProvider.saveUser(req.body, function(error, user){
if(error){
res.redirect('/');
} else {
passport.authenticate('local')(req, res, function () {
res.redirect('/');
})
}
});
});
app.get('/', function(req, res) { res.render('index', {user: req.user});});
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<% if (user) { %>
Welcome <%= user.email %><br>
<a href="/logout" title="">Log out</a>
<% } else { %>
<form action="/login" method="post" accept-charset="utf-8">
<input type="text" name="username" value="" placeholder="Email">
<input type="password" name="password" value="" placeholder="Password">
<input type="submit" name="login" value="LOGIN">
</form>
<form action="/sign" method="post" accept-charset="utf-8">
<input type="text" name="username" value="" placeholder="Email">
<input type="password" name="password" value="" placeholder="Password">
<input type="submit" name="login" value="Register">
</form>
<% } %>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment