2017-01-01 166 views
2

我用它存儲的訪問令牌GoogleWebAuthorizationBroker類形式.NET客戶端庫,並在文件存儲刷新令牌,就像這樣:GoogleWebAuthorizationBroker不會自動返回新的訪問令牌刷新令牌

  UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }, 
           scopes, "XXXXXX", CancellationToken.None 
      ,new FileDataStore("XXXXXX") 
           ).Result; 

如果作品,但一小時後,當acces令牌無效時,再次啓動AuthorizeAsync時,「憑證」對象中返回的訪問令牌不會被更新,因爲它應該是(我在調試模式和acces令牌仍然是一樣的,沒有更新)。即使瀏覽器不啓動要求用戶授予權限(我用它的Google聯繫人API)。

我使用OAuth2與.Net谷歌客戶端庫進行認證,因爲它比用gdata庫進行認證要簡單得多。 不過,我使用舊的gdata庫更新Gmail聯繫人(新的聯繫人API不允許YET聯繫人數據修改)。

混合這些API是否存在問題?我應該用gdata庫來驗證嗎?

Thanx。

回答

1

不用說它可以說是對gdata api進行身份驗證的最簡單方法是使用發現庫進行身份驗證。

你沒有顯示你如何將訪問令牌應用到你的gdata請求,但我會假設這工作正常。

事情是,包含「GoogleWebAuthorizationBroker」的發現庫使用FileDatastore刷新您的訪問令牌。它在需要時做到。您沒有使用它的任何請求,所以它永遠不會刷新您的訪問令牌。這樣做的最簡單方法是使用發現API製作虛擬請求。我通常只是使用人api。

People.get發送'我'的參數只是獲得當前通過身份驗證的用戶的一些虛擬信息。如果訪問令牌已過期,則會爲您提供新的訪問令牌。

我打算在圖書館中挖掘一點,我很想知道爲什麼我們沒有這樣的時間強制刷新訪問令牌方法。

更新:

,你將需要添加的範圍PlusService.Scope.PlusMehttps://www.googleapis.com/auth/plus.login

var service = new PlusService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = "Google Plus Authentication Sample", 
      }); 

// dummy call to api to refresh the auth token if needed. 
var refresh = service.People.Get("me").Execute(); 

UPDATE2:

位客戶端庫,我發現有用於強制的訪問令牌更新

var m = credential.GetAccessTokenForRequestAsync(); 

可惜的方法四處後它去在我能確認它工作之前一個小時。後臺代碼在嘗試刷新它之前檢查當前訪問令牌是否過期,因此我需要等待一個過期。

+0

Thanx DaImto。我使用您的博客http://www.daimto.com/google-contacts-with-c/中的代碼來使用gdata請求。實際上,您在評論部分的博客中提到,您在調試模式下進行了嘗試,並且發現一小時後,由AuthorizeAsync返回的acces令牌會被更新。我使用了相同的代碼,但它沒有。爲什麼?至於People.get解決方法,你能指出一些示例C#代碼嗎? –

+0

你可能想嘗試玩人api。 https://developers.google.com/people/api/rest/v1/people.connections它似乎讀取從谷歌聯繫人。 – DaImTo

+0

我如何創建「服務」對象? –