与Redis客户端一起使用的相同Redis密码会因Node.JS createClient()方法而失败?

时间:2019-02-06 16:51:15

标签: node.js authentication redis passwords

我有一个运行Node.JS版本10.4.2的Redis服务器。我在我的应用程序中使用NPM“ redis”客户端。我正在使用以下代码创建Redis客户端并进行身份验证。 (请注意,下面注释掉的代码可以查看我还尝试了什么):

var redis = require("redis");
// var redisClient = require('redis').createClient(process.env.REDIS_URL || redis);
var redisClient = redis.createClient(
    {
        port: process.env.REDIS_PORT,
        host: process.env.REDIS_URL,
        no_ready_check: true,
        auth_pass: process.env.REDIS_AUTH
    });

/*
// Authenticate with Redis.
redisClient.auth(process.env.REDIS_AUTH, function(err, reply) {
    if (err) {
        console.error(err);
    }
    else {
        console.log(reply);
    }
});
*/

但是,我总是会看到以下错误:

ReplyError: ERR invalid password

当我使用注释掉的代码时,我在 createClient()期间使用了“ no_ready_check”属性。一些事实:

  • 我对 process.env.REDIS_AUTH 中的值进行了三遍检查,它与我的Redis服务器conf文件中的 requirepass 密码值完全匹配。

  • 可以在Redis命令行客户端( redis-cli )上进行测试时使用密码成功进行身份验证,因此我知道Redis服务器受密码保护并且密码有效。

  • 我知道密码已经通过,因为当我使用注释掉的代码时,可以在传递给回调函数的参数中看到正确的密码。

为什么我的Node.JS代码不能使用密码,该如何解决?注意,密码是使用Linux上的SSL随机密码生成器生成的。我提到这是要防万一。

更新:我通过在Redis服务器conf文件中使用一个短得多的密码来完成此工作。显然,Node.JS Redis软件包不喜欢Linux SSL实用程序生成的长随机密码,尽管这些密码中根本没有奇怪的字符。我在此处的软件包仓库中发布了与此主题有关的问题:

https://github.com/NodeRedis/node_redis/issues/1411

1 个答案:

答案 0 :(得分:0)

我使用以下命令在Linux机器上使用OpenSSL创建密码:

openssl rand 60 | openssl base64 -A

很遗憾,openssl创建的密码中包含“ / ”的正斜杠。在这种情况下,可能还有其他一些不健康的角色,但是我没有详尽地测试它们。一旦从密码中删除了正斜杠,并且在重新启动Redis服务器以注册更改之后,客户端创建尝试就可以从Node.JS进行。

在Redis途中,那些字符在Node.JS端发生了变化。正如我所说,使用auth命令将包含密码的相同正斜杠直接粘贴到Redis客户端时,我没有任何问题。但是从Node.JS使用它们会导致身份验证尝试失败。

我对所有阅读本文的人最好的建议是,如果您使用 openssl 命令为Node.JS应用生成redis密码,请删除所有不严格属于'a-zA-生成的密码中的Z'。也许有人稍后会给出更好的解决方案。