目標:掌握 Line Messaging API,客製自動回覆功能,這次串接是參考 Line Messaging API 串接手冊
前一篇 已經建立好 Channel,這一篇要來取得打 api 時需要的 access token
串接 Line Messaging API 需要 access token,Line 有提供幾種不同的 access token,這次參考這篇 Channel access tokens
手冊裡面有解釋了甚麼是 access token,大概解釋一下,access token 就類似你在登入時要輸入帳號密碼一樣,是一個辨認身分的憑證,只是如果像是使用 API 的時候,每次都要輸入帳號密碼就會有點麻煩,所以透 access token 來作為憑證。
Line Messaging API 則是透過 channel access tokens 來作為使用 Channel (一個 Channel 就是一個官方帳號)的憑證。
Line 總共有三種不同有效時間的 Channel access tokens :
Channel access token with a user-specified expiration (Channel access token v2.1)
可以指定有效時間(最多 30 天),使用 JSON Web Token (JWT)
Short-lived channel access token
有效時間 30 天
Long-lived channel access token
沒有有效時間,可以隨時重新產生(只適用於Messaging API channels)
如果要產生 channel access tokens v2.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
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 就會失效
產出 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 存在一起
打 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"
}
這個方法非常簡單,只需要到 channel > Messaging API > 滑到最下面會看到 Channel access token (long-lived),按下 Issue 的按鈕就會有了
因為 Line 好像還有其他種 API ,每種 API 適用的憑證可能不同,手冊最推薦使用的是第一種 channel access tokens v2.1,畢竟是三種方式裡面安全性最高的(但也是最麻煩的),可以視自己的需求選擇適合的憑證方式,如果是測試玩玩看的話其實用第三種 Long-lived channel access token 就可以了。
參考資料