Bạn đưa The An một địa chỉ https:// công khai. Khi có thay đổi thuộc tổ chức bạn, hệ thống gửi:
POST <địa chỉ của bạn>
Content-Type: application/json
X-Tash-Event: <loại thông báo>
X-Tash-Delivery: <mã lượt gửi>
X-Tash-Timestamp: <giây Unix>
X-Tash-Signature: v1=<hex>
{ "id": "<mã lượt gửi>", "loai": "<loại thông báo>", "luc": "<thời điểm ISO 8601>", ... }
Máy chủ của bạn làm bốn việc:
- Tính
HMAC-SHA256(khoá kiểm thông báo, "<X-Tash-Timestamp>.<thân thô>") dạng hex, so với phần sau v1=. Không khớp thì bỏ. Tính trên thân thô nhận được, không tính trên JSON đã đọc rồi ghi lại. - Bỏ thư có
X-Tash-Timestamp lệch quá 5 phút so với giờ của bạn. - Đã thấy
X-Tash-Delivery này rồi thì trả 2xx và không xử lý lại. - Trả 2xx trong 10 giây. Việc nặng thì xếp hàng làm sau.
import { createHmac, timingSafeEqual } from 'node:crypto'
function chuKyDung(thanTho, headers, khoa) {
const giay = headers['x-tash-timestamp']
if (Math.abs(Date.now() / 1000 - Number(giay)) > 300) return false
const mong = createHmac('sha256', khoa).update(`${giay}.${thanTho}`).digest('hex')
const nhan = String(headers['x-tash-signature'] ?? '').replace(/^v1=/, '')
return mong.length === nhan.length && timingSafeEqual(Buffer.from(mong), Buffer.from(nhan))
}
Không nhận được 2xx thì hệ thống thử lại nhiều lần, giãn dần trong khoảng hai ngày, rồi dừng. Thư có thể đến trễ hoặc sai thứ tự: lấy luc làm mốc, và gọi API khi cần trạng thái chắc chắn. Thư không mang thông tin cá nhân của khách. Thư thử có "loai": "thu".