-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
1,309 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
// possible Oauth keys for Google or facebook |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
// config/database.js | ||
module.exports = { | ||
|
||
'url' : 'mongodb://kevin:[email protected]:17509/learingnode' | ||
//looks like mongodb://<user>:<pass>@mongo.onmodulus.net:27017/Mikha4ot | ||
|
||
}; |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
// config/passport.js | ||
|
||
// load all the things we need | ||
var LocalStrategy = require('passport-local').Strategy; | ||
|
||
// load up the user model | ||
var User = require('../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 back the entire request to the callback | ||
}, | ||
function(req, email, password, done) { | ||
|
||
// asynchronous | ||
// User.findOne wont fire unless data is sent back | ||
process.nextTick(function() { | ||
|
||
// find a user whose email is the same as the forms email | ||
// we are checking to see if the user trying to login already exists | ||
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, false, req.flash('signupMessage', 'That email is already taken.')); | ||
} else { | ||
|
||
// if there is no user with that email | ||
// create the user | ||
var newUser = new User(); | ||
|
||
// set the user's local credentials | ||
newUser.local.email = email; | ||
newUser.local.password = newUser.generateHash(password); | ||
|
||
// save the user | ||
newUser.save(function(err) { | ||
if (err) | ||
throw err; | ||
return done(null, newUser); | ||
}); | ||
} | ||
}); | ||
}); | ||
})); | ||
|
||
// ========================================================================= | ||
// LOCAL LOGIN ============================================================= | ||
// ========================================================================= | ||
// 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-login', 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 back the entire request to the callback | ||
}, | ||
function(req, email, password, done) { // callback with email and password from our form | ||
|
||
// find a user whose email is the same as the forms email | ||
// we are checking to see if the user trying to login already exists | ||
User.findOne({ 'local.email' : email }, function(err, user) { | ||
// if there are any errors, return the error before anything else | ||
if (err) | ||
return done(err); | ||
|
||
// if no user is found, return the message | ||
if (!user) | ||
return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash | ||
|
||
// if the user is found but the password is wrong | ||
if (!user.validPassword(password)) | ||
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata | ||
|
||
// all is well, return successful user | ||
return done(null, user); | ||
}); | ||
|
||
})); | ||
|
||
}; |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// app/models/user.js | ||
// load the things we need | ||
var mongoose = require('mongoose'); | ||
var bcrypt = require('bcrypt-nodejs'); | ||
|
||
// define the schema for our user model | ||
var userSchema = mongoose.Schema({ | ||
|
||
local : { | ||
email : String, | ||
password : String, | ||
}, | ||
facebook : { | ||
id : String, | ||
token : String, | ||
name : String, | ||
email : String | ||
}, | ||
twitter : { | ||
id : String, | ||
token : String, | ||
displayName : String, | ||
username : String | ||
}, | ||
google : { | ||
id : String, | ||
token : String, | ||
email : String, | ||
name : String | ||
} | ||
|
||
}); | ||
|
||
// methods ====================== | ||
// generating a hash | ||
userSchema.methods.generateHash = function(password) { | ||
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); | ||
}; | ||
|
||
// checking if password is valid | ||
userSchema.methods.validPassword = function(password) { | ||
return bcrypt.compareSync(password, this.local.password); | ||
}; | ||
|
||
// create the model for users and expose it to our app | ||
module.exports = mongoose.model('User', userSchema); |
Oops, something went wrong.