【问题标题】:Same Redis password that works with Redis client fails with Node.JS createClient() method?与 Redis 客户端一起使用的相同 Redis 密码因 Node.JS createClient() 方法而失败?
【发布时间】:2019-02-06 16:51:14
【问题描述】:

我有一个运行 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 服务器配置文件中的 requirepass 密码值完全匹配。

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

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

为什么我的密码不能与我的 Node.JS 代码一起使用,我该如何解决这个问题?请注意,密码是使用 Linux 上的 SSL 随机密码生成器生成的。我提一下,以防它影响任何事情。

更新:我通过在 Redis 服务器 conf 文件中使用更短的密码来实现此功能。显然 Node.JS Redis 包不喜欢 Linux SSL 实用程序生成的长随机密码,尽管这些密码中根本没有奇怪的字符。我在这里的包回购中发布了一个关于这个主题的问题:

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

【问题讨论】:

  • 您是否通过在终端中运行 REDIS_AUTH=<redis password> npm start 来检查它的完整性?
  • @mralanlee 不,我应该寻找什么?无论如何,我通过使用更短的密码使事情正常进行。通过 SSL 生成的 64 个字符的密码显然是 Node.JS Redis 软件包的问题。我现在在 Redis 包 repo 上发布了一个 GitHub 问题。

标签: node.js authentication redis passwords


【解决方案1】:

我使用以下命令在我的 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' 来自生成的密码。也许以后会有人给出更好的解决方案作为回复。

【讨论】:

  • 谢谢!花了几个小时试图解决这个问题......在我看来这是 openssl 中的一个错误......
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 2014-04-04
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多