Webhook + xác thực chữ ký HMAC
POST + GET · /api/practice/level5/webhooks/subscribe · Chuyên sâu
Mô tả bài tập
POST /webhooks/subscribe để đăng ký. Không cần truyền 'url' - nếu bỏ trống, hệ thống tự tạo một 'hộp thư' (inbox) giả lập ngay trong project này để đóng vai trò 'server của bạn', khỏi cần webhook.site hay công cụ ngoài nào. Sau khoảng 3 giây, hệ thống sẽ POST một sự kiện mẫu tới inbox đó kèm header X-Webhook-Signature (HMAC-SHA256 của body, ký bằng secret trả về lúc subscribe). Gọi GET /webhooks/inbox/:subscriptionId để xem sự kiện đã nhận và kết quả xác thực chữ ký (trường verified). Nếu muốn thử với endpoint thật bên ngoài, vẫn có thể truyền { url } trỏ tới webhook.site như bình thường.
Mục tiêu học được
- Hiểu tại sao webhook cần cơ chế xác thực chữ ký (ai cũng có thể POST giả tới URL của bạn)
- Biết cách hệ thống tính lại HMAC-SHA256 từ body để so sánh với header nhận được
- Làm quen với việc test API có tính 'callback' (server gọi ngược lại client) mà không cần rời khỏi trang
Lệnh curl
# 1. Đăng ký - không cần truyền url, hệ thống tự tạo hộp thư giả lập
curl -i -X POST "http://testing-api.systemhub.uk/api/practice/level5/webhooks/subscribe" \
-H "X-Practice-Token: YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'
# 2. Đợi ~3 giây rồi xem hộp thư đã nhận được gì (thay <subscriptionId> bằng id ở bước 1)
curl -i "http://testing-api.systemhub.uk/api/practice/level5/webhooks/inbox/<subscriptionId>" \
-H "X-Practice-Token: YOUR_TOKEN"
Các bước làm trên Postman
- POST http://testing-api.systemhub.uk/api/practice/level5/webhooks/subscribe với body {} (rỗng), ghi nhớ subscriptionId và secret trả về
- Đợi khoảng 3 giây để hệ thống tự gửi sự kiện mẫu tới hộp thư giả lập
- GET http://testing-api.systemhub.uk/api/practice/level5/webhooks/inbox/<subscriptionId>, kiểm tra items có 1 sự kiện với verified=true
- (Nâng cao) Muốn thử với endpoint thật bên ngoài: lấy 1 URL ở webhook.site rồi truyền { "url": "..." } ở bước 1 thay vì để trống
Đăng nhập để lệnh curl ở trên tự động điền sẵn Practice Token thật của bạn.
🧪 Thử nghiệm trực tiếp
Gọi API ngay tại đây. Nếu bạn đã đăng nhập, tiến độ sẽ được ghi nhận tự động khi gọi đúng như kỳ vọng của bài.
Kết quả
Status: