我有一个运行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实用程序生成的长随机密码,尽管这些密码中根本没有奇怪的字符。我在此处的软件包仓库中发布了与此主题有关的问题:
答案 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'。也许有人稍后会给出更好的解决方案。