卡在 JWT 验证(使用 Redis)

问题描述 投票:0回答:2

我使用 Node.js 加上一个名为 jwt-redis 的包来在我的 API 中创建和验证身份验证令牌,这样我就可以从 Redis 数据库中销毁它们并注销。

我已经实现了第一部分,通过 jwtr.sign() 方法创建令牌。令牌已从有效负载和密钥成功创建,然后包含在响应正文中,以及 redis 中的新密钥。

现在,我正在尝试实现一个对令牌进行身份验证的函数,该函数主要从请求中获取授权标头(它在控制台上正确打印),连接redis客户端(显然也可以),最后尝试验证它。

我的代码如下:

async function authenticateToken(req, res, next) {
    // verify if user already exists
    const authHeader = req.header('Authorization')
    // console.log('autheader', authHeader)

    const token = authHeader && authHeader.split(' ')[1] //returns or undenifed or the token
    if (token == null) return res.status(401).json({ Error: 'Usuario no registrado' })
    console.log('token:' + token)

    const redis = require('redis');
    const JWTR =  require('jwt-redis').default;
    //ES6 import JWTR from 'jwt-redis';
    const redisClient = redis.createClient();
    const jwtr = new JWTR(redisClient)

    await redisClient.connect().then(function() {
        console.log("Redis plugged in.")
    })

    jwtr.verify(token, process.env.ACCESS_TOKEN_SECRET, function(err, user) {
        if(err) return res.status(401).json({ Error: 'Usuario no registrado' })
        console.log('user'+user)
        req.USER = user
        next()
    })
}

但是,如上所述,它卡在了 jwtr.verify() 处。控制台打印令牌和消息“Redis 已插入”,但没有任何其他反应。应用程序继续运行,邮递员呼叫的按钮保持“正在发送”,直到我强制节点停止。

由于该方法返回一个承诺,所以我尝试了

then
await
但没有成功。

伙计们,知道这里发生了什么吗?

我将非常感谢您的帮助:)

javascript node.js redis jwt
2个回答
0
投票

来自文档

jwtr.verify(令牌,secretOrPublicKey,[选项]):承诺

您正在通过回调来处理该问题

所以我认为你必须以这种方式修改你的代码

jwtr.verify(token, process.env.ACCESS_TOKEN_SECRET).then(user => {
   console.log('user'+user)
        req.USER = user
        next()
      }, err => {
       res.status(401).json({ Error: 'Usuario no registrado' })
}) 

0
投票

我也遇到同样的问题...如果有人有解决方案请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.