14

LINE Notify / LINE Login 實作小問題整理

 1 year ago
source link: https://blog.darkthread.net/blog/linenotify-linelogin-tips/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

LINE Login 實作小問題整理-黑暗執行緒

最近在評估網站故障的自動通報機制。LINE 在台灣普及率及依賴度都很高,是很適合的即時通知管道,由於只需單向傳送訊息,LINE Notify 免費且無人數上限,實作又比 LINE Bot 單純。去吧,LINE Notify 就決定是你了。

David 老師有篇詳細的教學文,文章用 Postman 示範 API 溝通細節,不難用 WebClient 改寫,即可簡單搞定線上訂閱介面。

流程如下:

  • 針對不同使用者產生專屬URL,例如: httqs://notify-bot.line.me/oauth/authorize?response_type=code&client_id=….&redirect_uri=callback網址&scope=notify&state=使用者身分識別字串
  • 使用者會被導到 LINE App(手機/平板)或是 LINE 登入網頁,同意授權後會被導回指定的 Callback 網址(必須與 LINE 開發設定填寫網址一致)
  • Callback 網址程式收到 code 及 state,以 code 為參數呼叫 httqs://notify-bot.line.me/oauth/token 可取得 access_token,再依 state 判斷使用者身分,將使用者資料及對應 access_token 寫入資料庫,方便日後管理與應用。
  • 要發訊息給指定使用者,由資料庫查詢其 access_token,呼叫 httqs://notify-bot.line.me/api/notify 以發送通知。
3934-616b-o.gif

順道也測試了 LINE Login,以下整理過程踩過的小坑及眉角:

  • Callback URL 若非 localhost,需使用 https。
  • Callback URL 設定介面說設定會立即生效,實務上要等一兩分鐘較保險,勿心急狂試,還沒生效測不通一直亂改。(對,就是我,性急直逼王藍田)
  • LINE 登入網頁出現 An error has occurred. Please wait a moment and try again. 可能是 client_id 錯誤或失效。
  • 瀏覽器導向 LINE 登入網頁時,在手機平板可以選擇導向「LINE 自動登入」程式或導向登入網頁(如下圖所示)。
    3935-c7cd-o.png
    若是在 LINE App 開啟網頁被導到 LINE 登入程序,將自動進入同意畫面。
    感謝網友 Kuan 補充:手機平板瀏覽器導向 LINE自動登入 功能視瀏覽器而定,Chrome 可以,但像 Asus 內建瀏覽器或 iOS Safari 就出現過不支援的狀況。
  • 設定不正確時,登入網頁會出現「無法登入,請稍候再試。」這種模糊訊息,此時可從 URL 找到類似 errorMessage=AUTH_INVALID_REDIRECT_URL&errorCode=400 之類的詳細訊息。
  • 設定不正確時,若導向 LINE 程式會出現「錯誤 無法正確執行」訊息。
  • LINE Login 取得 Access Token 後可取得使用者姓名、照片;LINE Notify 取得 Access Token 後無從識別使用者身份,實務上要由 state 帶入使用者身分以便建立對應。
  • 當 LINE Channl 處於 DEVELOPING 狀態時(未轉為 PUBLISHED),LINE Login 只接受 CHANNEL_EDITOR 及 DEVELOPER 角色成員登入[參考],其餘人員使用登入網頁沒有任何錯誤訊息顯示,只會一直重覆登入網頁(由 URL 偷看訊息為 AUTHENTICATION_FAIL);LINE App 則出現「錯誤 無法正確執行」。
  • Channel 管理介面可將其他測試人員設定成 DEVELOPER。記得 Email 跟 LINE ID 要正確填寫,對方需收 Mail 點連結確認成員關係,完成後,該使用者即可在 DEVELOPING 階段通過 LINE Login 認證。
3936-dbe2-o.gif

and has 44 comments

Comments

# 2017-03-31 05:27 AM by Kuan

被導到LINE APP似乎不是每個行動瀏覽器都可以哦。 當初我在做LINE Login的時候,使用ASUS手機內建的瀏覽器是不會有的,要額外裝chrome才有。 ios手機的safari也沒有,也是要額外裝chrome。 但現在Login的API改成version 2,不知還是不是如此。 再補充當初踩到的,如果chrome不是預設瀏覽器,如使用chrome做登入的動作,它的call back會開啟預設瀏覽器.. 供參考~~

