passport-userapp
Version:
Password and token authentication strategy using UserApp for Passport
142 lines (114 loc) • 4.04 kB
JavaScript
var express = require('express'),
http = require('http'),
passport = require('passport'),
flash = require('connect-flash'),
_ = require('underscore'),
UserApp = require('userapp'),
UserAppStrategy = require('passport-userapp').Strategy;
var users = [];
var appId = 'YOUR-USERAPP-APP-ID'; // Your UserApp App Id: https://help.userapp.io/customer/portal/articles/1322336-how-do-i-find-my-app-id-
// Don't for get to init UserApp
UserApp.initialize({ appId: appId });
// Passport session setup
passport.serializeUser(function (user, done) {
done(null, user.username);
});
passport.deserializeUser(function (username, done) {
var user = _.find(users, function (user) {
return user.username == username;
});
if (user === undefined) {
done(new Error('No user with username "' + username + '" found.'));
} else {
done(null, user);
}
});
// Use the UserAppStrategy within Passport
passport.use(
new UserAppStrategy({
appId: appId
},
function (userprofile, done) {
process.nextTick(function () {
var exists = _.any(users, function (user) {
return user.id == userprofile.id;
});
if (!exists) {
users.push(userprofile);
}
return done(null, userprofile);
});
}
));
var app = express();
// Configure Express
app.configure(function () {
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs-locals'));
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({ secret: 'secret' }));
app.use(flash());
// Initialize Passport
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(__dirname + '/../../public'));
});
app.get('/', function (req, res) {
res.render('index', { user:req.user });
});
app.get('/account', ensureAuthenticated, function (req, res) {
res.render('account', { user:req.user });
});
app.get('/login', function (req, res) {
res.render('login', { user:req.user, message:req.flash('error') });
});
app.get('/signup', function (req, res){
res.render('signup', { user: false, message:req.flash('error') });
});
app.post('/signup',
//first we need to create the user in UserApp
function createUser(req, res, next){
// the HTML form names are conveniently named the same as
// the UserApp fields...
var user = req.body;
// Create the user in UserApp
UserApp.User.save(user, function(err, user){
// We can just pass through messages like "Password must be at least 5 characters." etc.
if (err) return res.render('signup', {user: false, message: err.message});
// UserApp passport needs a username parameter
req.body.username = req.body.login;
//on to authentication
next();
});
// authenticate the user using passport
}, passport.authenticate('userapp', { failureRedirect: '/signup', failureFlash: 'Error logging in user' }),
function serveAccount(req, res, next){
// console.log(req.user);
res.redirect('/');
});
app.post('/login',
passport.authenticate('userapp', { failureRedirect: '/login', failureFlash: 'Invalid username or password.'}),
function (req, res) {
res.redirect('/');
}
);
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'));
});
// Simple route middleware to ensure user is authenticated
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}