Giải phápKhách hàng
Tài liệu

29/9/2026

Tóm tắt

blog.share_blog

API reference @cogover/sdk: Inbound webhook

Trang này thuộc API reference của @cogover/sdk.

Inbound webhook

Quản trị viên có thể tạo inbound access cho project để một hệ thống bên ngoài gọi route mà không cần phiên người dùng Cogover. Hệ thống bên ngoài nhận URL có dạng

https://{WORKSPACE_DOMAIN}/api/v1/ts-projects/{projectSlug}/hooks/{inboundId}/{route}

và xác thực mỗi lời gọi bằng inbound key hoặc chữ ký HMAC đã cấu hình cho inbound access. Cogover kiểm tra key hoặc chữ ký, áp dụng rate limit và từ chối lời gọi trước khi bất kỳ code nào của project chạy. Route handler thấy lời gọi như vậy với request.path === "/hooks/{route}": đăng ký route webhook dưới /hooks/, và inbound ID không nằm trong path.

import { createRouter } from "@cogover/sdk";
 
const router = createRouter();
router.post("/hooks/payments", async ({ request, invocation, crypto, jobs, response }) => {
  if (invocation.identity !== "inbound") return response.empty({ status: 403 });
 
  // Tuỳ chọn: kiểm tra chữ ký riêng của hệ thống bên ngoài trên raw body.
  const expected = await crypto.hmacSha256({ secret: "payment_signing_secret" }, request.rawBody ?? "");
  if (!crypto.timingSafeEqual(expected, request.headers["x-payment-signature"] ?? "")) {
    return response.empty({ status: 401 });
  }
 
  const event = request.body as { id: string; orderId: string };
  await jobs.enqueue("sync_payment", event, { idempotencyKey: `payment:${event.id}` });
  return response.json({ received: true }, { status: 202 });
});
export default router.toHandler();
  • Danh tính. invocation.identity là "inbound", invocation.user là null và invocation.inbound chứa id, name và mode xác thực của inbound access. data.object() thực hiện dưới danh tính system và chỉ hoạt động nếu identity policy đã duyệt của project đặt allowInternalSystem: true; khi đó nó có cùng quyền truy cập như trong job chạy theo lịch, không bị thu hẹp bởi các object được cấp cho data.asSystem(). Nếu không, các lời gọi của nó ném PermissionDeniedError có details.reason là "IDENTITY_NOT_GRANTED". data.asUser() và data.asSystem() chỉ tuân theo quyền được cấp trong identity policy khi allowInternalSystem là true; nếu không, chúng cũng bị từ chối như vậy, kể cả với object đã được cấp.
  • Body. Request body giới hạn 256 KiB. Khi body là JSON object, nó là request.body; body dạng form, text hoặc dạng khác để request.body rỗng ({}). request.rawBody luôn chứa body đúng như đã nhận, dưới dạng chuỗi UTF-8, và request.contentType là Content-Type của request, nên handler có thể kiểm tra chữ ký hoặc tự parse định dạng khác.
  • Response. Giá trị trả về của handler và các helper response hoạt động như với mọi route. Giữ handler ngắn: xác nhận sự kiện rồi enqueue một job cho việc thực sự, để hệ thống bên ngoài nhận trả lời nhanh và các lần retry không chồng lên xử lý chậm.
  • Retry. Hệ thống bên ngoài thường gửi lại webhook không nhận được response 2xx, nên handler có thể thấy cùng một sự kiện nhiều lần. Dùng định danh riêng của sự kiện làm idempotencyKey cho job được enqueue, hoặc làm key trong state. Header Idempotency-Key hoạt động như với mọi route. Khi inbound access kiểm tra chữ ký HMAC có timestamp, mỗi chữ ký chỉ được chấp nhận một lần, trước khi handler chạy: lần retry lặp lại cùng chữ ký bị từ chối với HTTP 401, kể cả khi lần đầu thất bại, nên bên gửi phải ký lại cho mỗi lần retry.
avatar

blog.blogs_related

Giải pháp tùy biến và hợp nhất

Số hóa và tự động hóa hoàn toàn công tác vận hành và quản trị doanh nghiệp với Cogover!

Bắt đầu đổi mới phương thức vận hành và tự chủ hệ thống quản trị công việc của bạn

Dùng thử ngay
CogoverCogover

CÔNG TY CỔ PHẦN STRINGEE

GPKD số 0107938504, đăng ký ngày 27-07-2017, nơi cấp Sở Tài chính Thành phố Hà Nội
Địa chỉ: Tầng 19, Leadvisors Tower, số 643 Phạm Văn Đồng, Phường Nghĩa Đô, Thành phố Hà Nội, Việt Nam

Văn phòng

Hà Nội: Tầng 17, VP2, tòa Sun Square, 21 Lê Đức Thọ, phường Từ Liêm, TP Hà Nội
TP Hồ Chí Minh: Tòa nhà Lô A, Khu chung cư Tân Phước, 153 Lý Thường Kiệt, phường Minh Phụng, TP Hồ Chí Minh
Mỹ: 838 Walker Road, Suite 21-2 Dover, Delaware 19904, United States
Ấn Độ: 804/805, Kosha Kommercial Komplex, Primal Nagar, Malad East, Mumbai - 400097
Dubai: CWS-1V-792740, Amber Gem Tower, Ajman, United Arab Emirates
Đã xác nhận
© 2026 Cogover LLC