app2-api/core/passport.js
2019-07-09 14:52:22 +02:00

119 lines
3.8 KiB
JavaScript

const _ = require('lodash');
const passport = require('passport');
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');
/**
* Validación sobre firebase
*/
var admin = require('firebase-admin');
var serviceAccount = require('../firebase-key.json');
admin.initializeApp({
credential: 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 {
const user = await authService.extraMethods.findUser({ email });
if (_.isNull(user)) {
return done(null, false, { message: 'User not found' })
} else {
const isPasswordValid = await user.comparePassword(password);
if (!isPasswordValid) {
return done(null, false, { message: 'Wrong Password' })
} else {
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('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><');
//Comprobamos si el usuario ya existe en nuestro sistema
const user = await authService.extraMethods.findUser({ phone, fbuid });
if (_.isNull(user)) {
admin.auth().getUserByPhoneNumber(phone)
.then(function(userRecord) {
console.log(userRecord.toJSON());
if (userRecord && userRecord.toJSON().uid == fbuid) {
if (userRecord.toJSON().disabled) {
console.log('aaaaa');
return done(null, false, { message: 'User disabled in fb' });
}
else {
console.log('bbbbbb');
return done(null, true, { 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
return done(null, user, error);
})
} else {
//Usuario encontrado y validado
return done(null, user.toJSON(), { message: 'User found' });
}
} 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);
console.log(token);
if (!token) {
return done(null, false, { message: 'Unauthorized'});
}
return done(null, securityHelper.verify(token));
}));