本篇要解決的問題
前陣子公司提了一個案子,想用 LINE 的 Messaging API 來玩互動遊戲,就回頭再看了一下文件,後來發現文件中新加了一段驗證的部份:Signature validation。
但文件中給的範例程式碼比較精簡,August 研究了一下後,整理出了使用的完整程式碼,給想用 Node.js 開發 LINE Bot 的各位高手們參考。
實際上目前 August 開發的機器人已經在今年四月時就加上了驗證的部份,執行起來沒遇到任何報錯,看來是確實可行的。(點擊加入 生活小幫手機器人,但因為 [email protected] 要收錢,所以推薦改加入 Telegram 的機器人 XD~)
之所以 LINE Messaging API 會增加簽名來驗證,主要是讓開發者先確認這個 POST 是由 LINE 的平台發出的。
畢竟用 Webhooks 的方式,如果有高手發現了 URL,就可以直接發 POST 而不是透過 LINE 的 APP 使用。
官方範例程式碼
以下是 官方文件 中給的範例:
const crypto = require('crypto'); const channelSecret = '...'; // Channel secret string const body = '...'; // Request body string const signature = crypto .createHmac('SHA256', channelSecret) .update(body).digest('base64'); // Compare X-Line-Signature request header and the signature
當初看了「Compare X-Line-Signature request header and the signature」這句註解看了好久,一直想說怎麼不再給完整一點的,還得看文件的人自己想?
後來爬了一下文,才知道對 Node.js 高手來說,這句話很好理解,就是取得 Request Header 中的 X-Line-Signature 來比對 signature 這個值就行,二者相同就代表確認是透過 LINE 發來的。
取得 Request Header 的 X-Line-Signature 就一行:
const headerX = request.get('X-Line-Signature'); // 比對 signature, headers ,二者相等時才代表是由 LINE server 發來的訊息 if(signature === headerX) {}
使用 X-Line-Signature 的完整程式碼
這段的程式碼是 August 自行研究出來的,如果有高手覺得寫的太廢歡迎留言提供~
LINE config 中需要的 channelAccessToken、channelSecret 要自行從後台中取得,如果以前從未取得過,可以參考這篇:用 Google Apps Script,建立簡易網站監測機器人。
比對簽名成功後,August 也整理出了比較常用到的幾個事件,包含加入好友、被封鎖、收到訊息、收到 postback,把收到這些事件後要做的事情寫在各個 function 中就行。
以上就是這次 LINE Messaging API 新加入的 X-Line-Signature 驗證方法。
因為是用在 Node.js 上,寫完後要放到主機中,August 是用 GCP,可參考這篇把程式佈署上去:用 Google Cloud Platform(GCP)建 Node.js 網站。

