Не удается установить заголовки после их отправки.используя JWT - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать аутентификацию с помощью JWT, когда я создаю свой метод, это функция с именем verifyJWT (), она запускает эту ошибку ...

ПРИМЕЧАНИЕ: Перед построениемэту функцию и используя ее в маршруте, я могу отправить ее спокойно, проблема в том, когда я делаю res.status (200) .send ({auth: true, token: jwtToken});, а затем res.redirect ('/ home/ v1'); Но на самом деле я не знаю, почему эта проблема ..

Чтоправильный режим аутентификации пользователя и на последующих маршрутах?

ROHTER LOGIN:

const { body } = require('express-validator/check');

module.exports = (app) => {
    app.route('/')
    .get((req, res) => { app.controllers.login.controller.redirectRouter(app, req, res) });

    app.route('/login')
    .get((req, res)  => { app.controllers.login.controller.login(app, req, res); })
    .post([
        body('username').isString().isLength({ min: 1 }).not().isEmpty(),
        body('password').isString().isLength({ min: 1 }).not().isEmpty()
    ], (req, res) => { app.controllers.login.controller.checkLoginForm(app, req, res); });

}

ROUTER CONTROLLER LOGIN

const { validationResult } = require('express-validator/check');
const jwt = require('jsonwebtoken');

module.exports.redirectRouter = (app, req, res) => res.redirect('/login');

module.exports.login = (app, req, res) => { 
    const renderConfig = new app.models.services.utilities.Render("LOGIN", true);
    renderConfig.httpJSPResponseStatusCode = 200;

    res.render('login/view', renderConfig.config);
}

module.exports.checkLoginForm = (app, req, res) => {
    /** @description: RECEBE O RESULTADO DA VALIÇÃO DO FORMULÁRIO PELO {EXPRESS-VALIDATOR} */
    const errors = validationResult(req);

    /** @description: VERIFICA SE HOUVE ERRO NA VALIDAÇÃO DO FORMULÁRIO COM O {EXPRESS-VALIDATOR} */
    if (!errors.isEmpty()) {
        /** @description: CASO ALGUM DADO ESTEJA INCONSISTENTE RETORNA {ERROR: 401} DE {NÃO AUTORIZADO} */
        res.status(401).send("401 Não autorizado");
    } else {
        /** @description: CASO OS DADOS FOREM VÁLIDOS, ADICIONA OS VALORES DO BODY NAS VARIÁVEIS */
        const username = req.body.username,
              password = req.body.password;

        /** FUNÇÕES TEMPORÁRIAS */
        if(username === "1" && password === "1"){
            const userId = 10;
            const jwtToken = jwt.sign({ userId }, process.env.SECRET, {
                expiresIn: 300 // EXPIRA EM 5MIN
            });

            //res.status(200).send({ auth: true, token: jwtToken });
            res.redirect('/home/v1');
        } else {
            res.status(401).send("401 Não autorizado");
        }
    }


}

ДОМАШНИЙ МАРШРУТИЗАТОР

    const jwtClass = require('../../models/services/JWT/controller.js');

    module.exports = (app) => {
        app.route('/home/v1/')
        .get(jwtClass.verifyJWT, (req, res) => {
            console.log("é get")
            //app.controllers.home.controller.home(app, req, res);
        }).post(jwtClass.verifyJWT, (req, res) => {
            console.log("é post")
            //app.controllers.home.controller.home(app, req, res);
        });
    }

** HOME CONTROLLER ROUTER **
module.exports.home = (app, req, res) => {
    res.render('home/view');
}

СПОСОБ ФУНКЦИИ JWT

const jwt = require('jsonwebtoken');

module.exports.verifyJWT = (req, res, next) => {
    const jwtToken = req.headers['x-access-token'];

    if (!jwtToken) {
        return res.status(401).send({ auth: false, message: 'No token provided.' });
    } else {
        jwt.verify(jwtToken, process.env.SECRET, (error, decoded) => {
            if (error) {
                return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' });
            } else {
                    console.log("ae")
                req.userId = decoded.id;
                next();
            }
        });
    }
}

1 Ответ

0 голосов
/ 29 ноября 2018
 //res.status(200).send({ auth: true, token: jwtToken });
        res.redirect('/home/v1');

Вы не можете перенаправить после отправки ответа.Обратитесь к тому, как запрос и ответ работают в REST API.Что вы можете сделать здесь - это перенаправить в первую очередь и отправить маркер авторизации после перенаправления (в маршруте перенаправления).Вам необходимо написать логин после перенаправления.

Обновление:

Попробуйте добавить строку res.status(200).send({ auth: true, token: jwtToken }); внутри HOME ROUTER

Также, пожалуйста,импортировать правильные модули в HOME ROUTER.

    const jwtClass = require('../../models/services/JWT/controller.js');

    module.exports = (app) => {
        app.route('/home/v1/')
        .get(jwtClass.verifyJWT, (req, res) => {
            console.log("é get")
            //ADD HERE
          res.status(200).send({ auth: true, token: jwtToken });
            //app.controllers.home.controller.home(app, req, res);
        }).post(jwtClass.verifyJWT, (req, res) => {
            console.log("é post")
           //ADD HERE
            res.status(200).send({ auth: true, token: jwtToken });
            //app.controllers.home.controller.home(app, req, res);
        });
    }

** HOME CONTROLLER ROUTER **
module.exports.home = (app, req, res) => {
    res.render('home/view');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...