GoogleWebAuthorizationBroker 不会自动 return 来自刷新令牌的新访问令牌

GoogleWebAuthorizationBroker does not automatically return new access token from refresh token

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

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

如果有效,但一小时后,当访问令牌无效时,再次启动 AuthorizeAsync 时,"credential" 对象中返回的访问令牌不会更新,因为它应该更新(我检查了调试模式下的值和访问令牌仍然相同,未更新)。甚至浏览器也不会启动以请求用户授予权限(我将其用于 Google 联系人 API)。

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

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

谢谢。

不,它可以说是对 gdata 进行身份验证的最简单方法 api 是使用发现库进行身份验证。

您没有展示如何将访问令牌应用于您的 gdata 请求,但我假设它工作正常。

问题是包含 "GoogleWebAuthorizationBroker" 的发现库使用 FileDatastore 来刷新您的访问令牌。它在需要时执行。您没有使用它发出任何请求,因此它永远不会刷新您的访问令牌。最简单的方法是使用发现 api 发出虚拟请求。我通常只使用人api。

People.get 发送参数 'me' 只是获取当前已验证用户的一些虚拟信息。如果访问令牌已过期,那么它将为您获取一个新的。

我打算在图书馆里翻找一下我想知道为什么我们在这样的时候没有强制刷新访问令牌方法。

更新:

您需要添加范围 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();

更新2:

在客户端库中仔细研究后,我发现有一种方法可以强制更新访问令牌

var m = credential.GetAccessTokenForRequestAsync();

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