[C#][ASP.net] 串接 Google.Apis.Calendar.v3 簡單教學入門(一) - 授權篇

2017-12-15


最近在跟Google API 打交道,我看官方案例都很簡單,像是這樣
image

我是寫 ASP.net ,然後我也覺得很溫馨,本機跑起來案例真的 Browser 叫起來,然後驗證就成功了,但是,我佈署到 Server 上之後,我崩潰,結果我發現,他應該是試圖呼叫 Server 的 Browser ,我簡單看一下步驟,發現他果然是給.Net 用的,但是適合用在 Winform , WPF  這種 Client  軟體端,於是我上網路找文件,發現文件很多也很雜亂,花了一點時間測試跟理解觀念這邊我就簡單地的紀錄一下,給之後有需要的人。


1. 建立 Google 那邊的一個專案 申請網址在這:
https://console.developers.google.com/projectselector/apis/library?supportedpurview=project


Image 415
建立起來後 之後建立憑證
Image 422

這邊請選擇 OAuth 用戶端  ID

之後填入一些資料,這邊記得導入網只要填寫
Image 435

再來之後下載 JSON
Image 4352

打開 JSON 大概會長這樣

{
  "web": {
    "client_id": "1088926593294-4shj9oeum763j5fd5qnlkir6evntdocs.apps.googleusercontent.com",
    "project_id": "donma-test",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "53YoSqiEdipRA2bp-nbFTOpW",
    "redirect_uris": [ "http://localhost:60435/user_regist.aspx" ]
  }
}

2. 開啟一個 ASP.net 專案, 然後開啟 Nuget 下載 Google.Apis.Calendar.v3  套件,別擔心,相依性 Visual Studio 會幫你處理好
Image 427

在專案中開一個檔案夾 叫做 GoogleStorage 然後把第一個步驟下載到的 .json 取名為 client_secret.json 並且放到檔案夾中

image

之後來看專案,使用者點擊授權後的程式碼

        protected void btnStart_Click(object sender, EventArgs e)
        {

            GoogleClientSecrets clientSecret;
            //匯入專案憑證
            using (var stream = new FileStream(Gfolder + @"\client_secret.json", FileMode.Open, FileAccess.Read))
            {
                clientSecret = GoogleClientSecrets.Load(stream);
            }

            //建立流程權限
            IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
            new GoogleAuthorizationCodeFlow.Initializer
            {

                ClientSecrets = clientSecret.Secrets,
                DataStore = new FileDataStore(Gfolder),
                Scopes = new[] { CalendarService.Scope.Calendar }
            });

            
            var uri = System.Web.HttpContext.Current.Request.Url.ToString();
            var result = new AuthorizationCodeWebApp(flow, uri, "success").AuthorizeAsync(UserId, CancellationToken.None).Result;
            if (result.RedirectUri != null)
            {
                //導去授權頁
                Response.Redirect(result.RedirectUri);
            }

        }

再來就是如果從Google 授權後回來的處理
        /// <summary>
        /// App 憑證資料的檔案夾
        /// </summary>
        public static string Gfolder = AppDomain.CurrentDomain.BaseDirectory + "GoogleStorage" + System.IO.Path.DirectorySeparatorChar;

        /// <summary>
        /// 通常在就是用戶的資料庫 id 
        /// </summary>
        public static string UserId = "sample_user_id";


        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GoogleClientSecrets clientSecret;

                using (var stream = new FileStream(Gfolder + @"\client_secret.json", FileMode.Open, FileAccess.Read))
                {
                    clientSecret = GoogleClientSecrets.Load(stream);
                }

                IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
                                                new GoogleAuthorizationCodeFlow.Initializer
                                                {
                                                    ClientSecrets = clientSecret.Secrets,
                                                    DataStore = new FileDataStore(Gfolder),
                                                    Scopes = new[] { CalendarService.Scope.Calendar }
                                                });

                var uri =HttpContext.Current.Request.Url.ToString();
                var code =HttpContext.Current.Request["code"];
                if (code != null)
                {
                    var token = flow.ExchangeCodeForTokenAsync(UserId, code,
                                   uri.Substring(0, uri.IndexOf("?")), CancellationToken.None).Result;
                    
                    //儲存使用者的Token
                    var oauthState = AuthWebUtility.ExtracRedirectFromState(
                        flow.DataStore, UserId, Request["state"]).Result;

                    //印出儲存狀態
                    Response.Write(oauthState);
                }

            }
        }

3.執行結果 :

Image 430

成功會來後,你會在 GoogleStorage  看到多一個檔案 : Google.Apis.Auth.OAuth2.Responses.TokenResponse-sample_user_id
因為我的 userid 打 sample_user_id 所以這檔名會是這樣。

image

恭喜你,至少完成第一步授權篇,之後我會在寫如何新增跟刪除事件,還有換token 的機制,因為 你這裡面的 access_token 只能夠用  一個小時,所以必須透過 refresh_token 去跟 google 換 token ,之後我會把整個範例都放在網路上,等我有時間把這幾篇完成吧, 下回見 :)

參考文件 :
http://vito-note.blogspot.tw/2015/04/aspnet-google-oauth2.html
https://www.codeproject.com/Articles/36482/How-to-Create-Google-Calendar-Events-Using-NET
https://www.codeproject.com/Articles/201907/Using-Google-Calendar-in-an-ASP-NET-Website


當麻許的超技八 2014 | Donma Hsu Design.