Last active
January 8, 2016 03:24
-
-
Save miyamotodev123/11438739cbc0b99b6494 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// config/passport.js | |
// load all the things we need | |
var LocalStrategy = require('passport-local').Strategy; | |
// load up the user model | |
var User = require('../app/models/user'); | |
// expose this function to our app using module.exports | |
module.exports = function(passport) { | |
// ========================================================================= | |
// passport session setup ================================================== | |
// ========================================================================= | |
// required for persistent login sessions | |
// passport needs ability to serialize and unserialize users out of session | |
// used to serialize the user for the session | |
passport.serializeUser(function(user, done) { | |
done(null, user.id); | |
}); | |
// used to deserialize the user | |
passport.deserializeUser(function(id, done) { | |
User.findById(id, function(err, user) { | |
done(err, user); | |
}); | |
}); | |
// ========================================================================= | |
// LOCAL SIGNUP ============================================================ | |
// ========================================================================= | |
// we are using named strategies since we have one for login and one for signup | |
// by default, if there was no name, it would just be called 'local' | |
passport.use('local-signup', new LocalStrategy({ | |
// by default, local strategy uses username and password, we will override with email | |
usernameField : 'email', | |
passwordField : 'password', | |
passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not) | |
}, | |
function(req, email, password, done) { | |
if (email) | |
email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching | |
// asynchronous | |
process.nextTick(function() { | |
// if the user is not already logged in: | |
if (!req.user) { | |
User.findOne({ 'local.email' : email }, function(err, user) { | |
// if there are any errors, return the error | |
if (err) | |
return done(err); | |
// check to see if theres already a user with that email | |
if (user) { | |
return done(null, { error: 'That email is already taken.' }); | |
} else { | |
// create the user | |
var newUser = new User(); | |
newUser.local.email = email; | |
newUser.local.password = newUser.generateHash(password); | |
newUser.save(function(err) { | |
if (err) | |
throw err; | |
return done(null, newUser); | |
}); | |
} | |
}); | |
// if the user is logged in but has no local account... | |
} else if ( !req.user.local.email ) { | |
// ...presumably they're trying to connect a local account | |
var user = req.user; | |
user.local.email = email; | |
user.local.password = user.generateHash(password); | |
user.save(function(err) { | |
if (err) | |
throw err; | |
return done(null, user); | |
}); | |
} else { | |
// user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!) | |
return done(null, req.user); | |
} | |
}); | |
})); | |
// LOCAL LOGIN ============================================================ | |
passport.use('local-login', new LocalStrategy({ | |
usernameField: 'email', | |
passwordField: 'password', | |
passReqToCallback: true | |
}, | |
function (req, email, password, done) { | |
if (email) { | |
email = email.toLowerCase(); | |
} | |
process.nextTick(function () { | |
User.findOne({'local.email': email}, function (err, user) { | |
if (err) { | |
return done(err); | |
} | |
if (!user) | |
return done(null, {error: 'No user found.'}); | |
return done(null, user); | |
}); | |
}); | |
})); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment