1

使用.NET中的Google.Apis.Analytics.v3庫,我做一個的OAuth2認證的谷歌Analytics(分析)API,像這樣:Google API:如何檢查認證是否成功完成?

string[] scopes = new string[] { AnalyticsService.Scope.Analytics, // view and manage your analytics data 
              AnalyticsService.Scope.AnalyticsEdit, // edit management actives 
              AnalyticsService.Scope.AnalyticsManageUsers, // manage users 
              AnalyticsService.Scope.AnalyticsReadonly};  // View analytics data 

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

AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer() 
{ 
    HttpClientInitializer = credential, 
    ApplicationName = "Masterpiece" 
}); 

這樣做的問題是,在年底,我不不知道驗證是否成功,因爲我沒有看到從這個實現中獲取任何消息的方法。通常情況下,這工作得很好,我可以繼續詢問API。但是,如果我撤消爲此用戶名存儲的令牌,那麼此實現不會告訴我該服務未經過身份驗證,並且當我嘗試詢問API後,我收到錯誤消息。

在開始訪問API方法之前,我應該如何驗證身份驗證是否成功完成?如果身份驗證失敗,我希望能夠從我的數據存儲中刪除撤銷令牌,然後再次嘗試身份驗證,請求用戶權限。

回答

1

實際上有幾件事情可能會出錯,你應該考慮。

  1. 用戶可以點擊接受。好的沒問題,在這裏你可以檢查credential.Token.AccessToken,看看你有一個訪問令牌,可以訪問API。
  2. 用戶不單擊accept,而是單擊cancle。在這種情況下,拋出異常。這就是爲什麼你上面的代碼應該試試看。 [System.AggregateException] InnerException = {「錯誤:\」access_denied \「,說明:\」\「,Uri:\」\「」}
  3. 第三種選擇是用戶不做任何事情,等待用戶的結果。 (Bug report:仍然在爲這一個解決方案)

現在你的擔心是,如果你刪除你的DatabaseDataStore中的用戶會發生什麼。那麼應該發生什麼就像有一個新用戶一樣。如果您的DatabaseDataStore中的代碼正確,系統將檢測到它沒有此用戶,並且會再次提示用戶進行身份驗證。客戶端庫應該爲你做,或者說DatabaseDataStore應該。我建議用戶和FileDataStore進行測試,看看它是如何工作的。如果您從系統中刪除用戶時目前沒有提示進行新身份驗證,那麼您的DatabaseDataStore有問題。

推薦。

  1. 不要求所有這些範圍只請求你所需要的。
  2. 把你的代碼放在try catch中,如果你沒有得到認證,它會拋出一個錯誤,你需要去捕獲它。
  3. 如果您真的擔心AccessToken測試。

enter image description here

+0

您好,感謝您的解釋。但是,我的情況稍有不同。我其實有一個try/catch,當用戶點擊取消時,它會處理這種情況。但是在我描述的場景中,用戶已經在過去的某個時間進行了身份驗證,現在管理員撤銷了其中一個令牌,但不會從數據庫中刪除它們。當網站嘗試再次連接到GA時,它將使用它在數據庫中找到的吊銷標記。 credential.Token只返回與我最初發送的相同的已吊銷標記,並且不會引發錯誤。 HTTP://截屏。com/t/Eum96s3chP – SsjCosty

+0

你的databasedatastore應該處理管理員沒有完全刪除刷新令牌 – DaImTo

+0

正確...但數據存儲如何知道令牌已被撤銷?您可以通過調用URL(https://accounts.google.com/o/oauth2/revoke?token={token})來撤消令牌,但數據存儲將如何檢查令牌是否已被撤銷? – SsjCosty