我没有使用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?
答案 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)
答案 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密钥。