原本是使用確認 header 中的 user-agent 是不是有包含 GitHub 而已,但這樣很容易就會被攻擊了。
因此就要來設定個驗證,才不會到時輕易的就被攻擊。
GitHub 在設定 Webhook 的頁面有提供輸入 secret 的地方,在那邊輸入一個你的 secret key
在往後收到 Webhook 的時候,在 header 中就會有 X-Hub-Signature 這個欄位,這個的參數會是 sha1=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 這樣的。
根據
官方文件,這個 HMAC-SHA1 是把 secret 和 body 做 HMAC 的雜湊運算,計算出 SHA1。
圖中 10~23 行的部分就是 Webhook 進來之後處理的地方,我先確認 user-agent 中是不是有 GitHub,如果是的話就進行驗證。
這邊用到了
crypto 的 package,這個 node 內已經有了,直接 require 就好。
13 行部份就是建立一個 HMAC,設定演算為 SHA1,key 是 "SECRETTOKEN",然後把 ctx.request.rawBody 進行演算,輸出 16 進位的 SHA1。
如果算出來的 SHA1 和 x-hub-signature 內的相同,代表的確是來自 GitHub 的訊息,內容也沒有被竄改過。
昨天的發現,我個人 secret 是去線上密碼產生器產了一個 32 位數的大小寫英數字混和字串,紀錄一下順便給不知道的人看。