Node-redis: تطلب مصادقة NOAUTH خطأ حتى مع تعيين كلمة المرور

تم إنشاؤها على ٢٩ يونيو ٢٠١٨  ·  18تعليقات  ·  مصدر: NodeRedis/node-redis

  • الإصدار : Node Redis 2.8.0 / Redis 4.0.9
  • النظام الأساسي : NodeJS 8.11.3 على مكدس Heroku-16
  • الوصف : أقوم بالاتصال بـ redis وأمرر كائن الخيارات التالي الذي يحتوي على كلمة المرور ولكن node_redis دائمًا ما يلقي خطأ NOAUTH
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

إذا اتصلت بـ redis باستخدام الأداة redis-cli فإنها تعمل بشكل جيد ولكن لسبب ما تلقيت هذا الخطأ

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

التعليق الأكثر فائدة

أواجه هذه المشكلة هنا أيضًا.

رسالة الخطأ: ReplyError: NOAUTH Authentication required.

الإصدار : Node Redis 3.0.0 / Redis 5.0.8

ال 18 كومينتر

من الصعب معرفة ذلك من مجرد كائن options ولكن هذا قياسي جدًا ومعروف جيدًا. إذا اضطررت إلى الرهان على أنك ربما تتصل بخادم redis غير صحيح أو أن nconf.get('redis_pass')[nodeEnv] يقدم كلمة مرور خاطئة (أو ربما غير محددة).

هل يمكنك توفير المزيد من التعليمات البرمجية الخاصة بك؟

مرحبًا ، لدي نفس المشكلة وأقوم بتمرير كلمة المرور كنص عادي ولا يزال يرسل لي نفس الخطأ. في الواقع ، أنا فقط ألغِ التعليق عن السطر الذي يتطلب تمريرًا في ملف redis.conf الافتراضي ، كما أعرض في الكود التالي:

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

# Command renaming.

أقوم بإجراء هذا التكوين في جهازي المحلي لإجراء الاختبارات ، لكنني ما زلت أحصل على نفس الخطأ:

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)

هذا هو الكود الخاص بي الذي أقوم بتطبيقه في خادم 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())
})

الشيء المضحك هو أنه عند بدء تشغيل الخادم ، يتم حفظ المفتاح "foo" في قاعدة بيانات redis الخاصة بي باستخدام "شريط" القيمة ، ولكن تطبيقي يتعطل ولا يمكنني فعل أي شيء للتفاعل معه.

للجميع هنا. واجهت نفس المشكلة عندما حاولت استخدام كلمة مرور طويلة تم إنشاؤها بواسطة منشئ كلمات المرور العشوائية في Linux. عندما قمت بتغيير كلمة المرور إلى شيء أقصر بكثير ، كان كل شيء يعمل بشكل جيد. قد تكون هذه مشكلة في حزمة Node.JS نفسها ، لأن كلمة المرور الطويلة تعمل إذا ذهبت إلى redis-cli واستخدمتها مع الأمر auth . ومع ذلك ، لم تعمل نفس كلمة المرور بالضبط عند تمريرها أثناء طريقة createClient () ، بغض النظر عن متغير الطريقة الذي استخدمته (على سبيل المثال - عنوان URL الكامل ، أو "auth_pass" / "password" في كتلة الخيارات ، أو redisClient.auth () الطريقة - فشلوا جميعًا مع كلمة المرور الطويلة).

مرحبًا @ roschler ، هل ترغب في تقديم الرمز الخاص بك من فضلك. الحقيقة هي أنني جربت اقتراحك وما زلت أواجه نفس المشكلة ، ولا حتى مع كلمة مرور مثل "123". أحاول بكل الطرق الموجودة في التوثيق ولا شيء مختلف. أعلم أن هذا يمكن أن يزعجك ولكن الحقيقة هي أنه ليس لدي خيار آخر. مقدما شكرا جزيلا.

maooricio أنا متأكد بنسبة 99.999٪ أن هذا خطأ في التكوين في الخادم أو الخادم الخطأ. بالنظر إلى الكود الخاص بك من أكتوبر 2018 ، سأحاول استخدام مفتاح تم إنشاؤه عشوائيًا وترديد الصدى مع MONITOR في redis-cli .

