发送标头后无法设置。使用JWT

时间:2018-11-29 12:53:23

标签: node.js express jwt express-jwt

我正在尝试使用JWT创建身份验证,当我创建方法时,它是一个名为verifyJWT ()的函数,它将开始触发此错误...

注意::在构造此功能并在路由中使用它之前,我可以冷静地发送它,问题是我先执行res.status (200) .send ({auth: true, token: jwtToken});然后执行res.redirect ('/ home/ v1');,但实际上不知道为什么这个问题..

什么是正确的用户身份验证模式以及后续路由?

登录路由器:

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); });

}

登录控制器路由器

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");
        }
    }


}

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")
            //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 :(得分:0)

 //res.status(200).send({ auth: true, token: jwtToken });
        res.redirect('/home/v1');

发送响应后,您将无法重定向。请参阅REST API中的“请求和响应”工作方式。您可以在此处执行的操作是“首先重定向”,并在重定向之后(在“重定向路由”中)发送Auth令牌。您需要在重定向后写登录。

更新:

尝试添加行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');
}