Node-redis: NOAUTH Erro de autenticação necessária mesmo com senha definida

Criado em 29 jun. 2018  ·  18Comentários  ·  Fonte: NodeRedis/node-redis

  • Versão : Nó Redis 2.8.0 / Redis 4.0.9
  • Plataforma : NodeJS 8.11.3 na pilha Heroku-16
  • Descrição : Estou me conectando ao redis e passando o seguinte objeto de opções que tem a senha, mas node_redis sempre lança um erro NOAUTH
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

Se eu me conectar ao redis com a ferramenta redis-cli funciona muito bem, mas por algum motivo estou recebendo esse erro

29 Jun 2018 11:06:14.626136 <190>1 2018-06-29T18:06:14.346750+00:00 app web.1 - - ReplyError: NOAUTH Authentication required
    at new Command (/app/node_modules/redis/lib/command.js:12:22)
    at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
    at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
    at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
    at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at Socket.emit (events.js:208:7)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1173:10)Exception

Comentários muito úteis

Também estou com esse problema aqui.

Mensagem de erro: ReplyError: NOAUTH Authentication required.

Versão : Nó Redis 3.0.0 / Redis 5.0.8

Todos 18 comentários

Difícil dizer apenas do seu objeto options , mas isso é bastante padrão e é conhecido como bom. Se eu tivesse que apostar que você talvez esteja se conectando ao servidor redis errado ou nconf.get('redis_pass')[nodeEnv] está fornecendo a senha errada (ou talvez indefinida).

Você pode fornecer mais do seu código?

Oi, eu tenho o mesmo problema e passo a senha como um texto simples e ainda me envia o mesmo erro. Na verdade, apenas descomentei a linha requirepass no arquivo redis.conf padrão, conforme mostro no código a seguir:

# use a very strong password otherwise it will be very easy to break.
#
requirepass foobared

# Command renaming.

Eu faço essa configuração na minha máquina local para fazer os testes, mas ainda recebo o mesmo erro:

events.js:160
      throw er; // Unhandled 'error' event
      ^
ReplyError: Ready check failed: NOAUTH Authentication required.
    at parseError (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:193:12)
    at parseType (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:303:14)

Aqui está o meu código que aplico no meu servidor nodejs:

const redisPassword = "foobared" ; 
const ClientRedisApi = redis.createClient({
          host : '127.0.0.1',  
          no_ready_check: true,
          auth_pass: redisPassword,                                                                                                                                                           
});                               

ClientRedisApi.on('connect', () => {   
          global.console.log("connected");
})                              

ClientRedisApi.on('error', err => {       
          global.console.log(err.message)
})                             

ClientRedisApi.set("foo", 'bar');         

ClientRedisApi.get("foo", function (err, reply) {
        global.console.log(reply.toString())
})

O engraçado é que quando inicio o servidor, a chave "foo" é salva no meu banco de dados redis com o valor "bar", mas meu app trava e não consigo fazer nada para interagir com ele.

A todos aqui. Eu tive o mesmo problema quando tentei usar uma senha longa gerada pelo gerador de senhas aleatórias do Linux. Quando mudei a senha para algo muito mais curto, tudo funcionou bem. Isso pode ser um problema com o próprio pacote Node.JS, porque a senha longa funcionou se eu entrasse no redis-cli e a usasse com o comando auth . No entanto, a mesma senha exata não funcionou quando passada durante o método createClient() , independentemente de qual variante de método eu usei (ou seja - URL completo ou "auth_pass"/"password" no bloco de opções ou redisClient.auth() método - todos eles falharam com a senha longa).

Oi @roschler , você gostaria de fornecer seu código, por favor. A verdade é que tentei sua sugestão e ainda estou com o mesmo problema, nem mesmo com uma senha como '123'. Eu tento com todas as formas que estão na documentação e nada de diferente. Eu sei que isso pode ser um incômodo para você, mas a verdade é que eu não tenho outra escolha. Desde já muito obrigado.

@maooricio Tenho 99,999% de certeza de que é uma configuração incorreta no servidor ou no servidor errado. Olhando para o seu código de outubro de 2018, eu tentaria usar uma chave gerada aleatoriamente e ecoar com MONITOR em redis-cli .

Acho que @roschler está tendo um problema totalmente diferente (citando?)

Eu ainda tenho esse problema comigo, tentei muitas maneiras diferentes de se conectar ao meu redis db, mas a autenticação de senha falhou para o usuário

@nicollasmatheus qual é o seu erro?

Estou com o mesmo erro. Estou confiante de que todos os parâmetros de configuração estão corretos. Eu tentei todos os 3 métodos e o mesmo erro em todos eles.

      // First method
      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST);
      client.auth(process.env.REDIS_PASSWORD);

      // Second method
      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
        password: process.env.REDIS_PASSWORD
      });

      // Third method
      const client = redis.createClient(uri)

Após as configurações NODE_DEBUG=redis

[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Stream connected redis:6379 id 0
[0] Redis: CONNECTED // CUSTOM MESSAGE
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Redis: READY // CUSTOM MESSAGE
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0]         this.error = new Error();
[0]                      ^
[0] ReplyError: NOAUTH Authentication required.
[0]     at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0]     at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0]     at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0]     at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0]     at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0]     at Object.onceWrapper (events.js:299:28)
[0]     at Socket.emit (events.js:215:7)
[0]     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)
[0] npm ERR! code ELIFECYCLE

