Node-redis: NOAUTH Authentifizierungsfehler erforderlich, auch wenn das Kennwort festgelegt ist

Erstellt am 29. Juni 2018  ·  18Kommentare  ·  Quelle: NodeRedis/node-redis

  • Version : Knoten Redis 2.8.0 / Redis 4.0.9
  • Plattform : NodeJS 8.11.3 auf Heroku-16-Stack
  • Beschreibung : Ich verbinde mich mit Redis und übergebe das folgende Optionsobjekt, das das Passwort enthält, aber node_redis gibt immer einen NOAUTH-Fehler aus
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

Wenn ich mich mit dem redis-cli -Tool mit Redis verbinde, funktioniert es einwandfrei, aber aus irgendeinem Grund bekomme ich diesen Fehler

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

Hilfreichster Kommentar

Ich habe dieses Problem hier auch.

Fehlermeldung: ReplyError: NOAUTH Authentication required.

Version : Knoten Redis 3.0.0 / Redis 5.0.8

Alle 18 Kommentare

Schwer zu sagen nur von Ihrem options -Objekt, aber das ist ziemlich Standard und bekanntermaßen gut. Wenn ich wetten müsste, dass Sie sich vielleicht mit dem falschen Redis-Server verbinden oder nconf.get('redis_pass')[nodeEnv] das falsche Passwort liefert (oder vielleicht undefiniert).

Können Sie mehr von Ihrem Code liefern?

Hallo, ich habe das gleiche Problem und ich übergebe das Passwort als Klartext und es sendet mir immer noch den gleichen Fehler. Tatsächlich entkommentiere ich nur die Zeile requirepass in der Standarddatei redis.conf, wie ich im folgenden Code zeige:

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

# Command renaming.

Ich mache diese Konfiguration auf meinem lokalen Computer, um die Tests durchzuführen, aber ich bekomme immer noch den gleichen Fehler:

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)

Hier ist mein Code, den ich auf meinem nodejs-Server anwende:

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

Das Lustige ist, dass beim Starten des Servers der Schlüssel "foo" in meiner Redis-Datenbank mit dem Wert "bar" gespeichert wird, aber meine App stürzt ab und ich kann nichts tun, um damit zu interagieren.

An alle hier. Ich hatte das gleiche Problem, als ich versuchte, ein langes Passwort zu verwenden, das vom Linux-Zufallspasswortgenerator generiert wurde. Als ich das Passwort auf etwas viel Kürzeres änderte, funktionierte alles einwandfrei. Dies kann ein Problem mit diesem Node.JS-Paket selbst sein, da das lange Passwort funktioniert hat, wenn ich in redis-cli gegangen bin und es mit dem Befehl auth verwendet habe. Das exakt gleiche Passwort funktionierte jedoch nicht, wenn es während der Methode createClient() übergeben wurde, unabhängig davon, welche Methodenvariante ich verwendet habe (dh - vollständige URL oder "auth_pass"/"password" im Optionsblock oder redisClient.auth() Methode - sie alle sind mit dem langen Passwort gescheitert).

Hallo @roschler , möchten Sie bitte Ihren Code angeben. Die Wahrheit ist, dass ich Ihren Vorschlag ausprobiert habe und immer noch das gleiche Problem habe, nicht einmal mit einem Passwort wie „123“. Ich versuche es mit allen Möglichkeiten, die in der Doku stehen und nichts anderes. Ich weiß, dass dich das stören kann, aber die Wahrheit ist, dass ich keine andere Wahl habe. Im Voraus vielen Dank.

@maooricio Ich bin mir zu 99,999% sicher, dass dies eine Fehlkonfiguration auf dem Server oder dem falschen Server ist. Wenn ich mir Ihren Code vom Oktober 2018 ansehe, würde ich versuchen, einen zufällig generierten Schlüssel zu verwenden und mit MONITOR in redis-cli zu echoen.

Ich denke, dass @roschler ein ganz anderes Problem hat (Zitat?)

