การเชื่อมต่อกับ redis ที่ได้รับการจัดการด้วยโหนดชื่อผู้ใช้ / รหัสผ่านรับรองความถูกต้อง

Aug 15 2020

แก้ไข: หลังจากคิดถึงปัญหาแล้วคำถามที่แท้จริงคือตัวอย่างของการเชื่อมต่อกับ redis ที่มีการจัดการของ digitalocean กับ node-redis โดยใช้ tls คืออะไร?

ฉันสามารถเชื่อมต่อได้ดีกับไคลเอนต์ redisinsight GUI โดยใช้ชื่อผู้ใช้ / รหัสผ่าน แต่ไม่สามารถเชื่อมต่อกับ nodejs ได้ อยู่ในคอมพิวเตอร์เครื่องเดียวกันจึงไม่มีปัญหาเรื่องไฟร์วอลล์

var redis = require('redis');
var client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_URL, {no_ready_check: true});
client.auth('password', function (err) {
    if (err) {
      console.log(err);
      return
    }
    console.log('auth')
});

สิ่งหนึ่งที่ฉันสับสนคือจะป้อนชื่อผู้ใช้ที่ไหน? เป็นเพียง 'ค่าเริ่มต้น' แต่เอกสารสำหรับ node_redis ไม่ได้ระบุวิธีให้ชื่อผู้ใช้ในระหว่างการตรวจสอบสิทธิ์

ข้อผิดพลาดคือ: AbortError: Redis connection lost and command aborted. It might have been processed.

นี่คือหน้าจอการเชื่อมต่อการตรวจจับการเชื่อมต่อแบบ redisinsight ที่ทำงานได้โดยไม่เปิดเผยตัวตน

ฉันจะทำเช่นเดียวกันใน node-redis ได้อย่างไร

คำตอบ

2 LeoMurillo Aug 16 2020 at 07:36

AUTHคำสั่งตามที่ระบุไว้ในเอกสาร :

เมื่อใช้ ACL รูปแบบอาร์กิวเมนต์เดียวของคำสั่งซึ่งระบุเฉพาะรหัสผ่านจะถือว่าชื่อผู้ใช้โดยนัยคือ "ค่าเริ่มต้น"

ดังนั้นแม้ว่าคุณจะใช้ Redis 6 ซึ่งรองรับผู้ใช้เพิ่มเติมการรับรองความถูกต้องของคุณdefaultก็ควรใช้งานได้

ข้อผิดพลาดที่คุณเห็นเป็นผลมาจากการเชื่อมต่อที่ขาดเช่นคุณขาดการเชื่อมต่อกับเซิร์ฟเวอร์ Redis node-redisกำลังจัดการกับหนึ่งในสองสถานการณ์ (หรือทั้งสองอย่าง) - การเชื่อมต่อหมดเวลาหรือความพยายามในการเชื่อมต่อใหม่เกินจำนวนสูงสุดที่ระบุในการกำหนดค่า ฉันจะตรวจสอบข้อมูลการเชื่อมต่อของคุณอีกครั้งและวิธีกำหนดค่าเซิร์ฟเวอร์ redis ของคุณ

ฉันเห็นว่าคุณใช้ TLS คุณอาจพบว่ามีประโยชน์นี้: การรักษาความปลอดภัยโหนด Redis

หากคุณต้องการการตรวจสอบโหนด Redis ลูกค้ากับผู้ใช้ที่แตกต่างกันเมื่อใช้ Redis 6 คุณจะต้องใช้send_commandแต่ก่อนที่คุณจะต้องลบในปัจจุบันAUTHคำสั่งในปัจจุบันโหนด Redis AUTH <username> <password>ไม่สนับสนุนคำสั่งใหม่

client['auth'] = null;
client.send_command('AUTH', ['<username>', '<password>'], redis.print);