const config = require('../config'); const providers = config.providers; const helpers = require('../helpers'); const db = require('../db/models'); const passport = require('passport'); const JWTstrategy = require('passport-jwt').Strategy; const ExtractJWT = require('passport-jwt').ExtractJwt; const GoogleStrategy = require('passport-google-oauth2').Strategy; const MicrosoftStrategy = require('passport-microsoft').Strategy; const UsersDBApi = require('../db/api/users'); passport.use(new JWTstrategy({ passReqToCallback: true, secretOrKey: config.secret_key, jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken() }, async (req, token, done) => { try { const user = await UsersDBApi.findBy( {email: token.user.email}); if (user && user.disabled) { return done (new Error(`User '${user.email}' is disabled`)); } req.currentUser = user; return done(null, user); } catch (error) { done(error); } })); passport.use(new GoogleStrategy({ clientID: config.google.clientId, clientSecret: config.google.clientSecret, callbackURL: config.apiUrl + '/auth/signin/google/callback', passReqToCallback: true }, function (request, accessToken, refreshToken, profile, done) { socialStrategy(profile.email, profile, providers.GOOGLE, done); } )); passport.use(new MicrosoftStrategy({ clientID: config.microsoft.clientId, clientSecret: config.microsoft.clientSecret, callbackURL: config.apiUrl + '/auth/signin/microsoft/callback', passReqToCallback: true }, function (request, accessToken, refreshToken, profile, done) { const email = profile._json.mail || profile._json.userPrincipalName; socialStrategy(email, profile, providers.MICROSOFT, done); } )); function socialStrategy(email, profile, provider, done) { db.users.findOrCreate({where: {email, provider}}).then(([user, created]) => { const body = { id: user.id, email: user.email, name: profile.displayName, }; const token = helpers.jwtSign({user: body}); return done(null, {token}); }); }