[C#][ASP.net] 串接 Google.Apis.Calendar.v3 簡單教學入門(一) - 授權篇
2017-12-15
最近在跟Google API 打交道,我看官方案例都很簡單,像是這樣
我是寫 ASP.net ,然後我也覺得很溫馨,本機跑起來案例真的 Browser 叫起來,然後驗證就成功了,但是,我佈署到 Server 上之後,我崩潰,結果我發現,他應該是試圖呼叫 Server 的 Browser ,我簡單看一下步驟,發現他果然是給.Net 用的,但是適合用在 Winform , WPF 這種 Client 軟體端,於是我上網路找文件,發現文件很多也很雜亂,花了一點時間測試跟理解觀念這邊我就簡單地的紀錄一下,給之後有需要的人。
1. 建立 Google 那邊的一個專案 申請網址在這:
https://console.developers.google.com/projectselector/apis/library?supportedpurview=project
建立起來後 之後建立憑證
這邊請選擇 OAuth 用戶端 ID
之後填入一些資料,這邊記得導入網只要填寫
再來之後下載 JSON
打開 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 會幫你處理好
在專案中開一個檔案夾 叫做 GoogleStorage 然後把第一個步驟下載到的 .json 取名為 client_secret.json 並且放到檔案夾中
之後來看專案,使用者點擊授權後的程式碼
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.執行結果 :
成功會來後,你會在 GoogleStorage 看到多一個檔案 : Google.Apis.Auth.OAuth2.Responses.TokenResponse-sample_user_id
因為我的 userid 打 sample_user_id 所以這檔名會是這樣。
恭喜你,至少完成第一步授權篇,之後我會在寫如何新增跟刪除事件,還有換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