+24

Webhook là gì? Một bài viết về webhook

Webhook là gì?

Webhook Publisher gửi dữ liệu theo thời gian thực đến Webhook Receiver của client khi có sự kiện xảy ra trên topic mà client đăng ký từ trước, đó là webhook

Các thành phần trong webhook

  • Webhook Publisher: là "nguồn", có nhiệm vụ gửi dữ liệu tới "đích" khi có sự kiện xảy ra
  • Webhook Receiver: là client hay còn gọi là "đích", có nhiệm vụ nhận dữ liệu của "nguồn" gửi tới
  • Topic là các sự kiện xảy ra ở "nguồn", ví dụ như order created, product deleted,...
  • Endpoint: là URL mà client cung cấp để "nguồn" gửi thông tin đến
  • Authentication: kỹ thuật xác thực data gửi từ "nguồn" đến "đích"

Cơ chế hoạt động của webhook

Mình sẽ triển khai ứng dụng đơn giản để các bạn hiểu rõ cơ chế hoạt động của webhook

Bạn phát triển một nền tảng có tên là Shopify - nền tảng này cho phép tạo các website ecommerce online

Hệ thống Shopify có các đối tượng sau: Merchant A (chủ store - người tạo website trên shopify) và Customer (khách hàng mua hàng trên website của merchant A)

Hmm, Merchant A tạo store trên shopify rồi customer đặt hàng trên đó thì liên quan gì đến webhook nhỉ? Thật ra là có đó các bạn. Một nền tảng như Shopify chỉ xây dựng những tính năng phổ biến mà một nền tảng ecommerce cần có, shopify không thể cover những tính năng đặc biệt mà các Merchant mong muốn, chẳng hạn Merchant A mong muốn tính năng ABC và Merchant B mong muốn tính năng XYZ. Lúc này hệ thống Shopify của bạn tạo ra một tính năng là webhook, webhook cho phép các Merchant đăng ký nhận data từ Shopify về hệ thống của họ khi có các sự kiện xảy ra trên Shopify

Giả sử Merchant A muốn tận dụng các tính năng có sẵn của Shopify như tạo website bán hàng, tạo sản phẩm, add to cart, đặt hàng,... và sau đó Merchant A kết hợp với hệ thống riêng của họ để tối ưu quy trình xử lý order sau khi khách đặt hàng. Cơ chế hoạt động sẽ như sau:

Đầu tiên, Merchant A đăng ký webhook bao gồm topic và endpoint (topic có thể là product-created, product-updated, order-created, order-updated, order-canceled,...) :

  • Webhook API: http://my-shopify.com/webhook
  • Body:
{
  "topic": "order-created",
  "endpoint": "http://my-merchant-a.com/webhook-receiver/order"
}
  • Webhook Publisher của Shopify nhận thông tin topic và endpoint của merchant A đăng ký và lưu trữ:
const webhook = {};

// register webhook api
app.post('/webhook', (req, res) => {
  const { topic, endpoint } = req.body;

  if (!webhook[topic]) {
    webhook[topic] = null;
  }

  webhook[topic] = endpoint;

  res.status(200).send(`Client subscribed to topic ${topic}`);
});

Customer truy cập vào website của Merchant A và đặt hàng, đơn hàng gửi tới Shopify API:

  • Order API: http://my-shopify.com/order
  • Body:
{
    "name": "ORDER_001",
    "quantity": 1,
    "price": 100
}
  • Order API của Shopify nhận order từ customer và gửi data theo thời gian thực đến endpoint của Merchant A:
const createOrder = async (order) => {
    return order;
}

 // create order api
app.post('/order', async (req, res) => {
  // save order to database
  const createdOrder = await createOrder(req.body)
  
  // find endpoint of topic marchant A to send data
  const topic = 'order-created';
  const endpoint = webhook[topic];
  await axios.post(endpoint, createdOrder);
  
  res.status(200).send('Create order successfull');
});

Webhook Receiver của merchant A, nhận order data từ shopify và xử lý logic tùy ý:

// receive order from shopify
app.post('/webhook-receiver/order', (req, res) => {
  const orderFromShopify = req.body;
  console.log(orderFromShopify);
  
  res.status(200).send('Order received!');
});

Authentication trong webhook

Nếu có ai đó biết được endpoint của client và gửi hàng loạt fake data đến endpoint của client thì sao?

Nếu có hacker nào đó truy cập và đọc trái phép data của client trong quá trình gửi data từ Webhook Publisher tới Webhook Receiver thì sao?

=> Chúng ta cần authentication webhook và đây là 2 cách có thể áp dụng vào hệ thống:

  • Một, client sẽ tạo một token đi kèm khi đăng ký webhook, lúc hook data về client thì Webhook Publisher gửi kèm token ở header hoặc body để client verify (cách này chủ yếu verify để không phải nhận fake data từ một kẻ phá nào đó)
  • Hai, Webhook Publisher trước khi gửi data tới Webhook Receiver thì Webhook Publisher cần làm một việc trước đó là mã hóa data bằng một token, tất nhiên trước đó Webhook Publisher đã cung cấp token cho client rồi. Khi nhận data từ Webhook Publisher, client đảm bảo server của họ không tự transform request (các web server như expressjs thường sẽ tự transform request nên khi verify data theo token thì sẽ không được) bằng cách thêm option vào web server của họ là raw body, từ raw body và token, client sẽ parse được thành real data (cách này vừa kiểm tra được request đó có fake data không và vừa chặn hacker đọc data trái phép)

Bạn có thể đã biết

  1. Bạn cần phân biệt bạn là người tạo ra webhook publisher để các client đăng ký nhận data hay là bạn là client, người sẽ đăng ký nhận data từ webhook publisher của các bên thứ 3
  2. Webhook Receiver nếu phản hồi về status khác 200 thì Webhook Publisher sẽ thử lại vài lần nữa chứ không chỉ gửi data một lần duy nhất
  3. Webhook Receiver sử dụng POST thay cho GET method

Kết bài

Cảm ơn các bạn đã đọc


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.