14

我没有获得使用 redis auth 的 redis node.js 文档。

根据示例:

var redis = require("redis"),
client = redis.createClient();

// This command is magical. Client stashes the password and will issue on every connect.
client.auth("somepass");

在我的代码中,我有以下内容:

var redis = require("redis");
r = redis.createClient(6379,'xxx.xxx.xxx.xxx');
r.auth("yyyyyyyy");

app.get('/', function(req, res){
r.set("foo", 'bar');
res.writeHead(200, {'Content-Type': 'image/gif'});
res.end('Hello');
 });

这是我得到的错误:

    Express server listening on port 8070 in development mode

/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:468
                throw callback_err;
                      ^
Error: Auth error: Error: ERR Client sent AUTH, but no password is set
    at Command.callback (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:163:43)
    at RedisClient.return_error (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:464:25)
    at HiredisReplyParser.<anonymous> (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:253:14)
    at HiredisReplyParser.emit (events.js:67:17)
    at HiredisReplyParser.execute (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/lib/parser/hiredis.js:41:18)
    at RedisClient.on_data (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:440:27)
    at Socket.<anonymous> (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/redis/index.js:70:14)
    at Socket.emit (events.js:67:17)
    at TCP.onread (net.js:367:14)
[7]+  Killed                  node app.js 8070

那么,正确的身份验证方法是什么?

4

6 回答 6

5

此问题的另一个原因可能是在启动 redis-server 时未指定您的 redis.conf(如果您在其中放入“requirepass”)。

在这种情况下,redis 服务器以默认配置启动(即未启用“requirepass”选项),因此不接受您的 AUTH 命令。

./src/redis-server redis.conf
于 2013-12-19T12:06:49.457 回答
1

这是使用身份验证的正确方法。

我相信您正在尝试使用旧版本的 Redis 服务器,其协议不受 node_redis 支持(反之亦然)。

或者,您可能没有连接到您认为受密码保护的实例,或者您没有在目标实例的配置中设置密码。

我建议您尝试使用 redis-cli 连接到实例并使用 auth 来测试身份验证(即绕过 node.js)。

于 2012-05-19T17:09:19.130 回答
1

以下代码使用节点包 redis 创建到 Redis 的连接。

const redis = require('redis');

const client = redis.createClient({
    host: '<hostname>',
    port: <port>,
    password: '<password>'
});
于 2021-09-15T12:45:31.383 回答
1

较新版本的 Redis 默认启用保护模式,仅接受环回和 unix 域套接字。

要从外部连接,请在 redis.conf 中绑定到bind publicip anotherip etc requirepass foobared。现在用redis-cli ping.
如果没有requirepass人可以FLUSHALL:)

启用防火墙以过滤端口访问以进一步保护,另请参阅快速入门安全说明。

您可以(临时)使用 ssh 隧道而不是暴露端口:因为我想要一个简单且加密的隧道,所以在客户端运行:

 ssh -f -N -L 6379:127.0.0.1:6379 user@<serverip>

在开始之前node index.js,redis 保存在其环回地址服务器端,我在客户端上使用端口转发(-f -N 用于后台进程 ps -x)和设置 ssh 密钥。
如果坚持不懈,您应该研究推荐的 spiped

于 2018-08-10T12:53:25.757 回答
0

我在redis auth文档下发现了其他人有同样的问题

http://redis.io/commands/auth

您可能想从那里跟进

于 2012-05-19T17:10:11.957 回答
0

我怀疑你和我有同样的问题。通过将 redis 模块本身作为选项传递给 RedisStore 构造函数,我设法修复了我的问题:

Node.js 和 socket.io 的 Redis 身份验证错误

没有它,RedisStore 模块将无法将您传入的 RedisClient 对象识别为“真正的”RedisClient 对象(因为它们将是来自不同redis 的 redis.RedisClient 类),并且 RedisStore 将重新创建它们并丢失身份验证你设置。

于 2012-11-20T06:35:44.720 回答