Finally got angular to work with express partial routes
This commit is contained in:
@@ -1,179 +1,47 @@
|
||||
var passport = require('passport'),
|
||||
User = require('../models/User'),
|
||||
crypto = require('crypto'),
|
||||
var passport = require('passport'),
|
||||
LocalStrategy = require('passport-local').Strategy,
|
||||
TwitterStrategy = require('passport-twitter').Strategy,
|
||||
FacebookStrategy = require('passport-facebook').Strategy,
|
||||
GoogleStrategy = require('passport-google').Strategy,
|
||||
LinkedInStrategy = require('passport-linkedin').Strategy,
|
||||
userRoles = require('../../client/js/routingConfig').userRoles;
|
||||
User = require('../models/user');
|
||||
|
||||
passport.serializeUser(function(user, done) {
|
||||
done(null, user.id);
|
||||
});
|
||||
|
||||
function findByUsername(username, callback) {
|
||||
passport.deserializeUser(function(id, done) {
|
||||
User.findById(id, function (err, user) {
|
||||
done(err, user);
|
||||
});
|
||||
});
|
||||
|
||||
passport.use(new LocalStrategy(function(username, password, done) {
|
||||
User.findOne({ username: username }, function(err, user) {
|
||||
if (user) callback(err, user);
|
||||
});
|
||||
}
|
||||
|
||||
function findOrCreateOauthUser(provider, providerId, callback) {
|
||||
User.findOne({ $where: provider + '===' + providerId }, function(err, user) {
|
||||
if (user) return user;
|
||||
user = {
|
||||
username: provider + '_user',
|
||||
role: userRoles.user,
|
||||
provider: provider
|
||||
};
|
||||
user[provider] = providerId;
|
||||
user.save(function(err) {
|
||||
callback(err, user);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function findAll(callback) {
|
||||
User.find(function(err, users) {
|
||||
callback(err, users);
|
||||
});
|
||||
}
|
||||
|
||||
function findById(id, callback) {
|
||||
User.findById(id, function(err, user) {
|
||||
if (user) callback(err, user);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
|
||||
register: function(req, res, next) {
|
||||
findByUsername(req.body.username, function(err, user) {
|
||||
if (user) return res.send(403, 'User already exists');
|
||||
|
||||
user = new User({
|
||||
username: req.body.username,
|
||||
password: req.body.password,
|
||||
role: req.body.role
|
||||
});
|
||||
|
||||
user.save(function(err) {
|
||||
req.logIn(user, function(err) {
|
||||
if (err) next(err);
|
||||
else res.send(200, { role: user.role, username: user.username });
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
login: function(req, res, next) {
|
||||
passport.authenticate('local', function(err, user) {
|
||||
if (err) return next(err);
|
||||
if (!user) return res.send(400);
|
||||
req.logIn(user, function(err) {
|
||||
if (err) return next(err);
|
||||
if (req.body.rememberme) req.session.cookie.maxAge = 1000 * 60 * 60 * 24 * 7;
|
||||
res.json(200, { role: user.role, username: user.username });
|
||||
});
|
||||
})(req, res, next);
|
||||
},
|
||||
|
||||
logout: function(req, res) {
|
||||
req.logout();
|
||||
res.send(200);
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
localStrategy: new LocalStrategy(function(username, password, done) {
|
||||
findByUsername(username, function(err, user) {
|
||||
if (!user) {
|
||||
done(null, false, { message: 'Username does not exist' });
|
||||
} else if (user.password !== password) {
|
||||
done(null, false, { message: 'Incorrect password' });
|
||||
} else {
|
||||
if (err) { return done(err); }
|
||||
if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
|
||||
user.comparePassword(password, function(err, isMatch) {
|
||||
if (err) return done(err);
|
||||
if(isMatch) {
|
||||
return done(null, user);
|
||||
}
|
||||
});
|
||||
}),
|
||||
|
||||
twitterStrategy: function() {
|
||||
if (!process.env.TWITTER_CONSUMER_KEY) throw new Error('A Twitter Consumer Key is required if you want to enable login via Twitter.');
|
||||
if (!process.env.TWITTER_CONSUMER_SECRET) throw new Error('A Twitter Consumer Secret is required if you want to enable login via Twitter.');
|
||||
|
||||
return new TwitterStrategy({
|
||||
consumerKey: process.env.TWITTER_CONSUMER_KEY,
|
||||
consumerSecret: process.env.TWITTER_CONSUMER_SECRET,
|
||||
callbackURL: process.env.TWITTER_CALLBACK_URL || 'http://localhost:8000/auth/twitter/callback'
|
||||
},
|
||||
function(token, tokenSecret, profile, done) {
|
||||
findOrCreateOauthUser(profile.provider, profile.id, function(err, user) {
|
||||
done(err, user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
facebookStrategy: function() {
|
||||
if (!process.env.FACEBOOK_APP_ID) throw new Error('A Facebook App ID is required if you want to enable login via Facebook.');
|
||||
if (!process.env.FACEBOOK_APP_SECRET) throw new Error('A Facebook App Secret is required if you want to enable login via Facebook.');
|
||||
|
||||
return new FacebookStrategy({
|
||||
clientID: process.env.FACEBOOK_APP_ID,
|
||||
clientSecret: process.env.FACEBOOK_APP_SECRET,
|
||||
callbackURL: process.env.FACEBOOK_CALLBACK_URL || "http://localhost:8000/auth/facebook/callback"
|
||||
},
|
||||
function(accessToken, refreshToken, profile, done) {
|
||||
findOrCreateOauthUser(profile.provider, profile.id, function(err, user) {
|
||||
done(err, user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
googleStrategy: function() {
|
||||
|
||||
return new GoogleStrategy({
|
||||
returnURL: process.env.GOOGLE_RETURN_URL || "http://localhost:8000/auth/google/return",
|
||||
realm: process.env.GOOGLE_REALM || "http://localhost:8000/"
|
||||
},
|
||||
function(identifier, profile, done) {
|
||||
findOrCreateOauthUser('google', identifier, function(err, user) {
|
||||
done(err, user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
linkedInStrategy: function() {
|
||||
if (!process.env.LINKED_IN_KEY) throw new Error('A LinkedIn App Key is required if you want to enable login via LinkedIn.');
|
||||
if (!process.env.LINKED_IN_SECRET) throw new Error('A LinkedIn App Secret is required if you want to enable login via LinkedIn.');
|
||||
|
||||
return new LinkedInStrategy({
|
||||
consumerKey: process.env.LINKED_IN_KEY,
|
||||
consumerSecret: process.env.LINKED_IN_SECRET,
|
||||
callbackURL: process.env.LINKED_IN_CALLBACK_URL || "http://localhost:8000/auth/linkedin/callback"
|
||||
},
|
||||
function(token, tokenSecret, profile, done) {
|
||||
findOrCreateOauthUser('linkedin', profile.id, function(err, user) {
|
||||
done(err, user);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
serializeUser: function(user, done) {
|
||||
done(null, user.id);
|
||||
},
|
||||
|
||||
deserializeUser: function(id, done) {
|
||||
findById(id, function(err, user) {
|
||||
if (user) {
|
||||
done(null, user);
|
||||
} else {
|
||||
done(null, false);
|
||||
return done(null, false, { message: 'Invalid password' });
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
||||
// Simple route middleware to ensure user is authenticated. Otherwise send to login page.
|
||||
exports.ensureAuthenticated = function ensureAuthenticated(req, res, next) {
|
||||
if (req.isAuthenticated()) { return next(); }
|
||||
res.redirect('/login');
|
||||
};
|
||||
|
||||
|
||||
// Check for admin middleware, this is unrelated to passport.js
|
||||
// You can delete this if you use different method to check for admins or don't need admins
|
||||
exports.ensureAdmin = function ensureAdmin(req, res, next) {
|
||||
return function(req, res, next) {
|
||||
console.log(req.user);
|
||||
if(req.user && req.user.admin === true)
|
||||
next();
|
||||
else
|
||||
res.send(403);
|
||||
};
|
||||
};
|
Reference in New Issue
Block a user