Estou usando o docker-compose

  redis:
    container_name: redis
    image: redis:5.0.3-alpine
    restart: always
    env_file: .env
    command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"]
    hostname: ${REDIS_HOST}
    volumes:
      - ~/.mydata/redis:/data
    ports:
      - ${REDIS_PORT}:6379
    networks:
      - my-network

e posso acessar redis usando cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'

@thellimist Confira o que está acontecendo com redis-cli e MONITOR , especialmente com seu segundo método.

@stockholmux

export default class Cache {
   static client: any

   static init(): Promise<any> {
      if (Cache.client) {
        logger.error("Client already exists")
        return new Promise((resolve, reject) => { reject() });
      }

      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
        password: process.env.REDIS_PASSWORD
      });
      Cache.client = asyncRedis.decorate(client);
      Cache.client.monitor(function (err, res) {
        logger.info("Entering monitoring mode.");
      });
      Cache.client.set('foo', 'bar');

      Cache.client.on("ready", (e: any) => {
        logger.info(`ready ${e}`);
      });

      Cache.client.on("reconnecting", (e: any) => {
        logger.info(`reconnecting ${e}`);
      });

      Cache.client.on("end", (e: any) => {
        logger.info(`end ${e}`);
      });

      Cache.client.on("warning", (e: any) => {
        logger.info(`warning ${e}`);
      });

      Cache.client.on("monitor", (e: any, res: any) => {
        logger.error(`monitor err: ${e}`);
        logger.info(`monitor res: ${res}`);
      });

      Cache.client.on("connect", () => {
        logger.info("connected");
      });
      Cache.client.on("error", (e: any) => {
        logger.error(`Error: :${e}`);
      });

      return new Promise((resolve, reject) => { resolve() }
   }

e eu chamo await Cache.init() . A resposta está a seguir:

[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Queueing monitor for next server connection.
[0] Queueing set for next server connection.
[0] Stream connected redis:6379 id 0
[0] 2019-12-17 06:49:48 error [server.ts]: connected
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Sending offline command: monitor
[0] Send redis:6379 id 0: *1
[0] $7
[0] monitor
[0]
[0] Sending offline command: set
[0] Send redis:6379 id 0: *3
[0] $3
[0] set
[0] $3
[0] foo
[0] $3
[0] bar
[0]
[0] 2019-12-17 06:49:48 info [server.ts]: ready undefined
[0] Net read redis:6379 id 0
[0] 2019-12-17 06:49:48 info [server.ts]: Entering monitoring mode.
[0] 2019-12-17 06:49:48 error [server.ts]: monitor err: 1576565388.385183
[0] 2019-12-17 06:49:48 info [server.ts]: monitor res: set,foo,bar
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0]         this.error = new Error();
[0]                      ^
[0] ReplyError: NOAUTH Authentication required.
[0]     at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0]     at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0]     at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0]     at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0]     at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0]     at Object.onceWrapper (events.js:299:28)
[0]     at Socket.emit (events.js:215:7)
[0]     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)

Também key/val "foo: bar" é adicionado ao redis. Portanto, ele se conecta corretamente inicialmente e, por algum motivo, tenta se reconectar, mas falha. Eu só chamo await Cache.init() uma vez no express server.listen.

@thellimist Acho que você não entendeu - você precisa executar MONITOR _from_ redis-cli para diagnosticar corretamente esses problemas. Executá-lo de dentro do seu aplicativo como acima não capturará a autenticação (porque isso acontece antes do MONITOR). Eu também o executaria em um banco de dados completamente liberado.

De qualquer forma, olhando para o seu código (que eu suponho ser um trecho), realmente parece que em algum outro lugar do seu código você está chamando redis.createClient sem a senha adequada (talvez outro módulo). Não vejo os logs de depuração para reconexão e o id 1 diz que você está trabalhando em um fluxo de rede diferente.

@stockholmux

A questão era simples como você disse. Eu estava usando o pacote typeorm e tinha um arquivo de configuração diferente que não estava no arquivo js/ts. O loge do Node Redis não me disse de onde estava sendo chamado, dificultando a localização.

Obrigado.

Se estiver usando o Docker, edite a configuração de rede de arquivos do seu redis.conf:

bind 0.0.0.0

Isso resolveu para mim.

@mariothedev tenha SUPER cuidado com isso. Sem firewalls adequados, seu redis está aberto com o uso dessa configuração bind .

@stockholmux - obrigado por me avisar :)

Também estou com esse problema aqui.

Mensagem de erro: ReplyError: NOAUTH Authentication required.

Versão : Nó Redis 3.0.0 / Redis 5.0.8

Me deparei com este tópico procurando uma resposta para o mesmo problema. Quer saber qual é a solução para isso.

Mais uma resolução possível para adicionar à lista. Eu estava recebendo esse erro e demorei muito tempo para lembrar que estou usando o Bull , que é uma fila baseada em Redis. Também estou usando o Redis em outro lugar do aplicativo onde estava passando as informações de conexão, mas esqueci do Bull e estava recebendo exatamente esses erros no console.

Então, acho que outra coisa a ser verificada é se alguma outra coisa no seu aplicativo está usando o Redis e pode estar disparando esses erros.

edit Se é o Bull que está causando esse erro para você, você deve usar password em seu objeto de conexão redis, não auth_pass .

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

abhaygarg picture abhaygarg  ·  5Comentários

twappworld picture twappworld  ·  7Comentários

Stono picture Stono  ·  6Comentários

aletorrado picture aletorrado  ·  6Comentários

lemon707 picture lemon707  ·  3Comentários