最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2021年2月20日 星期六

Google、Facebook、Line OAuth 實做登入操作 (1) - Line Login

最近研究透過Google、Facebook、Line提供的OpenID登入,順到記錄一下所有操作內容,OpenID是一種分散式認證系統,使用者可透過一個帳號、密碼就能登入多個網站,可省去管理多組帳號、密碼。Google、Facebook兩者的驗證流程相似,但與Line不同,就先以Line Login的操作方式來說明,透過JavaScript來操作,各位朋友若有其他語言有興趣可自行轉換。

步驟1:登入 Line Developers 後台。

步驟2:點擊「Products」。

步驟3:點擊「 LINE Login」。

步驟4:點擊「開始體驗」。

步驟5:點選「Create a new provider」。

步驟6:輸入「Provider」名稱與選擇「Region」。

步驟7:填寫「Channel name」、「Channel description」內容與選擇「App types」。

步驟8:勾選「I have read and agress to the LINE Developers Agreement」與點擊「Create」

步驟9:點選「LINE Login」頁籤,這裡「Callback URL」需要一個 Https 的網址,由下面幾個步驟來建立。

步驟10:至 USBWebserver 官網下載輕量級網站伺服器軟體 USBWebserver,解壓縮 USBWebserver。

步驟11:至 ngrok 官網下載 ngrokngrok 是一個可以讓內網伺服器與外界溝通的服務,解壓縮 ngrok

步驟12:啟動USBWebserver.exe,此時Apache已啟動,web 預設 port 為 8080。

步驟13:開啟「命令提示字元」切換到 ngrok 所在目錄,輸入「ngrok http 8080」,起動內網伺服器與外界溝通的服務。

此時就會產生一個 Https 的網址。

複製網址貼到 Chrome 瀏覽器的新分面上開啟測試,若成功開啟,表示 Https 網址已經串接完成。

步驟14:將 Https 網址填到 步驟9「LINE Login」頁籤的「Callback URL」。

步驟15: 建立 Line 授權,將以下 JavaScript 程式碼存成 linelogin.html,並到 Line Developers 後台的「Basic settings」頁籤將「Channel ID」、「Your user ID」與將 linelogin.html 與 Https 網址完整的串接在一起填入程式碼。
 <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>LINE Login Demo</title>
    </head>
    <body>
        <button id="lineLoginBtn">LINE login</button>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js'></script>
        <script>
            var channel_id = "channel id";
            var channel_secret = "channel secret";
            var uri = "Https網址";
            
            //var code = ""; 
            $('#lineLoginBtn').on('click', function(e) {
                let client_id = channel_id;
                let redirect_uri = uri;
                let link = 'https://access.line.me/oauth2/v2.1/authorize?';
                link += 'response_type=code';
                link += '&client_id=' + client_id;
                link += '&redirect_uri=' + redirect_uri;
                link += '&state=login';
                link += '&scope=openid%20profile%20email';
                window.location.href = link;
            });

            var url = new URL(window.location.href);
            var code = url.searchParams.get("code"); 
            if(code != null) document.write('<br / > code : ' + code + '<br / >'); 
        </script>
    </body>
    </html>



步驟16:在 Chrome 瀏覽器的新分面上開啟「Callback URL」。

步驟17:點擊「LINE login」按鈕,即可見到「LINE」登入畫面,點擊「登入」按鈕。

接著出現授權許可的畫面,點擊「許可」按鈕。

最後回到原本的網頁,在網址中的「code」就是我的要取得的內容。

步驟18:將以下程式碼再加入 linelogin.html,再執行一次登入授權,取回token。
var result = $(".result");
var id_token = "";
$.ajax({
  method: "POST",
  dataType : 'json',
  url: "https://api.line.me/oauth2/v2.1/token",
  async : false,              
  data: { grant_type    : "authorization_code", 
          code          : code,
          redirect_uri  : uri,
          client_id     : channel_id,
          client_secret : channel_secret},
  success: function(data) {
    id_token = data.id_token;                 
  }
});            
if(id_token.length != 0)  document.write('<br / >id_token : ' + id_token + '<br / >');

步驟19:將以下程式碼再加入 linelogin.html,再執行一次登入授權,拿token呼API取得使用者的公開資料。
$.ajax({
  method: "POST",
  dataType : 'json',
  url: "https://api.line.me/oauth2/v2.1/verify",
  async : false,              
  data: { client_id     : channel_id,
          id_token      : id_token },
  success: function(data) {
    document.write('<br / ><br / >' + JSON.stringify(data));
  }
});


將上面所有程式碼整合起來。
 <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>LINE Login Demo</title>
    </head>
    <body>
        <button id="lineLoginBtn">LINE login</button>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js'></script>
        <script>
            var channel_id = "channel id";
            var channel_secret = "channel secret";
            var uri = "Https網址";

            $('#lineLoginBtn').on('click', function(e) {
                let client_id = channel_id;
                let redirect_uri = uri;
                let link = 'https://access.line.me/oauth2/v2.1/authorize?';
                link += 'response_type=code';
                link += '&client_id=' + client_id;
                link += '&redirect_uri=' + redirect_uri;
                link += '&state=login';
                link += '&scope=openid%20profile%20email';
                window.location.href = link;
            });

            var url = new URL(window.location.href);
            var code = url.searchParams.get("code"); 
            if(code != null) document.write('<br / > code : ' + code + '<br / >');
            
            var result = $(".result");
            var id_token = "";
            $.ajax({
              method: "POST",
              dataType : 'json',
              url: "https://api.line.me/oauth2/v2.1/token",
              async : false,              
              data: { grant_type    : "authorization_code", 
                      code          : code,
                      redirect_uri  : uri,
                      client_id     : channel_id,
                      client_secret : channel_secret},
              success: function(data) {
                id_token = data.id_token;                 
              }
            });            
            if(id_token.length != 0)  document.write('<br / >id_token : ' + id_token + '<br / >');
            
            $.ajax({
              method: "POST",
              dataType : 'json',
              url: "https://api.line.me/oauth2/v2.1/verify",
              async : false,              
              data: { client_id     : channel_id,
                      id_token      : id_token },
              success: function(data) {
                document.write('<br / ><br / >' + JSON.stringify(data));
              }
            });
        </script>
    </body>
    </html>

到了這裡就完成透過LINE Login的認證達成登入的操作。



沒有留言:

張貼留言