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