无法在中间件中获取JWT令牌

时间:2018-11-13 10:08:56

标签: node.js express jwt middleware

我正在尝试在目前正在研究的项目中使用JWT令牌。我正在尝试使用中间件在将JWT令牌传递给下一个处理程序之前对其进行验证。但是,我有一个奇怪的问题,即我没有在中间件中获得JWT令牌,但是如果将其传递给下一个处理程序,则会得到该令牌。希望下面的示例可以解释它:

我已经实现了PING方法和一些日志记录,以向您展示发生了什么。我的设置如下:

this._express.use((req, res, next) => {
    console.log('AUTH');
    return jwt.verify(req.headers['x-access-token'], 'mysecret', (err, decoded) => {
        if (err) {
            console.log(`ERROR: ${err}`);
            return false;
        }

        console.log('DECODED');
        return next();
    });
});

//Health Check
this._express.get('/ping', (req, res) => {
    console.log(`PING`);
    return res.status(200).send('pong');
});

如果我执行这段代码,输出为:

node_1        | AUTH
node_1        | ERROR: JsonWebTokenError: jwt must be provided

但是,如果我在中间件中使用next()回调:

this._express.use((req, res, next) => {
    console.log('AUTH');
    next(); // This is the only thing that is different
    return jwt.verify(req.headers['x-access-token'], 'mysecret', (err, decoded) => {
        if (err) {
            console.log(`ERROR: ${err}`);
            return false;
        }

        console.log('DECODED');
        return next();
    });
});

//Health Check
this._express.get('/ping', (req, res) => {
    console.log(`PING`);
    return res.status(200).send('pong');
});

输出如下:

node_1        | AUTH
node_1        | ERROR: JsonWebTokenError: jwt must be provided
node_1        | AUTH
node_1        | PING
node_1        | DECODED

我对JWT令牌没有太多经验,如果这很明显,请原谅。

2 个答案:

答案 0 :(得分:2)

因此,我设法找到了问题所在。问题在于CORS。特别是,中间件可以按预期工作,但是由于CORS,发送了一个预检请求,该请求没有JWT令牌,这就是为什么我在第一个示例中得到错误的原因。我已经更新了中间件,以跳过预检请求:

    if (req.headers['access-control-request-headers'] === 'x-access-token') {
        return next();
    }
    [...]

答案 1 :(得分:0)

我猜这是req.headers['x-access-token']的问题。调用next()后,控件将转到下一个端点路由。您应该将JWT作为令牌的缩写提供。