Ich habe immer noch dieses Problem, das bei mir aufgetreten ist. Ich habe so viele verschiedene Möglichkeiten ausprobiert, um eine Verbindung mit meiner Redis-Datenbank herzustellen, aber die Kennwortauthentifizierung für den Benutzer ist fehlgeschlagen

@nicolasmatheus was ist dein fehler?

Ich habe den gleichen Fehler. Ich bin zuversichtlich, dass alle Einstellparameter korrekt sind. Ich habe alle 3 Methoden ausprobiert und bei allen denselben Fehler.

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

Nach den Einstellungen 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

Ich verwende 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

und ich kann mit cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword' auf Redis zugreifen

@thellimist Sehen Sie sich an, was mit redis-cli und MONITOR passiert, insbesondere mit Ihrer zweiten Methode.

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

und ich rufe await Cache.init() . Antwort ist folgende:

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

Auch key/val "foo: bar" wird redis hinzugefügt. Es verbindet sich also zunächst korrekt und versucht dann aus irgendeinem Grund, die Verbindung wiederherzustellen, schlägt jedoch fehl. Ich rufe await Cache.init() nur einmal in express server.listen an.

@thellimist Ich glaube, Sie missverstehen - Sie müssen MONITOR _from_ redis-cli $ ausführen, um diese Probleme richtig zu diagnostizieren. Wenn Sie es wie oben in Ihrer Anwendung ausführen, wird die Authentifizierung nicht erfasst (weil dies vor dem MONITOR geschieht). Ich würde es auch auf einer vollständig geleerten DB ausführen.

Wie auch immer, wenn Sie sich Ihren Code ansehen (von dem ich annehme, dass er ein Ausschnitt ist), sieht es wirklich so aus, als würden Sie irgendwo anders in Ihrem Code redis.createClient ohne das richtige Passwort aufrufen (vielleicht sogar ein anderes Modul). Ich sehe die Debug-Protokolle für die Wiederverbindung nicht und id 1 sagt, dass Sie an einem anderen Netzwerk-Stream arbeiten.

@stockholmux

Das Problem war einfach, wie Sie sagten. Ich habe das Typeorm-Paket verwendet und es hatte eine andere Konfigurationsdatei, die nicht in der js/ts-Datei enthalten war. Node Redis loge sagte mir nicht, von wo aus es aufgerufen wurde, was es schwer zu finden machte.

Danke.

Wenn Sie Docker verwenden, bearbeiten Sie die Dateinetzwerkeinstellung Ihrer redis.conf:

bind 0.0.0.0

Das hat es für mich behoben.

@mariothedev sei dabei SUPER vorsichtig. Ohne geeignete Firewalls ist Ihr Redis weit offen, wenn Sie diese bind -Einstellung verwenden.

@stockholmux - danke für den Hinweis :)

Ich habe dieses Problem hier auch.

Fehlermeldung: ReplyError: NOAUTH Authentication required.

Version : Knoten Redis 3.0.0 / Redis 5.0.8

Bin auf der Suche nach einer Antwort auf das gleiche Problem auf diesen Thread gestoßen. Fragt sich, was die Lösung dafür ist.

Eine weitere mögliche Lösung, die der Liste hinzugefügt werden kann. Ich habe diesen Fehler erhalten und es hat peinlich lange gedauert, bis ich mich daran erinnerte, dass ich Bull verwende, eine Redis-basierte Warteschlange. Ich verwende Redis auch an anderer Stelle in der Anwendung, wo ich die Verbindungsinformationen übergeben hatte, aber Bull vergessen hatte und genau diese Fehler auf der Konsole erhielt.

Ich denke, eine andere Sache, die Sie überprüfen sollten, ist, ob irgendetwas anderes in Ihrer App Redis verwendet und diese Fehler möglicherweise zurückfeuert.

bearbeiten Wenn es Bull ist, der diesen Fehler für Sie verursacht, müssen Sie password in Ihrem Redis-Verbindungsobjekt verwenden, nicht auth_pass .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

aletorrado picture aletorrado  ·  6Kommentare

adamgajzlerowicz picture adamgajzlerowicz  ·  4Kommentare

id0Sch picture id0Sch  ·  4Kommentare

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

strumwolf picture strumwolf  ·  4Kommentare