// dependencies
var mongoose = require('mongoose')
, LocalStrategy = require('passport-local').Strategy
, FacebookStrategy = require('passport-facebook').Strategy
, TwitterStrategy = require('passport-twitter').Strategy
, HashStrategy = require('passport-hash').Strategy
, User = mongoose.model('User')
, Access = mongoose.model('Access');
/**
* This is where the magic happends
*/
module.exports = function (passport, config) {
// serialize sessions
passport.serializeUser( function(user, done) {
done(null, user.id);
});
passport.deserializeUser( function(id, done) {
User.findOne({ _id: id }, function(err, user) {
done(err, user);
});
});
/**
* Local strategy
*/
passport.use('local', new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function(email, password, done) {
// looks up the user in the database, and check if password matches
User.findOne({ email: email }, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Unknown user' });
if (!user.authenticate(password)) return done(null, false, { message: 'Invalid password' });
return done(null, user); // yay!
});
}));
passport.use(new HashStrategy({ passReqToCallback: true }, function(req, hash, done) {
Access.findOne({ randomToken: hash }, function(err, access) {
if (err) return done(err);
if (!access) return done(null, false, { message: 'Unknown link' });
User.findOne({ _id: access.user }, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Unknown user' });
return done(null, user); // yay!
});
});
}));
/**
* Facebook strategy
*/
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID
, clientSecret: config.facebook.clientSecret
, callbackURL: config.facebook.callbackURL
}, function(accessToken, refreshToken, profile, done) {
// looks up the user in the database. Will create the user if it does not exist
User.findOne({ 'facebook.id': profile.id }, function(err, user) {
if(err) return done(err);
if (!user) {
user = new User({
name: profile.displayName
, email: profile.emails[0].value
, username: profile.username
, provider: 'facebook'
, facebook: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
return done(err, user);
}
});
}));
/**
* Twitter strategy
*/
passport.use(new TwitterStrategy({
consumerKey: config.twitter.clientID
, consumerSecret: config.twitter.clientSecret
, callbackURL: config.twitter.callbackURL
}, function(token, tokenSecret, profile, done) {
// looks up the user in the database. Will create the user if it does not exist
User.findOne({ 'twitter.id': profile.id }, function(err, user) {
if (err) return done(err);
if (!user) {
user = new User({
name: profile.displayName
, username: profile.username
, provider: 'twitter'
, twitter: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
return done(err, user);
}
});
}));
}