LINE Bot:X-Line-Signature 簽名驗證 範例

LINE Bot:X-Line-Signature 簽名驗證 範例
LINE Bot:X-Line-Signature 簽名驗證 範例

本篇要解決的問題

前陣子公司提了一個案子,想用 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 網站

Summary
LINE Bot:X-Line-Signature 簽名驗證 範例
Article Name
LINE Bot:X-Line-Signature 簽名驗證 範例
Description
本篇大綱:本篇要解決的問題。官方範例程式碼。使用 X-Line-Signature 的完整程式碼。文件中新加了一段驗證的部份:Signature validation。目前 Augustus 開發的機器人已經在今年四月時就加上了驗證,執行起來沒遇到任何報錯,看來是確實可行的。
Augustus
Let's Write
Let's Write
https://letswrite.tw/wp-content/uploads/2020/08/logo_512.jpg
訂閱
通知
guest

0 Comments
Inline Feedbacks
看所有留言