- vừa được xem lúc

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

0 0 7

Người đăng: Thang TD

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 376

- vừa được xem lúc

Hướng dẫn làm bot Facebook messenger cho tài khoản cá nhân

Giới thiệu. Trong bài viết trước thì mình có hướng dẫn các bạn làm chatbot facebook messenger cho fanpage. Hôm nay mình sẽ hướng dẫn các bạn tạo chatbot cho một tài khoản facebook cá nhân. Chuẩn bị.

0 0 151

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 2

trong phần 1 mình đã giới thiệu về puppeteer và tạo được 1 project cùng một số file đầu tiên để các bạn có thể crawl dữ liệu từ một trang web bất kỳ. Bài này mình sẽ tiếp nối bài viết trước để hoàn thiện seri này.

0 0 58

- vừa được xem lúc

Điều React luôn giữ kín trong tim

■ Mở đầu. Ngồi viết bài khi đang nghĩ vu vơ chuyện con gà hay quả trứng có trước, mình phân vân chưa biết sẽ chọn chủ đề gì để chúng ta có thể cùng nhau bàn luận.

0 0 42

- vừa được xem lúc

Gửi Mail với Nodejs và AWS SES

AWS SES. AWS SES là gì.

0 0 71

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 1

Bài viết này mình sẽ giới thiệu cho các bạn craw dữ liệu của web site sử dụng nodejs và Puppeteer. .

0 0 149