[筆記]Line Login 使用 MVC C#

在ASP.net C# 專案中

使用Line Login 快速登入範例

 

網站串Line Login 快速登入

前置步驟

1. 登入LINE(https://developers.line.me/en/),並註冊開發者帳號。

2. 完成登入及註冊後點選start。

3. 選擇Create Provider。

4. 依個人喜好想一個Provider名稱填入,並點選Comfirm。

5. 確認無誤後後點選Create。

6. 點選LINE Login

7. 輸入App name、App description接著選擇 Use WEB 然後填入Email,以上確認無誤後點選Confirm。

8. 看到以下畫面已經填寫完成基本資料了,接著點選下方的箭頭(→)。

 

9. 上傳一張圖片並確認以下資訊無誤後點選左側的App settings。

10. 填入Callback URL。

說明: User點選LINE快速登入之後會先導到LINE登入頁面,LINE會進行驗證,通過驗證後會導回你指定的網址並以QueryString的方式附上code與state的參數值
Callback URL這欄位就是給你指定通過驗證後會導回的網址

11. 點選Home下方帳號名稱的連結,回到開發者資訊頁面,接著點選【Send verification email】寄出驗證信。

12. 到你的Email信箱收信,點選Email中的連結 Verify your email address

13. 回到開發者資訊頁面,確認驗證完成。

開始寫CODE了

1. 組URL導到LINE登入頁面進行驗證

VIEW

<a href="@Url.Action("LineLoginDirect")">
  <img src="~/images/btn_login_base.png" alt="Line Login" />
</a>

說明: 連結指向後端Controller的ActionResult

圖片可以在LINE Developer網站下載(https://developers.line.me/en/docs/line-login/login-button/)

網頁中的 Download: LINE Login button images

Controller

public ActionResult LineLoginDirect()
        {
            string response_type = "code";
            string client_id = "填入Channel ID";
            string redirect_uri = HttpUtility.UrlEncode("填入Callback Url");
            string state = "自訂一組state密碼例如aaa";
            string LineLoginUrl = string.Format("https://access.line.me/oauth2/v2.1/authorize?response_type={0}&client_id={1}&redirect_uri={2}&state={3}&scope=openid%20profile&nonce=09876xyz",
                response_type,
                client_id,
                redirect_uri,
                state
                );
            return Redirect(LineLoginUrl);
        }

說明: Channel ID就是Client_id 在前置作業的開發者設定頁面中的 Channel settings 可以找到

2. 接LINE丟回來的code與state參數值

接到之後再去CallApi (https://api.line.me/oauth2/v2.1/token)取回Token

取回Token後再用這組Token去CallApi (https://api.line.me/v2/profile)取回User Profile

Controller

public ActionResult callback(string code, string state)
        {
            if (state == "自己設定的state密碼")
            {
                #region Api變數宣告
                WebClient wc = new WebClient();
                wc.Encoding = Encoding.UTF8;
                wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                string result = string.Empty;
                NameValueCollection nvc = new NameValueCollection();
                #endregion
                try
                {
                    //取回Token
                    string ApiUrl_Token = "https://api.line.me/oauth2/v2.1/token";
                    nvc.Add("grant_type", "authorization_code");
                    nvc.Add("code", code);
                    nvc.Add("redirect_uri", "填入導回的網址");
                    nvc.Add("client_id", "填入cient_id");
                    nvc.Add("client_secret", "填入client_secret");
                    string JsonStr = Encoding.UTF8.GetString(wc.UploadValues(ApiUrl_Token, "POST", nvc));
                    LineLoginToken ToKenObj =JsonConvert.DeserializeObject<LineLoginToken>(JsonStr);
                    wc.Headers.Clear();
    
                    //取回User Profile
                    string ApiUrl_Profile = "https://api.line.me/v2/profile";
                    wc.Headers.Add("Authorization", "Bearer "+ ToKenObj.access_token);
                    string UserProfile = wc.DownloadString(ApiUrl_Profile);
                    LineProfile ProfileObj = JsonConvert.DeserializeObject<LineProfile>(UserProfile);
                    
                    return RedirectToAction("UserProfile", "Home",new { displayName = ProfileObj.displayName , pictureUrl = ProfileObj.pictureUrl });
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                    throw;
                }
            }
            return View();
        }

class

    public class LineLoginToken
    {
        public string access_token { get; set; }
        public int expires_in { get; set; }
        public string id_token { get; set; }
        public string refresh_token { get; set; }
        public string scope { get; set; }
        public string token_type { get; set; }
    }

    public class LineProfile
    {
        public string userId { get; set; }
        public string displayName { get; set; }
        public string pictureUrl { get; set; }
        public string statusMessage { get; set; }
    }

取回User Profile之後在依照個人需求實作自己網站的登錄