【问题标题】:Google Contacts API with Service Account issue带有服务帐户问题的 Google Contacts API
【发布时间】:2015-08-26 02:13:54
【问题描述】:

所以,我基本上已经完成了这项工作,除了一个问题。我已经设置了一个谷歌服务帐户,因此它可以访问我们的域联系人。并且可以完美的批量查询!

但是如果我调用 cr.Retrieve("some-contact-url-here"),它会抛出一个错误,抱怨没有刷新令牌。不过我使用的是服务帐户,所以我在进行身份验证时没有获得刷新令牌。

对于我应该如何获取服务帐户的刷新令牌,我似乎找不到任何好的答案。有一个或两个 stackoverflow 帖子主动提到使用服务帐户获取刷新令牌......但他们链接到的内容已经被重定向。我发现与刷新令牌有关的任何其他事情基本上都是关于手动验证和存储令牌。因为我需要使用服务帐户,所以这是不可能的。

【问题讨论】:

    标签: c# google-api-dotnet-client google-shared-contacts


    【解决方案1】:

    您从 Google Developers Console 获得的服务帐户凭据包括生成的唯一电子邮件地址、客户端 ID 和至少一个公钥/私钥对。您使用客户端 ID 和一个私钥来创建签名的 JWT 并以适当的格式构造访问令牌请求。然后,您的应用程序将令牌请求发送到 Google OAuth 2.0 授权服务器,该服务器返回访问令牌。应用程序使用令牌来访问 Google API。当令牌过期时,应用程序会重复该过程。

    查看page 了解更多信息。

    【讨论】:

    • 哦,我知道。问题是 cr.Retrieve("some-contact-url-here") 调用 OAuthBase.Excute() 然后最终调用 OAuthBase.GetRefreshAccessTokenRequestBody()....然后失败因为你的 OAuth2Parameters 不会有一个刷新令牌。
    【解决方案2】:

    好的,基于我对 API 猛烈抨击的几个小时,当您作为服务帐户进行身份验证时,似乎基本上没有办法获得刷新令牌。预期的行为,真的。

    无论如何,要解决这个问题,您可以将所有联系人加载到内存中,

    feed.AutoPaging = true;
    foreach (var c in feed.Entries)
    {
        contactList.Add(c);
    }
    

    然后你可以更新|删除|等。虽然效率很低。特别是如果您的联系人列表变得相当大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多