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-climà không dùng flag-ahoặc chưa chạyAUTHsau 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
requirepassvàoredis.confvà 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

