- Initial commit... A DB, some routes, and basic authentication routines...

This commit is contained in:
2019-07-04 16:19:30 -04:00
commit d9a2d33913
32 changed files with 3465 additions and 0 deletions

5
strategies/auth/apple.js Normal file
View File

@@ -0,0 +1,5 @@
const passport = require('passport');
module.exports = function(passport) {
return passport;
};

View File

@@ -0,0 +1,46 @@
const passport = require('passport');
const FacebookStrategy = require('passport-facebook').Strategy;
const config = require('../../config');
const User = require('../../models/user');
module.exports = function(passport) {
passport.use(new FacebookStrategy(
{
clientID: config.services.facebook.appId,
clientSecret: config.services.facebook.appSecret,
callbackURL: 'http://localhost:3001/auth/facebook/callback',
profileFields: ['id', 'email', 'first_name', 'last_name', 'picture'],
},
(accessToken, refreshToken, profile, done) => {
const {
email,
first_name: firstName,
id: userId,
last_name: lastName,
picture: { data: { url = null } = {} } = {},
} = profile._json;
const avatar = url;
User.findOneAndUpdateOrCreate(
{
email,
},
{
accessToken,
method: profile.provider,
userId,
},
{
avatar,
email,
firstName,
lastName,
},
(err, user) => {
return done(err, user, { accessToken, refreshToken });
}
);
}
));
};

40
strategies/auth/google.js Normal file
View File

@@ -0,0 +1,40 @@
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
const config = require('../../config');
const User = require('../../models/user');
module.exports = function(passport) {
passport.use(new GoogleStrategy({
clientID: config.services.google.appId,
clientSecret: config.services.google.appSecret,
callbackURL: "http://www.example.com/auth/google/callback",
},
(accessToken, refreshToken, profile, callback) => {
const googleUser = profile.getBasicProfile();
User.findOrCreate(
{
email: googleUser.getEmail(),
'credentials.method': 'google',
'credentials.userId': googleUser.getId(),
},
{
avatar: googleUser.getImageUrl(),
email: googleUser.getEmail(),
firstName: googleUser.getGivenName(),
lastName: googleUser.getFamilyName(),
credentials: [{
accessToken,
userId: googleUser.getId(),
method: 'facebook',
profile,
}],
},
(err, user) => {
return done(err, user, { accessToken, refreshToken });
}
);
}
));
};

82
strategies/auth/index.js Normal file
View File

@@ -0,0 +1,82 @@
const createRequestUserObject = (req, user) => ({
isGuest: !(user && user.id),
isManager: user && user.isEventManager(),
isSelf: user && user.id === req.params.user_id,
record: user || null,
});
const authenticateBasic = (passport) => (req, res, next) => (
passport.authenticate('jwt', { session: false }, (err, user, info) => {
if (err) {
next(err);
}
req.user = createRequestUserObject(req, user);
next();
})(req, res, next)
);
const authenticateEventManager = (passport) => (req, res, next) => (
passport.authenticate('jwt', { session: false }, (err, user, info) => {
if (err) {
next(err);
}
const record = createRequestUserObject(req, user);
if (!user || !record.isManager) {
return res.send(401);
}
req.user = record;
next();
})(req, res, next)
);
const authenticateEventManagerOrSelf = (passport) => (req, res, next) => (
passport.authenticate('jwt', { session: false }, (err, user, info) => {
if (err) {
next(err);
}
const record = createRequestUserObject(req, user);
if (user && (!record.isManager && !record.isSelf)) {
return res.send(401);
}
req.user = record;
next();
})(req, res, next)
);
const authenticateSecure = (passport) => (req, res, next) => (
passport.authenticate('jwt', { session: false }, (err, user, info) => {
if (err) {
next(err);
}
if (!user) {
return res.send(401);
}
req.user = createRequestUserObject(req, user);
next();
})(req, res, next)
);
module.exports = function (passport) {
require('./apple.js')(passport);
require('./facebook.js')(passport);
require('./google.js')(passport);
require('./jwt.js')(passport);
require('./local.js')(passport);
return {
basic: authenticateBasic(passport),
manager: authenticateEventManager(passport),
managerOrSelf: authenticateEventManagerOrSelf(passport),
passport,
secure: authenticateSecure(passport),
};
};

30
strategies/auth/jwt.js Normal file
View File

@@ -0,0 +1,30 @@
const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const config = require('../../config');
const User = require('../../models/user');
module.exports = function(passport) {
passport.use(new JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: config.security.jwt.secret,
issuer: config.security.jwt.issuer,
audience: config.security.jwt.audience,
},
(jwt_payload, done) => {
User.findOne({ _id: jwt_payload.sub }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
}
return done(null, false);
});
}
));
}

24
strategies/auth/local.js Normal file
View File

@@ -0,0 +1,24 @@
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../../models/user');
module.exports = function(passport) {
passport.use(new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
},
(username, password, done) => {
User.findOne({ email: username }, (err, user) => {
if (err) { return done(err); }
if (!user || !user.validatePassword(password)) {
return done(null, false, { message: 'Incorrect username or password.' });
}
return done(null, user);
});
}
));
};

View File

@@ -0,0 +1,10 @@
module.exports = {
PUBLIC: {
credentials: 0,
isVerified: 0,
organizationIdentifier: 0,
paymentToken: 0,
},
PROTECTED: {},
};