Intento implementar PassportJs en NodeJs pero no estoy siendo capaz. El caso es que el resultado, es que haga lo que haga, siempre me dice que las credenciales no son correctas. No se si lo estoy realizando de la forma idonea, pero, ¿Alguien podría explicarme en que fallo?:
app.js:
'use strict' var express = require('express'), app = express(), expressSession = require('express-session'), bodyParser = require('body-parser'), passport = require('passport'), userRoutes = require('./routes/user-routes'); app.use(passport.initialize()); app.use(passport.session()); app.use(bodyParser.urlencoded({extended: false, limit: '50mb', paramterLimit: 500000})); app.use(bodyParser.json({limit: '50mb'})); app.use(expressSession({ secret: 'secretillo mio', resave: false, saveUninitialized: true, cookie: {secure: true} })); app.use('/api', userRoutes); module.exports = app;
passport.js:
'use strict' var passport = require('passport'), LocalStrategy = require('passport-local').Strategy, User = require('../models/user'); passport.serializeUser((user, done) => { done(null, user._id); }); passport.deserializeUser((id, done) => { User.findById(id, (err, user) => { done(err, user); }); }); passport.use(new LocalStrategy( {usernameField: 'email'}, (email, password, done) => { User.findOne({email}, (err, user) => { if (!user) { return done(null, false, {message: 'Este email: $ {email} no está registrado.'}); }else{ user.comparePass(password, (err, equals) => { if (equals) { return done(null, user); }else{ return done(null, false, {message: 'La contraseña no es valida.'}); } }); } }) } )); exports.authenticated = (req, res, next) => { if (req.isAutheticated()) { return next(); } return res.send({message: 'Tienes que hacer login para acceder a este recurso.'}); }
user-controller.js:
'use strict' var User = require('../models/user'), bcrypt = require('bcrypt-nodejs'), passport = require('passport'); function saveUser(req, res){ var user = new User(); var params = req.body; var email = params.email; user.email = params.email; user.password = params.password; user.name = params.name; User.findOne({email}, (err, existsUser) => { if (err) { return res.send({message: 'Error en el servidor al buscar registros similares.'}); } if (existsUser) { return res.send({message: 'El email solicitado, ya está registrado en la base de datos.'}); } if (user.password) { bcrypt.hash(user.password, null, null, (err, hash) => { user.password = hash; if (user.name != null && user.email != null) { user.save((err, userStored) => { if (err) { return res.send({message: 'Error al guardar el registro solicitado.'}); } return res.send({message: 'El registro ha sido guardado', user: userStored}); }); }else{ return res.send({message: 'Es necesario completar todos los campos.'}); } }); } }); } function getAllUsers(req, res){ User.find({}, (err, users) => { if (err) { return res.send({message: 'Error al buscar los registros solkicitados.'}); } return res.send({message: 'Se han encontrado estos registros: ', users: users}); }); } function singIn(req, res, next){ passport.authenticate('local', (err, user, info) => { if (err) { next(err); } if (!user) { return res.send({message:'Email o contraseña no validos.'}); } req.logIn(user, (err) => { if (err) { next(err); } res.send({message: 'Login exitoso.'}); }); })(req, res, next); } function logout(req, res){ req.logout(); res.send({message: 'Logout exitoso.'}); } module.exports = { saveUser, getAllUsers, singIn, logout }
routes.js:
var express = require('express'), router = express.Router(), userController = require('../controllers/user-controller'), passportConfig = require('../config/passport'); router.post('/singUp', userController.saveUser); router.post('/login', userController.singIn); router.get('/users', userController.getAllUsers); router.get('/logout', passportConfig.authenticated, userController.logout); module.exports = router;
user-model.js:
'use strict' var mongoose = require('mongoose'), Schema = mongoose.Schema, bcrypt = require('bcrypt-nodejs'); const userSchema = new Schema({ email: {type: String, unique: true, lowercase: true, required: true}, password: {type: String, required: true}, name: {type: String, required: true} }); userSchema.methods.comparePass = (password, cb) => { bcrypt.compare(password, this.password, (err, equals) => { if (err) { return cb(err); } cb(null, equals); }); } module.exports = mongoose.model('User', userSchema);
No se si no he entendido bien la documnetación, pero he hecho varios intentos. Este es el único que me responde, pero no de la forma en al que quiero. Gracias de antemano por la atención prestada.