【问题标题】:GoogleWebAuthorizationBroker does not automatically return new access token from refresh tokenGoogleWebAuthorizationBroker 不会自动从刷新令牌返回新的访问令牌
【发布时间】:2017-05-16 03:00:28
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    问题在于包含“GoogleWebAuthorizationBroker”的发现库使用 FileDatastore 来刷新您的访问令牌。它在需要时执行。您没有使用它发出任何请求,因此它永远不会费心刷新您的访问令牌。最简单的方法是使用发现 api 发出虚拟请求。我通常只使用 people 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();
    

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

    【讨论】:

    • 感谢 DaImto。我使用了您博客中的代码daimto.com/google-contacts-with-c 来使用 gdata 请求。实际上,您在本博客的 cmets 部分中提到您在调试模式下进行了检查,并看到一个小时后 AuthorizeAsync 返回的访问令牌被更新。我使用了相同的代码,但没有。为什么 ?至于 People.get 的解决方法,您能指出一些示例 c# 代码吗?
    • 您可能想尝试使用 people api。 developers.google.com/people/api/rest/v1/people.connections 它似乎是从谷歌联系人中读取的。
    • 如何创建“服务”对象?
    • 谢谢你,DaImTo,它就像一个魅力 ;) 与 service.People.Get。当然,我还必须在谷歌控制台 API 上激活谷歌 + API(我提到其他人在阅读解决方案时知道)。
    • 它也适用于更新 1 中的单行(所以没有更新 2)。更新 2 是比更新 1 更简洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 2021-08-25
    • 2015-10-05
    • 1970-01-01
    • 2020-04-14
    • 2021-11-21
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多