142 lines
4.8 KiB
JavaScript
142 lines
4.8 KiB
JavaScript
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('appVEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEErsion: ', appVersion);
|
|
|
|
if (!token) {
|
|
//console.log('no tengo token');
|
|
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();
|
|
if (appVersion) {
|
|
if (user.app_version != appVersion){
|
|
const result = userService._updateLastLoginAndVersionUser(user.id, appVersion);
|
|
console.log('PRUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEBA>>>> ', result);
|
|
user.app_version = appVersion;
|
|
}
|
|
}
|
|
delete user.password;
|
|
//console.log('Usuario encontrado', user);
|
|
return done(null, user, { message: 'Logged in Successfully' });
|
|
}
|
|
else {
|
|
//console.log('Usuario no encontrado');
|
|
return done(null, false, { message: 'Unauthorized. User not found.' });
|
|
}
|
|
}
|
|
else {
|
|
//console.log('Token no válido');
|
|
return done(null, false, { message: 'Unauthorized. Invalid token.' });
|
|
}
|
|
|
|
}));
|
|
|