Node.js和Redis Auth

时间:2012-05-19 16:39:37

标签: node.js redis

我没有使用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


So, what is the proper way to auth?

5 个答案:

答案 0 :(得分:4)

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

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

./src/redis-server redis.conf

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

http://redis.io/commands/auth

你可能想从那里跟进

答案 3 :(得分:0)

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

Redis auth error with Node.js and socket.io

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

答案 4 :(得分:0)

在更高版本中,Redis默认情况下启用保护模式,默认情况下仅接受环回和Unix域套接字。

要从extern连接,请在redis.conf中绑定到bind publicip anotherip etc requirepass foobared。现在使用redis-cli ping进行测试,如果没有密码,任何人都可以FLUSHALL :)

启用防火墙以过滤端口访问以获得进一步的保护,另请参见quickstart security notes.

由于我想要一个简单且加密的隧道,因此请在客户端运行:

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

在开始node index.js之前,因此redis会保存在其环回地址服务器端,并且我在客户端使用端口转发(对于后台进程ps -x为-f -N)和设置ssh密钥。