[C#][ASP.net] 串接 Google.Apis.Calendar.v3 簡單教學入門(三) - 交換Token , refresh_token

2017-12-19

前兩篇文章,串接 Google.Apis.Calendar.v3 簡單教學入門(一) - 授權篇 讓您可以拿到使用者的 access token ,串接 Google.Apis.Calendar.v3 簡單教學入門(二) - 新增刪除篇 這一篇文章讓你可以新增跟刪除 Google Event ,重點來了,你打開 使用者拿到的 access token 檔案 本文範例為  : Google.Apis.Auth.OAuth2.Responses.TokenResponse-sample_user_id 這檔案 裡面長這樣 :

image

這裡面有一個很重要的東西就是,你的 access_token 只能存活 3600 秒,也就是一小時,那我怎麼拿到新的 Token 基本上就是得靠 refresh_token ,所以我們必須要把它 拿出來去跟 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)
        {

        }

        protected void btnRefreshToken_Click(object sender, EventArgs e)
        {
            var userAccessToken = JsonConvert.DeserializeObject<GoogleTokenModel>(File.ReadAllText(Gfolder + "Google.Apis.Auth.OAuth2.Responses.TokenResponse-" + UserId));
            try
            {
                using (var wb = new WebClient())
                {
                    var data = new NameValueCollection();
                    data["refresh_token"] = userAccessToken.refresh_token;
                    data["client_id"] = "1088926593294-4shj9oeum763j5fd5qnlkir6evntdocs.apps.googleusercontent.com";
                    data["client_secret"] = "53YoSqiEdipRA2bp-nbFTOpW";
                    data["grant_type"] = "refresh_token";

                    var response = wb.UploadValues("https://accounts.google.com/o/oauth2/token?", "POST", data);
                    string responseUTF8 = System.Text.Encoding.UTF8.GetString(response);

                    var changeTokenResponse = JsonConvert.DeserializeObject<RefrshTokenResponse>(responseUTF8);

                    Response.Write("Token 從原本的 :" + userAccessToken.access_token + " 換成: " + changeTokenResponse.access_token);

                    userAccessToken.access_token = changeTokenResponse.access_token;
                    File.WriteAllText(Gfolder + "Google.Apis.Auth.OAuth2.Responses.TokenResponse-" + UserId, JsonConvert.SerializeObject(userAccessToken));



                }

            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);

            }
        }

當然,你可以把這一段 放進 排程中讓他維持更新,至於 refresh_token 多久有效,官方是說 long lived 但是多久我也不知道
這邊有討論串你可以參考一下 : https://stackoverflow.com/questions/8953983/do-google-refresh-tokens-expire ,這一系列文章到這邊到一個段落,有任何問題,我們再一起討論吧 :)

Source code: https://github.com/donma/CSharp.Google.Apis.Calendar.v3/blob/master/TestGoogleApi/refresh_token.aspx.cs


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