GoogleWebAuthorizationBroker不会自动从刷新令牌返回新的访问令牌

时间:2017-01-01 22:05:41

标签: .net google-api google-oauth gdata google-api-dotnet-client

我使用GoogleWebAuthorizationBroker类表单.Net客户端库,它在文件存储中存储访问令牌和刷新令牌,如下所示:

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

如果有效,但在一小时后,当访问令牌无效时,再次启动AuthorizeAsync时,访问令牌将返回"凭证"对象没有更新,因为它应该是(我在调试模式下取消了值,并且访问令牌仍然相同,没有更新)。甚至浏览器也没有启动以要求用户授予权限(我将其用于Google通讯录API)。

我使用OAuth2与.Net google客户端库进行身份验证,因为它比使用gdata库进行身份验证要简单得多。 不过我使用旧的gdata lib来更新gmail联系人(新的联系人API不允许YET联系人数据修改)。

混合这些API有问题吗?我应该使用gdata库进行身份验证吗?

感谢名单。

1 个答案:

答案 0 :(得分: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();

不幸的是,我需要一小时才能确认它是否有效。后台代码在尝试刷新之前检查当前访问令牌是否已过期,因此我需要等待其过期。