# 2017-05-05 09:16 AM by DC

你好~我想請問個問題,Line Login取得的Access Token,可以直接用於Line Notify嗎?

另外,我的Line Notify登入後都要選擇1對1訊息或是我所擁有的群組,可是像是IFTTT的連動,他進去只需要按連動即可,而且可以在IFTTT的設定內修改要1對1訊息還是要群組訊息

請問IFTTT是如何拿到群組列表以及Access Token,以及怎麼快速切換不同群組的Access Token?

謝謝您!

# 2018-06-06 03:48 AM by Ricky

黑大,您好,可以幫我看一下我callback.php哪裡有誤嗎,謝謝您,我已經成功得到code和state(如以下網址) https://example.com/callback.php?code=qHPq6vQ19BbRk0Y3MUGn&state=abcde

我得到的錯誤代碼: Warning: file_get_contents(https://api.line.me/oauth2/v2.1/token): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /example.com.tw/callback.php on line 28 bool(false)

我的程式如下: $client_id = '{CHANNEL_ID}';//client_id $client_secret = '{CHANNEL_SECRET}'; //client_secret $redirect_uri= "https://example.com/callback.php";//callback url $code = $_GET['code']; $state = $_GET['state'];

if(!$code){ die('串連失敗'); }

$url = 'https://api.line.me/oauth2/v2.1/token';//Line token網址 $data = array( 'grant_type' => 'authorization_code', 'client_id' => $client_id, 'client_secret' => $client_secret, 'code' => $code, 'redirect_uri' => $redirect_uri, ); $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded", 'method' => 'POST', 'content' => json_encode($data), ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);//第28行 var_dump($result);

# 2018-06-06 03:58 AM by Ricky

不好意思剛剛沒有將 https 改為 httqs ,所以重PO 黑大,您好,可以幫我看一下我callback.php哪裡有誤嗎,謝謝您,我已經成功得到code和state(如以下網址) httqs://example.com/callback.php?code=qHPq6vQ19BbRk0Y3MUGn&state=abcde

我得到的錯誤代碼: Warning: file_get_contents(httqs://api.line.me/oauth2/v2.1/token): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /example.com.tw/callback.php on line 28 bool(false)

我的程式如下: $client_id = '{CHANNEL_ID}';//client_id $client_secret = '{CHANNEL_SECRET}'; //client_secret $redirect_uri= "httqs://example.com/callback.php";//callback url $code = $_GET['code']; $state = $_GET['state'];

if(!$code){ die('串連失敗'); }

$url = 'httqs://api.line.me/oauth2/v2.1/token';//Line token網址 $data = array( 'grant_type' => 'authorization_code', 'client_id' => $client_id, 'client_secret' => $client_secret, 'code' => $code, 'redirect_uri' => $redirect_uri, ); $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded", 'method' => 'POST', 'content' => json_encode($data), ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);//第28行 var_dump($result);

# 2019-07-31 11:23 AM by Isam

黑大 求解惑 我需做LINE LOGIN 而我網站有SSL 並且是買了WWW的 程式方面 redirect_uri 設定 是 httqs://www.xxx.com.tw/Home/callback,LINE Developers設定 同樣也是httqs://www.xxx.com.tw/Home/callback, 當我呼叫的時候她出現ERROR 400,但我把LINE Developers設定成httqs://xxx.com.tw/Home/callback,他可以導去LINE LOGIN PAGE 當我驗證成功之後,他導頁回我網站的時候 他卻導向httqs://xxx.com.tw/Home/callback 這邊,而我的網站是有WWW 不知哪邊要再設定,求解

# 2022-03-15 08:56 PM by OK

黑大,非常謝謝您回覆! 是的,需求為先行自訂state並用來對應TOKEN! 假設:簡述需求為先自訂100個不同state的網址並使其能連動同一LINE notify 。100位用戶連動成功後,資料庫能紀錄100個TOKEN和對應的100個自訂的STATE。

在下實為門外漢,以上要如何能記錄至資料庫的方式,也請黑大不吝幫忙指教,非常感謝您!(若語意不清,請您見諒)

# 2022-03-15 11:12 PM by Jeffrey

to OK,我有設計過類似機制,做法提供你參考。 設計一 Table - AccessTokenList,有三個欄位 UserID(GUID)、UserName、AccessToken 註冊UI:使用者填寫使用者名稱,按下註冊鈕,系統當場產生一個 GUID,並將使用者名稱(UserName)跟 GUID(UserId)寫入資料庫,接著導向 ℎttp://notify-bot.line.me/oauth/authorize?response_type=code&client_id=….&redirect_uri=callback網址&scope=notify&state=GUID Callback:得到 code 及 state,UPDATE AccessTokenList SET AccessToken = code WHERE UserId = state 要發訊息給特定使用者時,由 UserName 查 AccessTokenList 取得 AccessToken,呼叫 API 發送通知。 希望以上說明夠清楚。

# 2022-03-16 09:04 AM by OK

黑大,感謝您!非常清楚,在下希望能逐步完成您所述的機制。 目前練習連動設定,不過不知如何將TOKEN收集至資料庫。

以下簡述: 使用者能對應多組不同TOKEN嗎? 以在下的粗淺需求說明:原100個自訂state網址 1.一用戶可能同時有多組state(USERID)及多組對應的TOKEN, 2.已使用過的自訂state(USERID)網址,一連動成功後該網址則失效無法連動。 3.您所述:要發訊息給特定使用者時,由 UserName 查 AccessTokenList 取得 AccessToken,呼叫 API 發送通知。在下就是為此需求,就是一直苦無無法建置,也再請黑大幫忙!

非常感謝您!

# 2022-03-16 08:16 PM by OK

黑大,打擾了,抱歉表達不清楚! 假設狀況:每一組100位,會有多組B.C.D............... 使用一組為A組並已先預訂state:A001~A100的自訂網址 假設用戶M藉由A001的網址連動完成! 則資料庫會有用戶M :A001 USERID 暱稱 TOKEN 這樣在下會知道M透過第A組連動

若假設用戶N藉由B001的網址連動完成! 則資料庫會有用戶N :B001 USERID 暱稱 TOKEN 這樣在下會知道N透過第B組連動

若假設用戶M藉由B002的網址連動完成! 則資料庫會有用戶M :B002 USERID 暱稱 TOKEN 這樣在下會知道M透過第B組連動 (M同時是A、B組)

不好意思,表達欠妥,請見諒!

# 2022-03-16 10:52 PM by Jeffrey

to OK,對分組、每組100位、連動等定義還是沒能完全理解(可能是因無法對映到生活可見的實例上),但聽起來用不用 LINE Notify 非關鍵,重點是識別用戶 X 在哪些組別裡註冊了哪些 UserID,這樣的話,設計一張大 Table,定義欄位 用戶代碼(N,M)、組別(A,B..)、序號(A001、B001...)、UserId或暱稱、AccessToken或其他發通知用的關鍵資料,若使用關聯式資料庫,要查用戶 M 在哪些組有連動,查詢「SELECT * FROM 大Table WHERE 用戶代碼 = 'M'」 即可;查 A 組要連動會通知到誰則是 「SELECT * FROM 大Table WHERE v組別 = 'A'」。

# 2022-03-16 11:37 PM by OK

黑大,打擾了,抱歉表達不清楚! 您所述之重點,亦是在下查詢管理的重要點!

使用LINE Notify取得TOKEN來通知個別訊息是必要的功能! (或是能有其他運用LINE通知方式也請您不吝建議)

如您所述: 預先設定的 組別(A,B..)、序號(A001、B001...) 需先有一連結或方式,先行取得上述後同時能取得TOKEN到指定的設計的大 Table。 日後可運用該Table,來查找通知對應用戶。

這是目前在下不知道要如何建置相關此連結或方式進而建構 Table紀錄之資料庫裡!

非常謝謝您!

# 2022-11-30 11:17 PM by Jeffrey

to 打結了,我想 HTML JavaScript 不可行,一則受限 Cross-Site 不能呼叫跨網域 API,二則 Token 會外洩到客戶端。ASP 要呼叫 WebAPI 需依賴 MSXML https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms766431(v=vs.85) 但要串接現代 WebAPI 處理 JSON 蠻痛苦的。我的話會是「連結資料庫撈 Token 連續發送」這段寫成 ASP.NET 或 ASP.NET Core 寫,再由其他程式(包含傳統 ASP)用一個簡單 URL 觸發(可以鎖來源 IP 避免被盜用)。

Post a comment

Comment
Name Captcha 38 + 2 =

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK