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
- 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
- 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
- Webhook Receiver sử dụng POST thay cho GET method
Kết bài
Cảm ơn các bạn đã đọc