Node-redis: NOAUTH Autenticación requerida error incluso con contraseña configurada

Creado en 29 jun. 2018  ·  18Comentarios  ·  Fuente: NodeRedis/node-redis

  • Versión : Nodo Redis 2.8.0 / Redis 4.0.9
  • Plataforma : NodeJS 8.11.3 en la pila Heroku-16
  • Descripción : me conecto a redis y paso el siguiente objeto de opciones que tiene la contraseña, pero node_redis siempre arroja un error NOAUTH
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

Si me conecto a Redis con la herramienta redis-cli , funciona bien, pero por alguna razón recibo este error.

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

Comentario más útil

También estoy teniendo este problema aquí.

Mensaje de error: ReplyError: NOAUTH Authentication required.

Versión : Nodo Redis 3.0.0 / Redis 5.0.8

Todos 18 comentarios

Es difícil saberlo solo con su objeto options pero esto es bastante estándar y se sabe que es bueno. Si tuviera que apostar a que tal vez se está conectando al servidor redis incorrecto o nconf.get('redis_pass')[nodeEnv] está proporcionando la contraseña incorrecta (o tal vez indefinida).

¿Puede proporcionar más de su código?

Hola, tengo el mismo problema y paso la contraseña como texto sin formato y todavía me envía el mismo error. De hecho, solo descomento la línea requirepass en el archivo redis.conf predeterminado, como muestro en el siguiente código:

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

# Command renaming.

Hago esta configuración en mi máquina local para hacer las pruebas, pero sigo teniendo el mismo error:

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)

Aquí está mi código que aplico en mi 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())
})

Lo curioso es que cuando inicio el servidor, la clave "foo" se guarda en mi base de datos de Redis con el valor "bar", pero mi aplicación falla y no puedo hacer nada para interactuar con ella.

A todos aquí. Tuve el mismo problema cuando intenté usar una contraseña larga generada por el generador de contraseñas aleatorias de Linux. Cuando cambié la contraseña a algo mucho más corto, todo funcionó bien. Esto puede ser un problema con este paquete Node.JS en sí, porque la contraseña larga funcionó si entré en redis-cli y la usé con el comando auth . Sin embargo, exactamente la misma contraseña no funcionó cuando se pasó durante el método createClient() , independientemente de la variante del método que usé (es decir, URL completa o "auth_pass"/"contraseña" en el bloque de opciones, o redisClient.auth() método: todos fallaron con la contraseña larga).

Hola @roschler , ¿le gustaría proporcionar su código, por favor? La verdad es que probé tu sugerencia y sigo teniendo el mismo problema, ni siquiera con una contraseña como '123'. Intento con todas las formas que están en la documentación y nada diferente. Sé que esto te puede molestar pero la verdad es que no tengo otra opción. De antemano muchas gracias.

@maooricio Estoy 99,999% seguro de que se trata de una configuración incorrecta en el servidor o del servidor incorrecto. Mirando su código de octubre de 2018, intentaría usar una clave generada aleatoriamente y hacer eco con MONITOR en redis-cli .

Creo que @roschler está teniendo un problema completamente diferente (¿citando?)

Todavía tengo este problema. He intentado muchas formas diferentes de conectarme con mi redis db pero la autenticación de contraseña falló para el usuario.

@nicollasmatheus ¿cuál es tu error?

Estoy teniendo el mismo error. Estoy seguro de que todos los parámetros de configuración son correctos. He probado los 3 métodos y el mismo error en todos ellos.

      // 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)

Después de la configuración 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

estoy usando 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

y puedo acceder a redis usando cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'

@thellimist Mira lo que está pasando con redis-cli y MONITOR , especialmente con tu segundo método.

@estocolmo

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() }
   }

y llamo await Cache.init() . La respuesta es la siguiente:

[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)

También se agrega key/val "foo: bar" a redis. Entonces, se conecta correctamente inicialmente y luego, por alguna razón, intenta volver a conectarse pero falla. Solo llamo a await Cache.init() una vez en el servidor express. Escuche.

@thellimist Creo que lo malinterpreta: debe ejecutar MONITOR _from_ redis-cli para diagnosticar correctamente estos problemas. Ejecutarlo desde su aplicación como se indicó anteriormente no capturará la autenticación (porque sucede antes que MONITOR). También lo ejecutaría en una base de datos completamente vacía.

De todos modos, mirando su código (que supongo que es un fragmento), realmente parece que en otro lugar de su código está llamando a redis.createClient sin la contraseña adecuada (tal vez incluso a otro módulo). No veo los registros de depuración para la reconexión y el id 1 dice que está trabajando en un flujo de red diferente.

@estocolmo

El problema era simple como dijiste. Estaba usando el paquete typeorm y tenía un archivo de configuración diferente que no estaba en el archivo js/ts. Node Redis loge no me dijo desde dónde se estaba llamando, lo que hizo que fuera difícil de encontrar.

Gracias.

Si usa Docker, edite la configuración de red de archivos de su redis.conf:

bind 0.0.0.0

Eso lo arregló para mí.

@mariothedev ten SÚPER cuidado con eso. Sin los firewalls adecuados, su Redis está completamente abierto al usar esa configuración bind .

@stockholmux - gracias por avisarme :)

También estoy teniendo este problema aquí.

Mensaje de error: ReplyError: NOAUTH Authentication required.

Versión : Nodo Redis 3.0.0 / Redis 5.0.8

Encontré este hilo buscando una respuesta al mismo problema. Me pregunto cuál es la solución para esto.

Una posible resolución más para agregar a la lista. Recibí este error y me tomó un tiempo vergonzosamente largo recordar que estoy usando Bull , que es una cola basada en Redis. También estoy usando Redis en otra parte de la aplicación donde había estado pasando la información de conexión, pero me olvidé de Bull y recibí exactamente estos errores en la consola.

Entonces, supongo que otra cosa que debe verificar es si algo más en su aplicación está usando Redis y podría estar activando estos errores.

editar Si es Bull el que le está causando este error, debe usar password en su objeto de conexión redis, no auth_pass .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6Comentarios

jackycchen picture jackycchen  ·  4Comentarios

id0Sch picture id0Sch  ·  4Comentarios

betimer picture betimer  ·  5Comentarios

gpascale picture gpascale  ·  4Comentarios