أعتقد أن @ roschler تواجه مشكلة مختلفة تمامًا (اقتباس؟)

ما زلت أواجه هذه المشكلة معي ، لقد جربت العديد من الطرق المختلفة للاتصال بـ redis db الخاص بي ولكن فشل المصادقة على كلمة المرور للمستخدم

nicollasmatheus ما هو خطأك؟

أواجه نفس الخطأ. أنا واثق من صحة جميع معلمات الإعداد. لقد جربت جميع الطرق الثلاثة ونفس الخطأ في كل منهم.

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

بعد الإعدادات 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

أنا أستخدم عامل بناء السفن

  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

ويمكنني الوصول إلى redis باستخدام cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'

thellimist تحقق مما يحدث مع redis-cli و MONITOR ، خاصة مع طريقتك الثانية.

تضمين التغريدة

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

وأدعو await Cache.init() . الرد هو التالي:

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

كما تمت إضافة key / val "foo: bar" إلى redis. لذلك يتم الاتصال بشكل صحيح في البداية ثم لسبب ما يحاول إعادة الاتصال ولكنه يفشل. أنا أتصل فقط بـ await Cache.init() مرة واحدة في express.listen.

thellimist أعتقد أنك تسيء الفهم - تحتاج إلى تشغيل MONITOR _from_ redis-cli لتشخيص هذه المشكلات بشكل صحيح. لن يؤدي تشغيله من داخل تطبيقك كما هو مذكور أعلاه إلى التقاط المصادقة (لأنه يحدث قبل المراقبة). أود أيضًا تشغيله على قاعدة بيانات متدفقة تمامًا.

على أي حال ، بالنظر إلى الكود الخاص بك (الذي أفترض أنه مقتطف) ، يبدو حقًا أنه في مكان آخر في الكود الخاص بك تتصل بـ redis.createClient بدون كلمة المرور المناسبة (ربما وحدة أخرى). لا أرى سجلات تصحيح الأخطاء لإعادة الاتصال ويقول id 1 أنك تعمل على دفق شبكة مختلف.

تضمين التغريدة

كانت القضية بسيطة كما قلت. كنت أستخدم حزمة typeorm وكان بها ملف تكوين مختلف لم يكن في ملف js / ts. لم تخبرني Node Redis loge من أين تم استدعائها مما جعل من الصعب العثور عليها.

شكرا.

إذا كنت تستخدم Docker ، فقم بتحرير إعداد شبكة ملفات redis.conf:

bind 0.0.0.0

هذا أصلحها بالنسبة لي.

mariothedev كن حذرا للغاية مع ذلك. بدون جدران الحماية المناسبة ، يكون redis الخاص بك مفتوحًا على مصراعيه باستخدام هذا الإعداد bind .

stockholmux - شكرا لإعلامي :)

أواجه هذه المشكلة هنا أيضًا.

رسالة الخطأ: ReplyError: NOAUTH Authentication required.

الإصدار : Node Redis 3.0.0 / Redis 5.0.8

جاء عبر هذا الموضوع باحثًا عن إجابة لنفس المشكلة. أتساءل ما هو الحل لهذا.

قرار آخر ممكن لإضافته إلى القائمة. لقد تلقيت هذا الخطأ واستغرق الأمر وقتًا طويلاً محرجًا لأتذكر أنني أستخدم Bull وهي قائمة انتظار تستند إلى Redis. أنا أستخدم Redis أيضًا في مكان آخر في التطبيق حيث كنت أقوم بتمرير معلومات الاتصال ، لكنني نسيت أمر Bull وكنت أتلقى هذه الأخطاء بالضبط على وحدة التحكم.

لذلك أعتقد أن هناك شيئًا آخر يجب التحقق منه وهو ما إذا كان أي شيء آخر في تطبيقك يستخدم Redis وربما يعيد تشغيل هذه الأخطاء.

تحرير إذا كان Bull هو الذي تسبب في هذا الخطأ بالنسبة لك ، فيجب عليك استخدام password في كائن اتصال redis ، وليس auth_pass .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

ghost picture ghost  ·  3تعليقات

shmendo picture shmendo  ·  6تعليقات

id0Sch picture id0Sch  ·  4تعليقات

michaelwittig picture michaelwittig  ·  3تعليقات

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6تعليقات