Node-redis: Ошибка проверки подлинности NOAUTH даже с установленным паролем

Созданный на 29 июн. 2018  ·  18Комментарии  ·  Источник: NodeRedis/node-redis

  • Версия : узел 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.

Версия : узел Redis 3.0.0/Redis 5.0.8

Все 18 Комментарий

Трудно сказать только по вашему объекту options , но это довольно стандартно и хорошо известно. Если бы мне пришлось поспорить, вы, возможно, подключаетесь к неправильному серверу Redis или nconf.get('redis_pass')[nodeEnv] предоставляет неправильный пароль (или, возможно, не определено).

Можете ли вы предоставить больше вашего кода?

Привет, у меня такая же проблема, я передаю пароль в виде простого текста, и он все равно выдает мне ту же ошибку. На самом деле я только раскомментировал строку requirepass в файле 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 со значением «bar», но мое приложение вылетает, и я ничего не могу с ним сделать.

Всем здесь. У меня была такая же проблема, когда я пытался использовать длинный пароль, сгенерированный генератором случайных паролей Linux. Когда я изменил пароль на более короткий, все заработало нормально. Это может быть проблемой с самим пакетом Node.JS, потому что длинный пароль работал , если я зашел в redis-cli и использовал его с командой auth . Однако один и тот же пароль не работал при передаче во время метода createClient() , независимо от того, какой вариант метода я использовал (например, полный URL-адрес или «auth_pass»/«пароль» в блоке параметров или redisClient.auth()). метод - все они не сработали с длинным паролем).

Привет @roschler , не могли бы вы предоставить свой код, пожалуйста. Правда в том, что я попробовал ваше предложение, и у меня все еще та же проблема, даже с таким паролем, как «123». Я пробую всеми способами, которые есть в документации, и ничего другого. Я знаю, что это может беспокоить тебя, но правда в том, что у меня нет другого выбора. Заранее большое спасибо.

@maooricio Я на 99,999% уверен, что это неправильная конфигурация на сервере или неправильный сервер. Глядя на ваш код от октября 2018 года, я бы попробовал использовать случайно сгенерированный ключ и повторить его с помощью MONITOR в redis-cli .

Я думаю, что у @roschler совершенно другая проблема (цитирование?)

У меня все еще есть эта проблема, которая возникла со мной. Я пробовал так много разных способов подключения к моей базе данных Redis, но аутентификация по паролю не удалась для пользователя.

@nicollasmatheus , в чем твоя ошибка?

У меня такая же ошибка. Я уверен, что все параметры настройки верны. Я пробовал все 3 метода и во всех них одна и та же ошибка.

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

Я использую 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

и я могу получить доступ к Redis, используя cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword'

@thellimist Посмотрите, что происходит с redis-cli и MONITOR , особенно со вторым методом.

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

и я звоню 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)

Также в redis добавлен ключ/val "foo: bar". Таким образом, сначала он подключается правильно, а затем по какой-то причине пытается повторно подключиться, но терпит неудачу. Я вызываю await Cache.init() только один раз в экспресс-сервере server.listen.

@thellimist Я думаю, вы неправильно поняли - вам нужно запустить MONITOR _from_ redis-cli , чтобы правильно диагностировать эти проблемы. Запуск его из вашего приложения, как указано выше, не зафиксирует аутентификацию (поскольку это происходит до МОНИТОРА). Я бы также запустил его на полностью очищенной БД.

В любом случае, глядя на ваш код (который, как я полагаю, является фрагментом), действительно похоже, что где-то еще в вашем коде вы вызываете redis.createClient без правильного пароля (возможно, даже другого модуля). Я не вижу журналы отладки для повторного подключения, а id 1 говорит, что вы работаете с другим сетевым потоком.

@stockholmux

Проблема была проста, как вы сказали. Я использовал пакет typeorm, и у него был другой файл конфигурации, которого не было в файле js/ts. Node Redis loge не сообщил мне, откуда он вызывается, что затрудняло его поиск.

Спасибо.

Если вы используете Docker, отредактируйте настройки файловой сети вашего redis.conf:

bind 0.0.0.0

Это исправило это для меня.

@mariothedev будь СУПЕР осторожен с этим. Без надлежащих брандмауэров ваш Redis широко открыт с использованием этой настройки bind .

@stockholmux - спасибо, что сообщили мне :)

У меня тоже вот эта проблема.

Сообщение об ошибке: ReplyError: NOAUTH Authentication required.

Версия : узел Redis 3.0.0/Redis 5.0.8

Наткнулся на эту тему в поисках ответа на ту же проблему. Интересно, какое решение для этого.

Еще одно возможное решение для добавления в список. Я получал эту ошибку, и мне потребовалось слишком много времени, чтобы вспомнить, что я использую Bull , который представляет собой очередь на основе Redis. Я также использую Redis в другом месте приложения, где я передавал информацию о подключении, но забыл о Bull и получал именно эти ошибки на консоли.

Поэтому я думаю, что еще одна вещь, которую нужно проверить, это то, что что-то еще в вашем приложении использует Redis и может возвращать эти ошибки.

изменить Если это Bull вызывает эту ошибку для вас, вы должны использовать password в своем объекте соединения redis, а не auth_pass .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

abhaygarg picture abhaygarg  ·  5Комментарии

aletorrado picture aletorrado  ·  6Комментарии

ghost picture ghost  ·  3Комментарии

Atala picture Atala  ·  3Комментарии

betimer picture betimer  ·  5Комментарии