Пустой пользователь в запросе при использовании промежуточного программного обеспечения - PullRequest
0 голосов
/ 08 мая 2019

У меня возникает проблема пустого req.user всякий раз, когда я использую промежуточное ПО checkAdmin в своих маршрутах

Поэтому я пытаюсь настроить это промежуточное ПО, чтобы проверить, является ли роль пользователя ADMIN, позволяющая ему создаватьновый пользователь, но он не работает, и когда я удаляю промежуточное ПО из моего маршрута, система работает нормально и сохраняет пользователя (ofc без проверки, является ли ADMIN)

Вот мой файл маршрутов:

const express = require('express');
const UserController = require('../controllers/user');
const { verificaToken, verificaAdminRol } = require('../middlewares/autenticacion');

const api = express.Router();

api.get('/home', UserController.home);
api.post('/login', UserController.loginUser);
api.post('/save', [verificaAdminRol, verificaToken], UserController.saveUser);
api.get('/listar/:id', verificaToken, UserController.getUsuario);
api.get('/listar', verificaToken, UserController.getAllUsers);
api.put('/actualizar/:id', verificaToken, UserController.actualizarUsuario);

module.exports = api;

Это мой файл контроллера:

const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const _ = require('underscore');
//Importar modelo
const User = require('../models/user');


function home(req, res) {
    res.json({ ok: true, msg: "home de usuarios" });
}

function saveUser(req, res) {

    //Recibimos los datos enviados
    let body = req.body;
    //Se crea un nuevo Objeto Usuario con los datos recibidos

    let user = new User({
        name: body.name,
        surname: body.surname,
        nick: body.nick,
        email: body.email,
        //Encriptación del password
        password: bcrypt.hashSync(body.password, 10),
        role: body.role
    });
    //Se guarda el user en la BD
    user.save((err, usuarioDB) => {

        if (err) {
            return res.status(400).json({
                ok: false,
                msg: `Error ${err}`
            })
        }

        return res.send({
            ok: true,
            user: usuarioDB,
            msg: "Usuario creado exitosamente."
        })
    });

}

function loginUser(req, res) {

    let body = req.body;

    User.findOne({ email: body.email }, (err, usuarioDB) => {

        if (err) {
            return res.status(500).json({ ok: false, msg: `Error ${err}` });
        }

        if (!usuarioDB) {
            return res.status(400).json({ ok: false, msg: "Email incorrecto" });
        }

        if (!bcrypt.compareSync(body.password, usuarioDB.password)) {
            return res.status(400).json({ ok: false, msg: "Password incorrecto" });
        }
        //creando el token
        let token = jwt.sign({
            user: usuarioDB
        }, process.env.SEED, { expiresIn: process.env.CADUCIDAD_TOKEN });


        if (usuarioDB) {
            return res.send({
                ok: true,
                user: usuarioDB,
                token
            })
        }
    });

}


module.exports = {
    home,
    saveUser,
    loginUser
}

, а это мой файл промежуточного программного обеспечения:

const jwt = require('jsonwebtoken');

//==============================================
//Verificar que el token sea válido
//==============================================

let verificaToken = (req, res, next) => {

    //1- Leer el token que viene en el header llamado 'token'
    let token = req.get('token');
    //token, semilla, callback(error, objeto desencriptado)
    jwt.verify(token, process.env.SEED, (err, decoded) => {
        if (err) {
            return res.status(401).json({
                ok: false,
                err: {
                    message: "Token no válido."
                }
            });
        }

        req.user = decoded.user;
        next();
    });

};

//====================================================================
//Verificar que el usuario sea ADMIN para crear, actualizar y eliminar
//====================================================================

//this is the one with the problem
let verificaAdminRol = (req, res, next) => {

    let usuario = req.user;

    if (usuario.role === 'ADMIN') {
        next(); //puedo continuar, pasó la verificación
    } else {
        return res.json({
            ok: false,
            message: "Debe tener privilegios de ADMIN para poder realizar esta operación"
        });
    }

};


module.exports = {
    verificaToken,
    verificaAdminRol
}

и, наконец, это ошибка, которую я получаю, когда пытаюсь создать новыйпользователь, использующий промежуточное ПО verificaAdminRol:

TypeError: Cannot read property 'role' of undefined
    at verificaAdminRol (C:\Users\gorydev\Documents\Development\udemy\red-social\middlewares\autenticacion.js:35:17)
    at Layer.handle [as handle_request] (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:174:3)
    at router (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\express\lib\router\index.js:275:10)
    at jsonParser (C:\Users\gorydev\Documents\Development\udemy\red-social\node_modules\body-parser\lib\types\json.js:101:7)

структура моего проекта:

/project
->/controllers
---->user.js
->/middlewares
---->autenticacion.js
->/models
---->user.js
->/routes
---->user.js

1 Ответ

0 голосов
/ 08 мая 2019

Я считаю, что ваше промежуточное программное обеспечение вышло из строя.Ваше промежуточное ПО verificaToken устанавливает ваше значение req.user, но оно запускается после verificaAdminRol, который обращается к этому значению.Смотрите здесь:

api.post('/save', [verificaAdminRol, verificaToken], UserController.saveUser);

Должно быть:

api.post('/save', [verificaToken, verificaAdminRol], UserController.saveUser);

Дайте мне знать, если это работает.

РЕДАКТИРОВАТЬ: Примечание.В соответствии с передовой практикой не следует писать непосредственно в объект req.Express предоставляет req.locals для передачи значений между промежуточным программным обеспечением и маршрутами для каждого запроса.Просто предложение.

...