iT邦幫忙

1

Line Messaging API 串接筆記- access token

  • 分享至 

  • xImage
  •  

前言

目標:掌握 Line Messaging API,客製自動回覆功能,這次串接是參考 Line Messaging API 串接手冊
前一篇 已經建立好 Channel,這一篇要來取得打 api 時需要的 access token

串接 Line Messaging API 需要 access token,Line 有提供幾種不同的 access token,這次參考這篇 Channel access tokens


Access tokens

手冊裡面有解釋了甚麼是 access token,大概解釋一下,access token 就類似你在登入時要輸入帳號密碼一樣,是一個辨認身分的憑證,只是如果像是使用 API 的時候,每次都要輸入帳號密碼就會有點麻煩,所以透 access token 來作為憑證。

Line Messaging API 則是透過 channel access tokens 來作為使用 Channel (一個 Channel 就是一個官方帳號)的憑證。

Channel access tokens 種類

Line 總共有三種不同有效時間的 Channel access tokens :


產生 channel access tokens v2.1

如果要產生 channel access tokens v2.1 總共需要三個步驟

  1. Create an Assertion Signing Key

    • Assertion Signing Key specification
      手冊有三種範例,我參考的是 Generate using browser ,參考手冊給的範例就可用瀏覽器產生,檢視 console 就會有一組 private key 、public key(記得要保留,後面會用到)

    • Register public key and get kid
      到 channel >basic setting >Assertion Signing Key 旁邊有一個 register a public key 按鈕,按下去後要輸入剛剛在上一步產生的 public key,輸入後就會獲得一個 kid

  2. Generate a JWT
    JWT 的產生可以參考手冊使用 JWT library

    JWT decode header,照範例寫後貼到 header

    {
      "alg": "RS256", // 固定
      "typ": "JWT", // 固定
      "kid": "你在 Assertion Signing Key 那一步產生的 kid" // 上一步產生的 kid
    }
    

    JWT Payload,照範例也後貼到 payload (以下是 Line 的範例)

    {
      "iss": "1234567890", // 你的 channel id
      "sub": "1234567890", // 你的 channel id
      "aud": "https://api.line.me/", // 固定
      "exp": 1559702522, // JWT 的有效時間 (時間戳) 最多 30 min 
      "token_exp": 86400 // channel access token 的有效時間(秒) 最多 30 天
    }
    

    ps. exp、token_exp 都不能超過最大值,超過的話後面要產出 channel access token 就會失效

  3. 產出 channel access tokens v2.1
    打 API POST https://api.line.me/oauth2/v2.1/token
    以 PHP 為範例

    $payload = [
        'grant_type' => 'client_credentials', // 固定
        'client_assertion_type' => 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer', // 固定
        'client_assertion' => '上一步產生的 JWT'
    ];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/oauth2/v2.1/token');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/x-www-form-urlencoded',
    ]);
    $Result = curl_exec($ch);
    curl_close($ch);
    
    echo $Result;
    ?>
    

    成功後就會收到 response(以下是 Line 的範例)

    {
        "access_token": "eyJhbGciOiJIUz.....", // 你的 Channel access token
        "token_type": "Bearer", 
        "expires_in": 2592000, // Channel access token 的有效時間
        "key_id": "sDTOzw5wIfxxxxPEzcmeQA" // 你的 key id
    }
    

    手冊有寫可以把 Channel access token 跟 key id 存在一起


產生 Short-lived channel access token

打 API https://api.line.me/v2/oauth/accessToken 來產生有效時間 30 天的 access token
以 PHP 為範例

$payload = [
    'grant_type' => 'client_credentials',
    'client_id' => '你的 channel id',
    'client_secret' => '你的 channel secret'
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/oauth/accessToken');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
]);
$Result = curl_exec($ch);
curl_close($ch);

echo $Result;

成功後就會收到 response(以下是 Line 的範例)

{
"access_token":"W1TeHCgfH2Liwa.....",
"expires_in":2592000, // 有效時間 30 天
"token_type":"Bearer"
}

Long-lived channel access token

這個方法非常簡單,只需要到 channel > Messaging API > 滑到最下面會看到 Channel access token (long-lived),按下 Issue 的按鈕就會有了


小小心得

因為 Line 好像還有其他種 API ,每種 API 適用的憑證可能不同,手冊最推薦使用的是第一種 channel access tokens v2.1,畢竟是三種方式裡面安全性最高的(但也是最麻煩的),可以視自己的需求選擇適合的憑證方式,如果是測試玩玩看的話其實用第三種 Long-lived channel access token 就可以了。


參考資料


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言