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