-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of github.com:Fueled/Rover
* 'master' of github.com:Fueled/Rover: chore(*): Formatting the js per eslint feat(ROV-3): Empty state with instructions for My Projects feat(ROV-19): Added events sidebar to filter those events by function feat(Events): Format events to readable params chore(Rollbar): Configured Rollbar for Error Handling chore(Admin): Forest Admin Panel configured chore(*): Updated packages
- Loading branch information
Showing
19 changed files
with
2,541 additions
and
1,449 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
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 |
---|---|---|
@@ -1,115 +1,127 @@ | ||
const passport = require('passport'); | ||
const { Strategy: LocalStrategy } = require('passport-local'); | ||
const { OAuth2Strategy: GoogleStrategy } = require('passport-google-oauth'); | ||
const {Strategy: LocalStrategy} = require('passport-local'); | ||
const {OAuth2Strategy: GoogleStrategy} = require('passport-google-oauth'); | ||
|
||
const User = require('../models/User'); | ||
|
||
passport.serializeUser((user, done) => { | ||
done(null, user.id); | ||
done(null, user.id); | ||
}); | ||
|
||
passport.deserializeUser((id, done) => { | ||
User.findById(id, (err, user) => { | ||
done(err, user); | ||
}); | ||
User.findById(id, (err, user) => { | ||
done(err, user); | ||
}); | ||
}); | ||
|
||
/** | ||
* Sign in using Email and Password. | ||
*/ | ||
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => { | ||
User.findOne({ email: email.toLowerCase() }, (err, user) => { | ||
if (err) { return done(err); } | ||
if (!user) { | ||
return done(null, false, { msg: `Email ${email} not found.` }); | ||
} | ||
user.comparePassword(password, (err, isMatch) => { | ||
if (err) { return done(err); } | ||
if (isMatch) { | ||
return done(null, user); | ||
} | ||
return done(null, false, { msg: 'Invalid email or password.' }); | ||
passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => { | ||
User.findOne({email: email.toLowerCase()}, (err, user) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
if (!user) { | ||
return done(null, false, {msg: `Email ${email} not found.`}); | ||
} | ||
user.comparePassword(password, (err, isMatch) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
if (isMatch) { | ||
return done(null, user); | ||
} | ||
return done(null, false, {msg: 'Invalid email or password.'}); | ||
}); | ||
}); | ||
}); | ||
})); | ||
|
||
/** | ||
* Sign in with Google. | ||
*/ | ||
passport.use(new GoogleStrategy({ | ||
clientID: process.env.GOOGLE_ID, | ||
clientSecret: process.env.GOOGLE_SECRET, | ||
callbackURL: '/auth/google/callback', | ||
passReqToCallback: true | ||
clientID: process.env.GOOGLE_ID, | ||
clientSecret: process.env.GOOGLE_SECRET, | ||
callbackURL: '/auth/google/callback', | ||
passReqToCallback: true | ||
}, (req, accessToken, refreshToken, profile, done) => { | ||
if (req.user) { | ||
User.findOne({ google: profile.id }, (err, existingUser) => { | ||
if (err) { return done(err); } | ||
if (existingUser) { | ||
req.flash('errors', { msg: 'There is already a Google account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); | ||
done(err); | ||
} else { | ||
User.findById(req.user.id, (err, user) => { | ||
if (err) { return done(err); } | ||
user.google = profile.id; | ||
user.tokens.push({ kind: 'google', accessToken }); | ||
user.profile.name = user.profile.name || profile.displayName; | ||
user.profile.gender = user.profile.gender || profile._json.gender; | ||
user.profile.picture = user.profile.picture || profile._json.image.url; | ||
user.save((err) => { | ||
req.flash('info', { msg: 'Google account has been linked.' }); | ||
done(err, user); | ||
}); | ||
if (req.user) { | ||
User.findOne({google: profile.id}, (err, existingUser) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
if (existingUser) { | ||
req.flash('errors', {msg: 'There is already a Google account that belongs to you. Sign in with that account or delete it, then link it with your current account.'}); | ||
done(err); | ||
} else { | ||
User.findById(req.user.id, (err, user) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
user.google = profile.id; | ||
user.tokens.push({kind: 'google', accessToken}); | ||
user.profile.name = user.profile.name || profile.displayName; | ||
user.profile.gender = user.profile.gender || profile._json.gender; | ||
user.profile.picture = user.profile.picture || profile._json.image.url; | ||
user.save((err) => { | ||
req.flash('info', {msg: 'Google account has been linked.'}); | ||
done(err, user); | ||
}); | ||
}); | ||
} | ||
}); | ||
} | ||
}); | ||
} else { | ||
User.findOne({ google: profile.id }, (err, existingUser) => { | ||
if (err) { return done(err); } | ||
if (existingUser) { | ||
return done(null, existingUser); | ||
} | ||
User.findOne({ email: profile.emails[0].value }, (err, existingEmailUser) => { | ||
if (err) { return done(err); } | ||
if (existingEmailUser) { | ||
req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with Google manually from Account Settings.' }); | ||
done(err); | ||
} else { | ||
const user = new User(); | ||
user.email = profile.emails[0].value; | ||
user.google = profile.id; | ||
user.tokens.push({ kind: 'google', accessToken }); | ||
user.profile.name = profile.displayName; | ||
user.profile.gender = profile._json.gender; | ||
user.profile.picture = profile._json.image.url; | ||
user.save((err) => { | ||
done(err, user); | ||
}); | ||
} | ||
}); | ||
}); | ||
} | ||
} else { | ||
User.findOne({google: profile.id}, (err, existingUser) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
if (existingUser) { | ||
return done(null, existingUser); | ||
} | ||
User.findOne({email: profile.emails[0].value}, (err, existingEmailUser) => { | ||
if (err) { | ||
return done(err); | ||
} | ||
if (existingEmailUser) { | ||
req.flash('errors', {msg: 'There is already an account using this email address. Sign in to that account and link it with Google manually from Account Settings.'}); | ||
done(err); | ||
} else { | ||
const user = new User(); | ||
user.email = profile.emails[0].value; | ||
user.google = profile.id; | ||
user.tokens.push({kind: 'google', accessToken}); | ||
user.profile.name = profile.displayName; | ||
user.profile.gender = profile._json.gender; | ||
user.profile.picture = profile._json.image.url; | ||
user.save((err) => { | ||
done(err, user); | ||
}); | ||
} | ||
}); | ||
}); | ||
} | ||
})); | ||
|
||
/** | ||
* Login Required middleware. | ||
*/ | ||
exports.isAuthenticated = (req, res, next) => { | ||
if (req.isAuthenticated()) { | ||
return next(); | ||
} | ||
res.redirect('/login'); | ||
if (req.isAuthenticated()) { | ||
return next(); | ||
} | ||
res.redirect('/login'); | ||
}; | ||
|
||
/** | ||
* Authorization Required middleware. | ||
*/ | ||
exports.isAuthorized = (req, res, next) => { | ||
const provider = req.path.split('/').slice(-1)[0]; | ||
const token = req.user.tokens.find(token => token.kind === provider); | ||
if (token) { | ||
next(); | ||
} else { | ||
res.redirect(`/auth/${provider}`); | ||
} | ||
const provider = req.path.split('/').slice(-1)[0]; | ||
const token = req.user.tokens.find(token => token.kind === provider); | ||
if (token) { | ||
next(); | ||
} else { | ||
res.redirect(`/auth/${provider}`); | ||
} | ||
}; |
Oops, something went wrong.