Node-redis: NOAUTH Erreur d'authentification requise même avec un mot de passe défini

Créé le 29 juin 2018  ·  18Commentaires  ·  Source: NodeRedis/node-redis

  • Version : Nœud Redis 2.8.0 / Redis 4.0.9
  • Plateforme : NodeJS 8.11.3 sur pile Heroku-16
  • Description : Je me connecte à redis et transmets l'objet d'options suivant qui a le mot de passe mais node_redis génère toujours une erreur NOAUTH
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

Si je me connecte à redis avec l'outil redis-cli , cela fonctionne très bien, mais pour une raison quelconque, j'obtiens cette erreur

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

Commentaire le plus utile

J'ai aussi ce problème ici.

Message d'erreur : ReplyError: NOAUTH Authentication required.

Version : Nœud Redis 3.0.0 / Redis 5.0.8

Tous les 18 commentaires

Difficile à dire à partir de votre objet options mais c'est assez standard et c'est bien connu. Si je devais parier que vous vous connectez peut-être au mauvais serveur Redis ou nconf.get('redis_pass')[nodeEnv] fournit le mauvais mot de passe (ou peut-être indéfini).

Pouvez-vous fournir plus de votre code?

Salut, j'ai le même problème et je passe le mot de passe en texte brut et il m'envoie toujours la même erreur. En fait je décommente seulement la ligne requirepass dans le fichier redis.conf par défaut, comme je le montre dans le code suivant :

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

# Command renaming.

Je fais cette configuration sur ma machine locale afin de faire les tests, mais j'obtiens toujours la même erreur :

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)

Voici mon code que j'applique dans mon serveur 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())
})

Le plus drôle, c'est que lorsque je démarre le serveur, la clé "foo" est enregistrée dans ma base de données redis avec la valeur "bar", mais mon application plante et je ne peux rien faire pour interagir avec elle.

A tout le monde ici. J'ai eu le même problème lorsque j'ai essayé d'utiliser un mot de passe long généré par le générateur de mot de passe aléatoire Linux. Lorsque j'ai changé le mot de passe pour quelque chose de beaucoup plus court, tout a bien fonctionné. Cela peut être un problème avec ce package Node.JS lui- même , car le mot de passe long fonctionnait si j'entrais dans redis-cli et l'utilisais avec la commande auth . Cependant, le même mot de passe exact ne fonctionnait pas lorsqu'il était transmis lors de la méthode createClient() , quelle que soit la variante de méthode que j'utilisais (c'est-à-dire - URL complète, ou "auth_pass"/"password" dans le bloc d'options, ou redisClient.auth() méthode - ils ont tous échoué avec le mot de passe long).

Salut @roschler , voudriez-vous fournir votre code s'il vous plaît. La vérité est que j'ai essayé votre suggestion et j'ai toujours le même problème, même avec un mot de passe comme '123'. J'essaie avec toutes les manières qui sont dans la documentation et rien de différent. Je sais que cela peut vous déranger mais la vérité est que je n'ai pas d'autre choix. D'avance merci beaucoup.

@maooricio Je suis sûr à 99,999% qu'il s'agit d'une mauvaise configuration du serveur ou du mauvais serveur. En regardant votre code d'octobre 2018, j'essaierais d'utiliser une clé générée aléatoirement et de faire écho avec MONITOR dans redis-cli .

Je pense que @roschler a un problème entièrement différent (citation?)

J'ai toujours ce problème qui s'est produit avec moi J'ai essayé tellement de façons différentes de me connecter avec ma base de données redis mais l'authentification par mot de passe a échoué pour l'utilisateur

@nicollasmatheus quelle est votre erreur ?

J'ai la même erreur. Je suis convaincu que tous les paramètres de réglage sont corrects. J'ai essayé les 3 méthodes et la même erreur dans chacune d'elles.

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

Après les réglages 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

J'utilise 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

et je peux accéder à redis en utilisant cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'

@thellimist Découvrez ce qui se passe avec redis-cli et MONITOR , en particulier avec votre deuxième méthode.

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

et j'appelle await Cache.init() . La réponse est la suivante :

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

La clé/val "foo: bar" est également ajoutée à redis. Donc, il se connecte correctement au départ, puis pour une raison quelconque, il essaie de se reconnecter mais échoue. Je n'appelle await Cache.init() qu'une seule fois dans express server.listen.

@thellimist Je pense que vous avez mal compris - vous devez exécuter MONITOR _from_ redis-cli pour diagnostiquer correctement ces problèmes. L'exécuter depuis votre application comme ci-dessus ne capturera pas l'authentification (car elle se produit avant le MONITOR). Je l'exécuterais également sur une base de données complètement vidée.

Quoi qu'il en soit, en regardant votre code (qui, je suppose, est un extrait), il semble vraiment qu'à un autre endroit de votre code, vous appelez redis.createClient sans le mot de passe approprié (peut-être même un autre module). Je ne vois pas les journaux de débogage pour la reconnexion et le id 1 indique que vous travaillez sur un flux réseau différent.

@stockholmux

Le problème était simple comme vous l'avez dit. J'utilisais le package typeorm et il avait un fichier de configuration différent qui n'était pas dans le fichier js/ts. Node Redis loge ne m'a pas dit d'où il était appelé, ce qui l'a rendu difficile à trouver.

Merci.

Si vous utilisez Docker, modifiez le paramètre de réseau de fichiers de votre redis.conf :

bind 0.0.0.0

Cela m'a réglé le problème.

@mariothedev soyez SUPER prudent avec ça. Sans pare-feu appropriés, votre redis est grand ouvert avec l'utilisation de ce paramètre bind .

@stockholmux - merci de me l'avoir fait savoir :)

J'ai aussi ce problème ici.

Message d'erreur : ReplyError: NOAUTH Authentication required.

Version : Nœud Redis 3.0.0 / Redis 5.0.8

Je suis tombé sur ce fil à la recherche d'une réponse au même problème. Vous vous demandez quelle est la solution pour cela.

Une autre résolution possible à ajouter à la liste. J'obtenais cette erreur et il m'a fallu un temps embarrassant pour me souvenir que j'utilisais Bull , qui est une file d'attente basée sur Redis. J'utilise également Redis ailleurs dans l'application où j'avais transmis les informations de connexion, mais j'ai oublié Bull et j'obtenais exactement ces erreurs sur la console.

Donc, je suppose qu'une autre chose à vérifier est si quelque chose d'autre dans votre application utilise Redis et pourrait renvoyer ces erreurs.

edit Si c'est Bull qui cause cette erreur pour vous, vous devez utiliser password dans votre objet de connexion redis, et non auth_pass .

Cette page vous a été utile?
0 / 5 - 0 notes