LINE Corporation 於2023年10月1日成爲 LY Corporation。LY Corporation 的新部落格在這裏。LY Corporation Tech Blog

Blog


Stateless Channel Access Token 超過使用安全級別 LINE Messaging API

Channel Access Token 是驗證訪問 LINE Messaging API 系列 API 的先決條件,例如 Broadcast Messaging、建立 Richmenu 或檢索 Insight 等。Channel Access Token 是 API 的門牌鑰匙

最近,LINE 推出了 Stateless Channel Access Token 或可以另稱 Channel Access Token V3,提高了 Messaging API 的安全性,更好地防止重送攻擊(Replay attack)。當開發者不小心把 Token 弄丟,因為它的壽命只有15分鐘。它易於管理,並可以無限量地使用 Token 。

在本文中,我將介紹每個類別的Channel Access Token ,特別是 Stateless Channel Access Token ,包括 Issue、Revoke 和Verify,以及分析從作者的角度來看,每個 Token 的優缺點,如果準備好了,開始!

1. Long-lived Channel Access Token

由於這種類型的 Channel Access Token 的名稱是 Long-live,它具有一個特殊的功能,可以讓它被用很久(100 年,請查看第 1.3 節),我相信大多數 LINE 聊天機器人開發人員可能正在使用這種類型的 Token ,因為這種類型的 Token 將在 Messaging API Channel 建立的階段產生,適合所有初學者。

  • 優點:Issue容易維護
  • 缺點:安全性較低,因為駭客可能會將其應用於各種 API,如 long text broadcast

1.1 Issue

只需按Messaging API Channel中的「Issue」 按鈕,即可輕鬆存取此類型的Channel Token 。

按下“Issue”按鈕後,您將獲得一個 Token ,該 Token 可以運行 API。

1.2 Revoke

如果開發人員不確定 Token 是否洩露,則需要透過 Revoke 將 Token 刪除。開發人員可以透過兩種方式重建這種類型的 Token 。

方法 1 在Messaging API Channel
頁面上按「返回」
,它會在取消舊 Token 的同時啟動新 Token ,開發人員可以定義舊 Token 的存留時間從 0 到 24 小時,其中 0 表示 Revoke 立即(將在 5 分鐘內過期)。

方法 2 透過 API
重新調用
此方法是一種即時 Token 調用方法。開發人員必須建立請求才能透過以下 API 進行重新生成。

Endpoint https://api.line.me/v2/oauth/revoke
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
access_token: Channel Access Token

1.3 Verify

如果開發人員希望Verify或確認Channel Access Token 的狀態是無效的還是無效的,可以透過API建立請求來Verify,如下所示。

Endpoint https://api.line.me/v2/oauth/verify
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
access_token: Channel Access Token

如果請求成功,我們將收到 HTTP 狀態代碼 200 以及 JSON 物件,該物件表示 Token 的剩餘時間,例如:

{
"client_id": "1350031035",
"expires_in": 3138007490,
"scope": "P CM"
}

2. Short-lived Channel Access Token

其特點是壽命更短(只有 30 天),1 個Channel最多可以釋放 30 個 Token 。如果 Issue 超過 30 個,則將相應地重新啟動最舊的 Token 。

  • 優點:中等安全,每個 Token 的有效期為 30 天。
  • 缺點:駭客洩露案例最多可應用於30天(如 Message broadcast)等API,這類型的 Token 管理相對麻煩,因為它需要條件來監視 Token 的狀態和儲存。

2.1 Issue

這種類型的Channel Access Token 必須透過 API 完成,開發人員必須建立以下請求。

Endpoint https://api.line.me/v2/oauth/accessToken
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
grant_type: client_credentials
client_id: Channel ID
client_secret: Channel Secret

如果請求成功,我們將在包含Channel Access Token 的 JSON 物件和 Token 的剩餘時間中返回 HTTP 狀態代碼 200,例如:

{
"access_token": "W1TeHCgfH2Liwa.....",
"expires_in": 2592000,
"token_type": "Bearer"
}

2.2 Revoke

如果開發人員不確定或不確定 Token 已洩露,則 Token 將刪除。開發人員可以透過請求 API 重新調用這種類型的 Token ,詳情如下:

Endpoint https://api.line.me/v2/oauth/revoke
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
access_token: Channel Access Token

2.3 Verify

如果開發人員希望Verify或確認Channel Access Token 的狀態是否無效,可以透過API建立請求來Verify,如下所示。

Endpoint https://api.line.me/v2/oauth/verify
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
access_token: Channel Access Token

如果請求成功,我們將收到 HTTP 狀態代碼 200 以及 JSON 物件,該物件指示 Token 的剩餘時間,例如:

{
"client_id": "1350031035",
"expires_in": 3138007490,
"scope": "P CM"
}

3. Channel Access Token v2.1

