node.js - 无法在中间件中获取 JWT 令牌
问题描述
我正在尝试在我目前正在从事的项目中使用 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 令牌没有太多经验,如果有什么明显的地方请见谅。
解决方案
所以我设法找到了问题所在。问题在于CORS。特别是,中间件按预期工作,但是由于 CORS,发送的预检请求没有 JWT 令牌,这就是我在第一个示例中收到错误的原因。我更新了中间件以跳过预检请求:
if (req.headers['access-control-request-headers'] === 'x-access-token') {
return next();
}
[...]
推荐阅读
- javascript - 模式弹出窗口中的引导选项卡不起作用
- ios - Visual Studio 2019 更新后卡在突出显示的蓝屏上
- php - 如何使用 Apache 在 AWS EC2 实例上运行 PHP Ratchet WebSocket 应用程序
- arrays - 具有不同大小的二维数组分配问题 VHDL
- ios - 在苹果登录中使用客户端 ID 和密码的位置
- pyinstaller - 带有 pyinstaller 的脚本从 resource_filename 返回 TypeError 预期 str
- wordpress - 在 Wordpress 中创建自定义按钮的最佳实践
- c# - Azure Functions 调试计时器和 Http 触发器
- django - Django 测试与 1 个 DB 并行
- android - 如何从媒体商店 api 获取 mp3 格式的音频文件?