const _ = require('lodash'); const passport = require('passport'); const crypto = require('crypto'); const { Strategy: LocalStrategy } = require('passport-local'); const { Strategy: CustomStrategy } = require('passport-custom'); const models = require('./models'); const securityHelper = require('../helpers/security.helper'); const authService = require('../modules/auth/auth.service'); const userService = require('../modules/auth/user.service'); /** * Validación sobre firebase */ var firebase_admin = require('firebase-admin'); var serviceAccount = require('../firebase-key.json'); firebase_admin.initializeApp({ credential: firebase_admin.credential.cert(serviceAccount), databaseURL: "https://app-lqdvi-v2.firebaseio.com" }); passport.serializeUser((user, done) => { console.log('serializarUsuario'); done(null, user.id); }); passport.deserializeUser((id, done) => { console.log('desserializarUsuario'); models.User.findById(id, (err, user) => { done(err, user); }); }); /** * Sign in using Email and Password. */ const localEmailOptions = { usernameField: 'email', passwordField: 'password', } passport.use('local-email', new LocalStrategy(localEmailOptions, async (email, password, done) => { try { let user = await authService.extraMethods.findUser({ email }); if (_.isNull(user)) { return done(null, false, { message: 'User not found' }) } else { var password_encoded = crypto.createHash('sha512').update(password).digest('hex'); const isPasswordValid = await user.comparePassword(password_encoded); if (!isPasswordValid) { return done(null, false, { message: 'Wrong Password' }) } else { user = user.toJSON(); delete user.password; return done(null, user, { message: 'Logged in Successfully' }); } } } catch (error) { return done(error); } })); /** * Register using phone. */ const localPhoneOptions = { usernameField: 'phone', passwordField: 'fbuid', } passport.use('local-phone', new LocalStrategy(localPhoneOptions, async (phone, fbuid, done) => { try { console.log('PASSPORT - local-phone'); firebase_admin.auth().getUserByPhoneNumber(phone) .then(function(userRecord) { if (userRecord && userRecord.toJSON().uid == fbuid) { if (userRecord.toJSON().disabled) return done(null, false, { message: 'User disabled in fb' }) else return done(null, userRecord.toJSON(), { message: 'Register user' }); } else return done(null, false, { message: 'User not validate in fb' }); }) .catch(function (error) { //Servicio firebase caido o no funciona pero devuelvo el usuario const user = { phone: phone, fbuid: fbuid }; return done(null, user, error); }) } catch (error) { return done(null, false, error); } })); // JWT passport.use('jwt', new CustomStrategy(async (req, done) => { const token = ((req && req.headers && req.headers['x-access-token']) ? req.headers['x-access-token'] : null); const appVersion = ((req && req.headers && req.headers['accept-version']) ? req.headers['accept-version'] : null); console.log('appVersion: ', appVersion); if (!token) { console.error('Unauthorized. Token missing.'); return done(null, false, { message: 'Unauthorized. Token missing.'}); } const result = securityHelper.verify(token); //console.log('token result => ', result); if (result && result.id) { //recuperamos el usuario de la petición let user = await authService.extraMethods.findUser({ id: result.id }); if (user) { user = user.toJSON(); const result = userService._updateLastLoginAndVersionUser(user.id, appVersion); user.app_version = appVersion; delete user.password; console.log('Logged in Successfully'); return done(null, user, { message: 'Logged in Successfully' }); } else { console.error('Unauthorized. User not found.'); return done(null, false, { message: 'Unauthorized. User not found.' }); } } else { //console.log('Token no válido'); console.error('Unauthorized. Invalid token.'); return done(null, false, { message: 'Unauthorized. Invalid token.' }); } }));