Channel Access Token ,允許開發人員自定義 Token 的期限為30天,其中1個Channel最多可以釋放30個 Token 。

  • 優點:最大安全性,可根據需要縮短期限,並在 30 分鐘的時間內使用 JWT,而不是每個 Token 的Channel Secret。
  • 缺點:Issue和管理程序相當複雜。

3.1 Issue

這種類型的Channel Access Token 必須透過 API 完成,開發人員必須建立以下請求。

Endpoint https://api.line.me/oauth2/v2.1/token
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
grant_type: client_credentials
client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion: JWT signed with Assertion Signing Key

如果請求成功,我們將在包含Channel Access Token 的 JSON 物件和 Token 的剩餘時間中返回 HTTP 狀態代碼 200,例如:

{
"access_token": "eyJhbGciOiJIUz.....",
"token_type": "Bearer",
"expires_in": 2592000,
"key_id": "sDTOzw5wIfxxxxPEzcmeQA"
}

3.2 Revoke

如果開發人員不確定 Token 是否洩露,則 Token 將刪除。開發人員可以透過請求 API 重新調用這種類型的 Token ,詳情如下:

Endpoint https://api.line.me/oauth2/v2.1/revoke
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Body
access_token: Channel Access Token
client_id: Channel ID
client_secret: Channel Secret

3.3 Verify

如果開發人員希望Verify或確認Channel Access Token 的狀態是無效的還是無效的,可以透過API建立請求來 Verify,如下所示。

Endpoint https://api.line.me/oauth2/v2.1/verify
Method GET
Query param
access_token: Channel Access Token

如果請求成功,我們將收到 HTTP 狀態代碼 200 以及 JSON 物件,該物件指示 Token 的剩餘時間,例如:

{
"client_id": "1573163733",
"expires_in": 2591659,
"scope": "profile chat_message.write"
}

3.4 檢索所有Verify的Channel Access Token

Channel Access Token v2.1 提供了另一個額外的 API,即我們可以檢索所有Verify Token ,建立以下請求。

Endpoint https://api.line.me/oauth2/v2.1/tokens/kid
Method POST
Headers
Content-type: application/x-www-form-urlencoded
Query Params
client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion: JWT signed with Assertion Signing Key

如果請求成功,我們將使用包含Verify Token 的 JSON 物件返回 HTTP 狀態碼 200,例如:

{
"kids": [
"U_gdnFYKTWRxxxxDVZexGg",
"sDTOzw5wIfWxxxxzcmeQA",
"G82YP96jhHwyKSxxxx7IFA"
]
}

4. Stateless Channel Access Token

Channel Access Token 是最近一種短壽命(僅 15 分鐘),其中 1 個Channel可以無限次地使用 Token 。

  • 優點:高度安全,每個 Token 只有 15 分鐘的使用壽命,可減少在 Token 丟失時重送攻擊的問題,並且無需儲存過程,因為我們可以無限次地離開。
  • 缺點:經常需要一個Issue,所以可能有延遲。

4.1 Issue

這種類型的Channel Access Token 必須透過 API 完成,開發人員必須建立以下請求。

Endpoint https://api.line.me/oauth2/v3/token
Method POST
Headers
Content-type: application/x-www-form-urlencoded

// The request body to be sent can be selected in 2 ways.
// 1. From Channel ID and Channel Secret (Basic)
Body
grant_type: client_credentials
client_id: Channel ID
client_secret: Channel Secret

// 2. จาก JWT Assertion (แบบขั้นสูง)
Body
grant_type: client_credentials
client_assertion_type: URL-encoded ของ urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion: JWT ที่ generate จากฝั่ง client และ sign ด้วย private key

如果請求成功,無論使用哪種請求主體提交方式,我們都會收到 HTTP 狀態代碼 200 以及包含Channel Access Token 的 JSON 物件以及 Token 的剩餘持續時間,例如:

{
"access_token": "W1TeHCgfH2Liwa.....",
"expires_in": 900,
"token_type": "Bearer"
}

4.2 重新驗證和Verify

由於Stateless Channel Access Token是一種生命週期較短的Token,只有15分鐘,因此可以無限發行。 並且不需要儲存。因此,它是相當安全的,不需要額外註銷。

摘要

透過以上內容大家已經了解了四種類型的 Channel Access Token。 我想總結一下每種類型中可以擁有的有效 Token 的時限和數量的差異。 列在表格中以便於理解如下:

本文的主要內容是將Channel Access Token 與消息 API 一起使用,但實際上,Stateless Channel Access Token Short-lived Channel Access Token 也可以應用於 LIFF 的 Server API  LINE MINI 應用程式的服務資訊

希望本文將幫助開發人員選擇正確的 Channel Access Token ,以滿足每個人在安全和管理方面的使用案例的需求。下次再見。