Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jwt.verify()的Node.js回调_Javascript_Node.js_Express_Jwt - Fatal编程技术网

Javascript jwt.verify()的Node.js回调

Javascript jwt.verify()的Node.js回调,javascript,node.js,express,jwt,Javascript,Node.js,Express,Jwt,我在Node.js服务器上有一个身份验证路由,用于验证请求: app.get('/loggedin', auth, function(req, res){ console.log(req.authenticated); res.send(req.authenticated ? req.authenticated: false) }) 据我所知,auth在app.get()之前运行。以下是auth的代码: var jwt = require('jsonwebtoken'); va

我在Node.js服务器上有一个身份验证路由,用于验证请求:

app.get('/loggedin', auth, function(req, res){
    console.log(req.authenticated);
    res.send(req.authenticated ? req.authenticated: false)
})
据我所知,
auth
app.get()
之前运行。以下是
auth
的代码:

var jwt = require('jsonwebtoken');
var config = require('./config');

module.exports = function(req,res,next){
    var bearerHeader = req.headers['authorization'];
    var token;
    console.log(bearerHeader);
    req.authenticated = false;
    if (bearerHeader){
        console.log("11111");
        var bearer = bearerHeader.split(" ");
        token = bearer[1];
        jwt.verify(token, config.secret, function (err, decoded){
            console.log("22222");
            if (err){
                console.log(err);
                req.authenticated = false;
                req.decoded = null;
            } else {
                console.log("33333");
                req.decoded = decoded;
                req.authenticated = true;
            }
        });
    }
    next();
}
但是,在服务器日志上,我收到以下输出:

Bearer jsflkdjlsdfjksodfkjlsdfjkls
11111
false
22222
33333

这意味着客户端有一个令牌,它通过了jwt验证。但是,服务器决定在完成身份验证回调中的信息返回之前开始运行
app.get()
。给出了什么?

好的,只是修复了它。问题是,
jwt.verify()
是异步的,所以它不会立即执行。解决此问题的唯一方法是仅在获得以下任一结果后调用
next()

module.exports = function(req,res,next){
    var bearerHeader = req.headers['authorization'];
    var token;
    console.log(bearerHeader);
    req.authenticated = false;
    if (bearerHeader){
        console.log("11111");
        var bearer = bearerHeader.split(" ");
        token = bearer[1];
        jwt.verify(token, config.secret, function (err, decoded){
            console.log("22222");
            if (err){
                console.log(err);
                req.authenticated = false;
                req.decoded = null;
                next();
            } else {
                console.log("33333");
                req.decoded = decoded;
                req.authenticated = true;
                next();
            }
        });
    }
}
根据需要,您可以使用两个选项实现
jwt.verify()
方法:

异步:如果提供回调,函数将异步运行。如果签名有效且可选的过期、访问群体或颁发者有效,则使用解码的有效负载调用回调。如果不是,则调用它时会出现错误

// async
jwt.verify(token, pass, (err, decoded) => { async callback } );
//sync
try {
 const decoded = jwt.verify(token, pass);
}
catch (ex) { console.log(ex.message); }
同步:如果未提供回调,函数将同步运行。如果签名有效且可选过期、访问群体或颁发者有效,则返回已解码的有效负载。如果不是,它将抛出错误

// async
jwt.verify(token, pass, (err, decoded) => { async callback } );
//sync
try {
 const decoded = jwt.verify(token, pass);
}
catch (ex) { console.log(ex.message); }

您可以使用同步版本和promisify

 const promisify = fn => {
            return (...args) => {
                return new Promise((resolve, reject) => {
                    function customCallback(err, ...results) {
                        if (err) {
                            return reject(err);
                        }
                        return resolve(results.length === 1 ? results[0] : results)
                    }

                    args.push(customCallback);
                    fn.call(this, ...args);
                })
            }
        }

// inside your code for varification

        promisify(jwt.verify)(token, process.env.JWT_SECRET)
        .then(result => {
             console.log(result);

         }).catch(err => {
            console.log(err);
         });

        next();


在进行身份验证时,是否可以在调用next()之前添加5秒钟的等待时间。我想确定这不是一个日志写入问题。@limbo就是这么做的,输出是一样的。它实际上会在调用
jwt.verify()
之前暂停,因此逻辑会在
jwt.verify()
之后立即传递到代码上。