เว็บฮุก
RolChat ส่งเหตุการณ์ไปยังระบบของคุณเป็นคำขอ HTTP POST ที่ลงลายมือชื่อ หน้านี้อธิบายเว็บฮุกของปลั๊กอิน ส่วนเว็บฮุกที่ส่งโดยกฎของระบบอัตโนมัติแตกต่างกันในเรื่องการลองใหม่ เวลารอ และการหมุนเวียนความลับ ดูเว็บฮุกของระบบอัตโนมัติ กฎเดียวกันใช้ในทิศทางกลับกันเมื่อระบบของคุณ ปลั๊กอิน หรือผู้ให้บริการส่งข้อมูลเข้า RolChat ตรวจสอบทุกการส่งตามลำดับด้านล่างก่อนนำไปใช้
หน้าตาของการส่ง
หัวข้อที่มีชื่อว่า “หน้าตาของการส่ง”POST /your/endpoint HTTP/1.1Content-Type: application/jsonUser-Agent: RolChat-Webhook/1.0X-RolChat-Timestamp: 1713615825X-RolChat-Signature: sha256=a1b2c3…X-RolChat-Nonce: nonce_01HKQN9…X-RolChat-Event-Id: evt_01HKQN9…
{ "id": "evt_01HKQN9…", "type": "conversation.created", "occurred_at": "…", "data": { … } }| เฮดเดอร์ | ความหมาย |
|---|---|
X-RolChat-Timestamp |
วินาที Unix ขณะส่ง เป็นส่วนหนึ่งของข้อความที่ลงลายมือชื่อ |
X-RolChat-Signature |
sha256=<hex> คำนำหน้าระบุอัลกอริทึมเพื่อให้เปลี่ยนได้ในอนาคต |
X-RolChat-Nonce |
ULID ที่ไม่ซ้ำสำหรับคำขอ HTTP นี้ การลองใหม่จะได้ nonce ใหม่ |
X-RolChat-Event-Id |
ID ของเหตุการณ์เอง คงที่ข้ามการลองใหม่ ใช้สำหรับลบรายการซ้ำ |
การส่งขาออกไปยังเอนด์พอยต์ HTTPS เท่านั้น URL แบบ HTTP จะถูกปฏิเสธเมื่อสร้างการสมัครรับ
ลายมือชื่อ
หัวข้อที่มีชื่อว่า “ลายมือชื่อ”ข้อความที่ลงลายมือชื่อคือเวลาประทับ ตามด้วยจุดตามตัวอักษร และเนื้อหาคำขอดิบทีละไบต์:
canonical = "<timestamp>.<body>"signature = hex( HMAC-SHA256( secret, canonical ) )ตรวจลายมือชื่อกับไบต์ที่คุณได้รับ ไม่ใช่สำเนาที่แปลง JSON แล้วแปลงกลับ การเปลี่ยนช่องว่างหรือลำดับคีย์จะทำให้ลายมือชื่อใช้ไม่ได้ SHA-256 เป็นอัลกอริทึมเดียวที่ยอมรับ
การยืนยันการส่ง
หัวข้อที่มีชื่อว่า “การยืนยันการส่ง”ตรวจสอบห้าข้อนี้ตามลำดับ ตัวอย่างใน Python, Node.js, Go, Ruby และ PHP อยู่ในหน้าตัวอย่างการตรวจสอบ
- ความสดใหม่ ปฏิเสธหาก
|now − X-RolChat-Timestamp| > 300วินาที (400) ห้านาทีเผื่อความคลาดเคลื่อนของนาฬิกาและทำให้คำขอที่ถูกดักจับไร้ค่าหลังจากนั้น ตั้งเซิร์ฟเวอร์ให้ใช้ NTP - ลายมือชื่อ คำนวณค่าที่คาดไว้แล้วเปรียบเทียบแบบเวลาคงที่ (
hmac.compare_digestcrypto.timingSafeEqualhash_equals) ปฏิเสธด้วย401หากไม่ตรงกัน การเปรียบเทียบสตริงธรรมดาทำให้ข้อมูลเวลารั่วไหลและยอมรับไม่ได้ - Nonce เก็บ
X-RolChat-Nonceพร้อม TTL 10 นาทีด้วยการตั้งค่าแบบอะตอมเมื่อยังไม่มี (SET NX EX 600) หากมีอยู่แล้ว ปฏิเสธด้วย409: คำขอนั้นเป็นการส่งซ้ำ หากที่เก็บ nonce ใช้งานไม่ได้ ให้ล้มเหลวแบบปิดด้วย503เพื่อให้ RolChat ลองใหม่ ห้ามปล่อยผ่านเป็น “ยอมรับ” - แยกวิเคราะห์เนื้อหาในขั้นนี้เท่านั้น
- ลบรายการซ้ำตาม ID เหตุการณ์ การลองใหม่มี nonce ใหม่แต่
X-RolChat-Event-Idเดิม หากคุณประมวลผล ID นั้นแล้วในเจ็ดวันที่ผ่านมา ให้ตอบ200โดยไม่ประมวลผลซ้ำ
ตอบ 2xx ทันทีที่รับการส่งไว้อย่างปลอดภัย แล้วทำงานแบบอะซิงโครนัส RolChat รอการตอบกลับ 15 วินาที
ซีเคร็ต
หัวข้อที่มีชื่อว่า “ซีเคร็ต”- ซีเคร็ตเว็บฮุกคือไบต์สุ่ม 64 ไบต์ เข้ารหัสแบบ base64url (ประมาณ 86 ตัวอักษร) สร้างขึ้นเมื่อสร้างการสมัครรับหรือปลั๊กอิน และแสดงเพียงครั้งเดียว
- เก็บไว้ในที่เก็บความลับหรือ environment ของคุณเอง RolChat เก็บเฉพาะสำเนาที่เข้ารหัส
- แนะนำให้หมุนเวียนหลัง 90 วัน ผลิตภัณฑ์แสดงการเตือนแต่ไม่ปิดการสมัครรับเพราะไม่ได้หมุนเวียน
- การหมุนเวียนใช้ช่วงซ้อนทับ: หลัง
POST /api/v1/plugins/{id}/webhook-secret/rotateทั้งซีเคร็ตเก่าและใหม่ใช้ตรวจสอบได้เจ็ดวัน การส่งใหม่ลงลายมือชื่อด้วยซีเคร็ตใหม่ และซีเคร็ตเก่าถูกลบหลังหมดช่วง ไม่มีอะไรเสียหายในขณะที่หมุนเวียน - หากซีเคร็ตรั่วไหล
POST /api/v1/plugins/{id}/webhook-secret/revokeจะทำให้ซีเคร็ตนั้นใช้ไม่ได้ทันที ออกซีเคร็ตใหม่ ส่งอีเมลถึงผู้ดูแลระบบของบัญชี และเขียนรายการตรวจสอบ
การลองใหม่และ dead letter
หัวข้อที่มีชื่อว่า “การลองใหม่และ dead letter”การตอบกลับที่ไม่ใช่ 2xx หรือความล้มเหลวของเครือข่ายจะนัดการลองใหม่:
| ครั้งที่ | หน่วงเวลาหลังครั้งก่อน |
|---|---|
| 1 | ทันที |
| 2 | 15 วินาที |
| 3 | 1 นาที |
| 4 | 5 นาที |
| 5 | 30 นาที |
| 6 | 2 ชั่วโมง |
| 7 | 8 ชั่วโมง |
| 8 | 24 ชั่วโมง |
408 429 5xx และข้อผิดพลาดเครือข่ายจะถูกลองใหม่ ส่วน 400 401 403 404 และ 410 จะไม่ลองใหม่: การส่งจะเข้าคิว dead letter ทันที เพราะการลองใหม่กับลายมือชื่อที่ถูกปฏิเสธหรือเอนด์พอยต์ที่ไม่มีอยู่ไม่ช่วยอะไร หลังล้มเหลวแปดครั้ง การส่งจะเข้าสู่ dead letter เช่นกัน
Dead letter ถูกเก็บ 30 วันและดูได้ใน การตั้งค่า → ปลั๊กอิน → {plugin} → บันทึกเว็บฮุก → DLQ ซึ่งผู้ดูแลระบบส่งซ้ำทีละรายการได้ (POST /api/v1/plugins/{id}/webhook-dlq/{entry_id}/replay)
ขีดจำกัด
หัวข้อที่มีชื่อว่า “ขีดจำกัด”- เนื้อหาขาออก: ค่าเริ่มต้น 1 MB (ตั้งค่าได้ต่อปลั๊กอิน) เนื้อหาขาเข้าสู่ RolChat: 5 MB ใหญ่กว่านั้นได้
413 - ปลั๊กอินประกาศ
allowed_source_ipsได้ RolChat จะใช้รายการอนุญาตนั้นก่อนตรวจสอบ - คุณตรวจสอบ user agent
RolChat-Webhook/1.0เพิ่มเติมได้เพื่อความมั่นใจ แต่ไม่ใช่มาตรการความปลอดภัย
เว็บฮุกขาเข้าสู่ RolChat
หัวข้อที่มีชื่อว่า “เว็บฮุกขาเข้าสู่ RolChat”ผู้ให้บริการส่งข้อมูลเข้า RolChat ที่ /api/v1/webhooks/{category}/{adapter} ด้วยรูปแบบลายมือชื่อของตัวเอง (Twilio, Telnyx, Bandwidth, Meta สำหรับ WhatsApp, Stripe) อะแดปเตอร์แต่ละตัวตรวจสอบลายมือชื่อของผู้ให้บริการ ปรับเพย์โหลดให้เป็นมาตรฐาน และเผยแพร่ซ้ำบนบัสเหตุการณ์ภายในพร้อมลายมือชื่อของ RolChat ระบบของคุณเองส่งข้อมูลเข้า RolChat ได้ด้วยเฮดเดอร์ X-RolChat-* เดียวกันข้างต้น ลงลายมือชื่อด้วยซีเคร็ตของปลั๊กอินที่เป็นเจ้าของเอนด์พอยต์
เว็บฮุกของระบบอัตโนมัติ
หัวข้อที่มีชื่อว่า “เว็บฮุกของระบบอัตโนมัติ”การดำเนินการ ส่งคำขอ HTTP ของโมดูลระบบอัตโนมัติมีกฎการส่งของตัวเอง:
- หนึ่งความลับต่อบัญชี ดูหรือหมุนเวียนได้ที่หน้าระบบอัตโนมัติ (เจ้าของและผู้ดูแลระบบ) การหมุนเวียนมีผลทันที: ไม่มีช่วงซ้อนทับ ความลับเก่าจะตรวจสอบไม่ผ่านทันที จึงควรอัปเดตตัวรับของคุณก่อน หรือยอมรับช่วงขาดหายสั้นๆ
- เวลารอ: RolChat รอการตอบกลับ 10 วินาที
- การลองใหม่: รวมสูงสุด 6 ครั้ง ช่วงพักก่อนครั้งที่ 2 คือ 30 วินาที จากนั้นประมาณ 2 นาที 8 นาที 32 นาที และ 2 ชั่วโมง 8 นาที แต่ละครั้งเปลี่ยนแปลงได้ไม่เกิน 20 % ช่วงพักครั้งเดียวไม่เกิน 6 ชั่วโมง
- สิ่งที่ลองใหม่: ข้อผิดพลาดของเครือข่าย การหมดเวลา
5xx408425และ429คำตอบ4xxอื่น ที่อยู่ที่ถูกบล็อก หรือเนื้อหาที่ใหญ่เกินไปจะไม่ลองใหม่: การส่งนั้นเข้าคิวข้อความที่ส่งไม่สำเร็จ (dead-letter) ทันที เช่นเดียวกับหลังความพยายามครั้งสุดท้ายที่ล้มเหลว - เฮดเดอร์:
X-RolChat-SignatureX-RolChat-Signature-V2X-RolChat-TimestampX-RolChat-Delivery-IdX-RolChat-Attempt
ทดสอบตัวรับของคุณ
หัวข้อที่มีชื่อว่า “ทดสอบตัวรับของคุณ”POST /api/v1/webhooks/test-signature ส่งเหตุการณ์จำลองที่ลงลายมือชื่อไปยังเอนด์พอยต์ของปลั๊กอินที่เรียก เพื่อให้คุณตรวจสอบการทำงานตั้งแต่ต้นจนจบก่อนที่ทราฟฟิกจริงจะเข้ามา
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ตรวจสอบกับ JSON ที่แยกวิเคราะห์และเข้ารหัสใหม่ แทนไบต์ดิบ
- ใช้
==เปรียบเทียบลายมือชื่อ - ลบรายการซ้ำตาม nonce (ทุกการลองใหม่มี nonce ใหม่) แทนการใช้ ID เหตุการณ์
- นาฬิกาคลาดเคลื่อนเกินห้านาที
- ทำงานที่ช้าก่อนตอบกลับ แล้วหมดเวลาที่ 15 วินาทีและได้รับเหตุการณ์เดิมอีกครั้ง