使用API​​ Client Library for .NET时如何刷新/获取访问令牌?

时间:2016-03-16 18:21:11

标签: asp.net-mvc google-oauth google-api-dotnet-client

我有一个与“在到期时获取新的访问令牌”相关的快速问题。我已经阅读了一些教程,其中人们编写代码来手动请求新的访问令牌。

在我的情况下,我编写了一个ASP.NET MVC应用程序来访问Google API,例如Gmail API,我正在使用API​​ Client Library for .NET。

在OAuth 2.0授权后,我返回 AuthorizationCodeWebApp.AuthResult 类型的结果对象。

result.Credential.Token 包含 AccessToken RefreshToken 属性。

我在第一次回来时(在同意屏幕之后)将刷新令牌保存在我的web.config中。所有下一个请求都没有刷新令牌,只有一个访问令牌在1小时后过期。

所以,我的问题是 - 在我打电话实例化Gmail服务之前,我分配以前保存的刷新令牌:

result.Credential.Token.RefreshToken = WebConfigurationManager.AppSettings["RefreshToken"];
var service = new GmailService(
    new BaseClientService.Initializer { HttpClientInitializer = credential });

result.Credential.Token.AccessToken 到期时,如果 result.Credential.Token,Gmail API(或任何其他适用于.NET的API客户端库)会自动获取新的访问令牌。 RefreshToken 被分配了先前保存的有效刷新令牌值,就像在我的代码示例中一样?

谢谢!

更新 - 对我的问题有更多说明使用相同的刷新令牌,我可以在拨打Google API时获取新访问令牌的次数? 我将解释:访问令牌在1小时内到期,对。 如果我继续拨打电话,例如,间隔10分钟到Gmail API(例如),经过6次通话(1小时限制)后,Gmail API将使用我的刷新令牌获取新的访问令牌。再打6个电话(再多1个小时),整个事情就会重演。问题 - 是否有限制?请记住,我没有更改刷新令牌。正在使用相同的刷新令牌来获取新的访问令牌。这个重复的调用可以持续多久而没有任何错误?

测试后更新 我让我的应用程序在我的本地机器上以Visual Studio DEBUG模式运行,试图捕获任何异常,没有人工交互。 该应用程序持续2分钟间隔接收AJAX调用Gmail动作,一切正常,我去健身房,2小时后回来 - 哎呀,Visual Studio调试打开就此令牌已被撤销异常,我们开始了,所以很明显,Google API服务撤销了令牌,正如您可以在“调试”窗口中看到的那样。唯一的问题仍然是 - 为什么,因为没有提供具体的细节,没有内部异常只是一般的错误信息而没有理由,但来源很明确 - 谷歌API,我们甚至可以看到它从

  

Google.Apis.Requests.ClientServiceRequest`1.Execute()в   C:\ Users \用户mdril \文档\ GitHub的\谷歌API-DOTNET客户端的\ src \ GoogleApis \蜜蜂\请求\ ClientServiceRequest.cs:行   96

我猜测服务在N次呼叫后关闭(撤销令牌),可能在一定的时间间隔内。如果有人知道Google API在通话次数或通话时间间隔方面的限制,请告知我们。

enter image description here

似乎Google github上的Google API保管人Matthew Riley编写了一些基于某些标准撤销令牌的逻辑:https://github.com/google/google-api-dotnet-client

1 个答案:

答案 0 :(得分:1)

对评论的长期回应:

  

但有一个问题:这可以无限期地无限次地完成,或者我会在某个时候出错吗?

由于以下原因,刷新令牌可能无效:

  1. 用户可以在Google帐户中撤消它。
  2. 如果刷新令牌在6个月内未被使用以获得新的访问令牌,则它将自动过期。
  3. 如果用户对您的应用程序进行身份验证,则会获得刷新令牌,如果他们再次执行此操作,则会获得不同的刷新令牌。两者都有效。你最多可以做26次。在第27次用户验证您的应用程序时,您获得的第一个将到期。您只能拥有26个实时刷新令牌。 (不要问我怎么知道这个!“#¤%&)
  4. 因此,假设您没有多次重新申请应用程序,请至少每六个月使用一次刷新令牌。您可以根据需要多次使用它。

    评论更新:

    我觉得你还是很困惑。访问令牌在1小时后过期。刷新令牌只会因上述原因而过期,您可以根据需要多次使用它们。获取新的访问令牌。

    但是,你只能有25个工作刷新令牌。

    假设我有一个Windows服务应用程序可以将文件备份到用户的Google云端硬盘帐户。用户将其安装在服务器上并对其进行身份验证并获取刷新令牌。每晚Windows服务运行并将文件备份到谷歌驱动器,它使用刷新令牌获取新的访问令牌。

    让我们说这个用户真的很喜欢我的自动超级imba备份服务。他将它安装在另一台服务器上。他获得了另一个刷新令牌,应用程序在晚上开始上传文件

    让我们说我的超级用户真的有一个服务器场,他在25台服务器上安装我的应用程序。这些应用程序将能够永久获得新的访问令牌。

    但是,如果这个疯狂的用户在第26次安装它,则在另一台服务器上获取此服务器的新刷新令牌。他们安装它的第一台服务器将停止工作,因为谷歌只允许你为应用程序提供25个未完成的刷新令牌。

    这是基于用户的应用程序,因此您可以拥有任意数量的用户,每个用户最多有25个刷新令牌