app2-api/core/passport.js

142 lines
4.7 KiB
JavaScript
Raw Normal View History

2019-04-24 21:01:54 +00:00
const _ = require('lodash');
const passport = require('passport');
2019-07-21 13:30:49 +00:00
const crypto = require('crypto');
2019-04-24 21:01:54 +00:00
const { Strategy: LocalStrategy } = require('passport-local');
2019-07-09 12:52:22 +00:00
const { Strategy: CustomStrategy } = require('passport-custom');
2019-04-24 21:01:54 +00:00
const models = require('./models');
const securityHelper = require('../helpers/security.helper');
2019-07-10 17:26:22 +00:00
const authService = require('../modules/auth/auth.service');
2019-09-09 10:06:29 +00:00
const userService = require('../modules/auth/user.service');
2019-04-24 21:01:54 +00:00
/**
* Validación sobre firebase
*/
2019-07-09 13:59:58 +00:00
var firebase_admin = require('firebase-admin');
var serviceAccount = require('../firebase-key.json');
2019-07-09 13:59:58 +00:00
firebase_admin.initializeApp({
credential: firebase_admin.credential.cert(serviceAccount),
databaseURL: "https://app-lqdvi-v2.firebaseio.com"
});
2019-04-24 21:01:54 +00:00
passport.serializeUser((user, done) => {
console.log('serializarUsuario');
2019-04-24 21:01:54 +00:00
done(null, user.id);
});
passport.deserializeUser((id, done) => {
console.log('desserializarUsuario');
2019-04-24 21:01:54 +00:00
models.User.findById(id, (err, user) => {
done(err, user);
});
});
/**
* Sign in using Email and Password.
*/
const localEmailOptions = {
2019-04-24 21:01:54 +00:00
usernameField: 'email',
passwordField: 'password',
2019-04-24 21:01:54 +00:00
}
passport.use('local-email', new LocalStrategy(localEmailOptions, async (email, password, done) => {
2019-04-24 21:01:54 +00:00
try {
2019-08-07 13:55:58 +00:00
let user = await authService.extraMethods.findUser({ email });
2019-04-24 21:01:54 +00:00
if (_.isNull(user)) {
return done(null, false, { message: 'User not found' })
} else {
2019-07-21 13:30:49 +00:00
var password_encoded = crypto.createHash('sha512').update(password).digest('hex');
const isPasswordValid = await user.comparePassword(password_encoded);
2019-04-24 21:01:54 +00:00
if (!isPasswordValid) {
return done(null, false, { message: 'Wrong Password' })
} else {
2019-08-06 17:23:56 +00:00
user = user.toJSON();
2019-05-09 16:23:54 +00:00
delete user.password;
2019-04-24 21:01:54 +00:00
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 {
2019-08-28 17:12:33 +00:00
console.log('PASSPORT - local-phone');
2019-07-09 13:59:58 +00:00
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
2019-08-03 17:11:32 +00:00
return done(null, userRecord.toJSON(), { message: 'Register user' });
2019-07-09 13:59:58 +00:00
}
else
return done(null, false, { message: 'User not validate in fb' });
})
.catch(function (error) {
//Servicio firebase caido o no funciona pero devuelvo el usuario
2019-08-03 17:11:32 +00:00
const user = {
phone: phone,
fbuid: fbuid
};
2019-07-09 13:59:58 +00:00
return done(null, user, error);
})
} catch (error) {
return done(null, false, error);
}
}));
2019-04-24 21:01:54 +00:00
2019-07-09 12:52:22 +00:00
// 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);
2019-09-09 10:06:29 +00:00
const appVersion = ((req && req.headers && req.headers['accept-version']) ? req.headers['accept-version'] : null);
2019-10-03 19:37:56 +00:00
console.log('appVersion: ', appVersion);
2019-08-03 17:11:32 +00:00
2019-07-09 12:52:22 +00:00
if (!token) {
2019-10-14 15:25:35 +00:00
console.error('Unauthorized. Token missing.');
2019-08-04 07:29:13 +00:00
return done(null, false, { message: 'Unauthorized. Token missing.'});
2019-04-24 21:01:54 +00:00
}
2019-07-09 12:52:22 +00:00
2019-07-21 13:57:56 +00:00
const result = securityHelper.verify(token);
2019-08-18 21:15:34 +00:00
//console.log('token result => ', result);
2019-08-04 07:29:13 +00:00
2019-08-09 11:28:35 +00:00
if (result && result.id) {
2019-07-21 14:12:13 +00:00
//recuperamos el usuario de la petición
2019-08-05 10:55:24 +00:00
let user = await authService.extraMethods.findUser({ id: result.id });
2019-08-05 15:34:59 +00:00
if (user) {
2019-08-06 17:23:56 +00:00
user = user.toJSON();
2019-09-09 10:06:29 +00:00
if (appVersion) {
if (user.app_version != appVersion){
2019-09-09 14:36:45 +00:00
const result = userService._updateLastLoginAndVersionUser(user.id, appVersion);
user.app_version = appVersion;
2019-09-09 10:06:29 +00:00
}
}
2019-08-06 17:23:56 +00:00
delete user.password;
2019-10-14 15:25:35 +00:00
console.log('Logged in Successfully');
2019-07-21 14:19:25 +00:00
return done(null, user, { message: 'Logged in Successfully' });
}
2019-08-05 15:34:59 +00:00
else {
2019-10-14 15:25:35 +00:00
console.error('Unauthorized. User not found.');
2019-08-04 07:29:13 +00:00
return done(null, false, { message: 'Unauthorized. User not found.' });
2019-08-06 17:23:56 +00:00
}
2019-07-21 13:57:56 +00:00
}
2019-10-14 15:25:35 +00:00
else {
2019-08-18 21:15:34 +00:00
//console.log('Token no válido');
2019-10-14 15:25:35 +00:00
console.error('Unauthorized. Invalid token.');
2019-08-04 07:29:13 +00:00
return done(null, false, { message: 'Unauthorized. Invalid token.' });
2019-07-21 13:57:56 +00:00
}
2019-04-24 21:01:54 +00:00
}));