UNPKG

passport-userapp

Version:

Password and token authentication strategy using UserApp for Passport

142 lines (114 loc) 4.04 kB
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'); }