我使用 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
但没有成功。
伙计们,知道这里发生了什么吗?
我将非常感谢您的帮助:)
来自文档
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' })
})
我也遇到同样的问题...如果有人有解决方案请告诉我!