Node.js和Redis Auth

16

我不理解redis node.js文档中关于使用redis auth的说明。

根据示例:

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

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


EADDRINUSE是一个HTTP的问题 - 你确定这不是设置服务器的问题,而是与Redis有关的问题吗? - ControlAltDel
我曾经遇到过同样的问题,后来发现我在另一台服务器上编辑了配置文件,要求输入密码,而我在测试服务器上运行的那个服务器没有包含 requirepass $uP3rs3cretpassW0rd ... 真是太糟糕了!但现在一切都正常了。 - nak
7个回答

5
此问题的另一个原因可能是在启动redis-server时未指定redis.conf(如果您在其中放置了“requirepass”)。
在这种情况下,redis服务器将使用默认配置启动(即未启用“requirepass”选项),因此不接受您的AUTH命令。
./src/redis-server redis.conf

3
以下代码使用node包redis创建到Redis的连接。
const redis = require('redis');

const client = redis.createClient({
    host: '<hostname>',
    port: <port>,
    password: '<password>'
});

1

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

若要从外部连接,请在redis.conf中绑定bind publicip anotherip etcrequirepass 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

1

这是使用auth的正确方式。

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

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

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


嗨,我正在使用redis2.6。我还使用支持auth的py-redis。除了node.js redis mranney之外,其他所有客户端都可以正常工作。即使是tornadoredis也可以正常工作。 - Tampa
它对我来说运行良好。你的node.js版本和相关模块(即npm列表)是什么?我的版本是v0.6.16,redis@0.7.2hiredis@0.1.14... - Didier Spezia
Node的版本是v0.6.18。Redis的版本是redis@0.7.2 - Tampa

0
你需要从redis.conf路径中检查密码(例如):
usr/local/etc/redis.conf

命名为 => requirepass

然后您可以通过以下方式添加:

const rediClient = redis.createClient({
    password: '<YourPassword>'
});

如果您想通过终端进行身份验证,可以使用以下命令:

AUTH <password>

参考:https://redis.io/commands/auth/


0

我猜你和我遇到了同样的问题。我在这里解决了我的问题,通过将redis模块本身作为选项传递给RedisStore构造函数:

Node.js和socket.io中的Redis auth错误

如果没有它,RedisStore模块将无法识别您传递的RedisClient对象为“真正”的RedisClient对象(因为它们将来自于不同的redis.RedisClient类),并且RedisStore将重新创建它们并丢失您设置的auth。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接