Sửa lỗi Redis NOAUTH Authentication required

beginner🔴 Redis2026-03-18| Redis 4+ trên Linux, macOS, Windows — mọi Redis client (redis-cli, redis-py, ioredis, node_redis)

Error Message

NOAUTH Authentication required
#redis#auth#password#requirepass

Lỗi gì?

NOAUTH Authentication required

Lỗi này xảy ra ngay khi bạn chạy bất kỳ lệnh Redis nào trên một instance đã đặt mật khẩu — nhưng bạn chưa xác thực. Ví dụ điển hình: mở redis-cli, gõ SET key value, và Redis từ chối ngay lập tức.

Nguyên nhân

Khi cấu hình requirepass trong redis.conf, Redis sẽ khóa toàn bộ. Mọi client đều phải chạy AUTH <password> trước khi Redis chấp nhận bất kỳ lệnh nào khác. Kể cả PING — không có ngoại lệ.

Các nguyên nhân phổ biến:

  • Kết nối qua redis-cli mà không dùng flag -a hoặc chưa chạy AUTH sau khi kết nối
  • Config ứng dụng thiếu mật khẩu, hoặc dùng mật khẩu cũ sau khi đã đổi
  • Ai đó thêm requirepass vào redis.conf và restart Redis nhưng không cập nhật ứng dụng
  • Redis được quản lý (Redis Cloud, AWS ElastiCache, Upstash) — auth bắt buộc trên tất cả các dịch vụ này

Cách 1: Xác thực trong redis-cli

Cách A — Truyền mật khẩu khi kết nối

redis-cli -h 127.0.0.1 -p 6379 -a yourpassword

Cách B — Xác thực sau khi kết nối

redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> AUTH yourpassword
OK
127.0.0.1:6379> PING
PONG

Khi AUTH trả về OK, tất cả các lệnh tiếp theo trong phiên đó sẽ được thực thi. Bạn chỉ cần xác thực một lần cho mỗi kết nối.

Cách 2: Sửa kết nối trong ứng dụng

Ứng dụng báo lỗi NOAUTH? Redis client chưa gửi thông tin xác thực. Thêm mật khẩu vào cấu hình kết nối:

Python (redis-py)

import redis

r = redis.Redis(
    host='127.0.0.1',
    port=6379,
    password='yourpassword',
    decode_responses=True
)
r.ping()  # Trả về True nếu xác thực thành công

Node.js (ioredis)

const Redis = require('ioredis');

const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  password: 'yourpassword',
});

redis.ping().then(result => console.log(result)); // PONG

Node.js (node_redis v4)

import { createClient } from 'redis';

const client = createClient({
  url: 'redis://:yourpassword@127.0.0.1:6379'
});
await client.connect();

Dùng connection URL (khuyến nghị)

# .env
REDIS_URL=redis://:yourpassword@127.0.0.1:6379

Hầu hết Redis client đều chấp nhận URL đầy đủ với mật khẩu đã nhúng sẵn. Hai lợi ích: secret không bị lộ trong source code, và khi đổi mật khẩu chỉ cần cập nhật một biến môi trường.

Cách 3: Xóa mật khẩu (chỉ dùng khi phát triển)

Máy dev local, không cần xác thực? Tắt auth ngay lúc đang chạy mà không cần chỉnh file:

# Tắt auth trên instance đang chạy (cần mật khẩu hiện tại trước)
redis-cli -a currentpassword CONFIG SET requirepass ""

# Hoặc kiểm tra giá trị hiện tại
redis-cli -a currentpassword CONFIG GET requirepass

Muốn sửa trực tiếp file? Mở /etc/redis/redis.conf và comment dòng đó lại:

# requirepass yourpassword

Sau đó restart:

sudo systemctl restart redis
# hoặc trên hệ thống cũ hơn
sudo service redis-server restart

Tuyệt đối không làm điều này trên server production hoặc server có kết nối internet.

Cách 4: Không biết mật khẩu hiện tại

Mật khẩu do người khác cài? Kiểm tra file config — hầu như lúc nào cũng có ở dạng plain text:

grep requirepass /etc/redis/redis.conf
# hoặc quét tất cả file conf
sudo grep requirepass /etc/redis/*.conf

Vẫn không tìm thấy? Kiểm tra xem mật khẩu có được truyền khi khởi động không:

ps aux | grep redis-server
# Tìm --requirepass trong kết quả

Nếu không thể khôi phục, bạn cần quyền truy cập server để restart Redis với config mới.

Kiểm tra sau khi sửa

redis-cli -a yourpassword PING
# Kết quả mong đợi: PONG

redis-cli -a yourpassword SET testkey "hello"
# Kết quả mong đợi: OK

redis-cli -a yourpassword GET testkey
# Kết quả mong đợi: "hello"

# Dọn dẹp
redis-cli -a yourpassword DEL testkey

PING trả về PONG và SET/GET hoạt động bình thường — bạn đã xong.

Mẹo hay

Dùng mật khẩu dài và ngẫu nhiên

Redis có thể xử lý hàng trăm nghìn thao tác mỗi giây — kể cả các yêu cầu AUTH. Mật khẩu ngắn là rủi ro thực sự trên bất kỳ instance nào có kết nối internet. Hãy tạo chuỗi chữ và số dài 32+ ký tự; tôi dùng ToolCraft's Password Generator cho việc này. Chỉ dùng chữ và số: ký tự đặc biệt gây rắc rối khi escape trong shell khi truyền mật khẩu vào redis-cli.

Truyền mật khẩu qua biến môi trường

# docker-compose.yml
services:
  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}

Hệ thống ACL của Redis 6+

requirepass vẫn hoạt động trên Redis 6+, nhưng nên chuyển sang hệ thống ACL nếu nhiều service dùng chung một instance. Mật khẩu theo từng user, phân quyền lệnh chi tiết — kiểm soát tốt hơn nhiều:

# Tạo user riêng cho ứng dụng
ACL SETUSER appuser on >yourpassword ~* &* +@all

# Kết nối với user đó
AUTH appuser yourpassword

Connection string cho Redis được quản lý

Redis Cloud, Upstash và ElastiCache đều cung cấp sẵn connection URL từ dashboard — mật khẩu đã được nhúng sẵn. Chỉ cần copy là dùng:

redis://:password@your-host.example.com:6379
# TLS (Upstash, Redis Cloud)
rediss://:password@your-host.example.com:6380

Related Error Notes