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

Posted

技术标签:

【中文标题】无法在中间件中获取 JWT 令牌【英文标题】:Cannot get JWT token in middleware 【发布时间】:2019-04-16 03:23:38 【问题描述】:

我正在尝试在我目前正在进行的项目中使用 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 令牌没有太多经验,如果有什么明显的地方请见谅。

【问题讨论】:

jwt.verify 行中你有一个return,尝试删除它,保持return false 并return next() 【参考方案1】:

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

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

【讨论】:

你确定这是一个修改代码的地方吗? ;) 例如,当您以某种方式提供格式错误的输入时...【参考方案2】:

我猜这是req.headers['x-access-token'] 的问题。一旦调用了next(),控制就转到下一个端点路由。您应该提供 JWT 作为令牌的首字母。

【讨论】:

以上是关于无法在中间件中获取 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名

python jwt中令牌过期时如何提取jwt令牌有效负载

修改 OWIN OAuth 中间件以使用 JWT 不记名令牌

NodeJs Express passport-jwt 从令牌中获取错误的用户

Django rest framework JWT ,删除 jwt 令牌

编程实践Go 实现 JWT以及将其用作中间件的方式