【问题标题】:Could someone bring Google OAuth2 for Cloud DNS via Rest to light?有人可以通过 Rest 为 Cloud DNS 带来 Google OAuth2 吗?
【发布时间】:2015-06-10 03:05:56
【问题描述】:

无限循环错误。

我花了太多时间在 Google 的关于在桌面应用程序中实现其云服务的非常糟糕的 API 文档中转圈。

第一个主要问题,似乎我必须以某种方式使用 Oauth2 以获得额外的客户端凭据(我必须使用刷新令牌更新/刷新,因为这也会发生变化)——因为显然 API 凭据不是足以进行充分的沟通。

https://cloud.google.com/dns/api/authorization

有人可以举一个在 WinForms 应用程序中使用 C# .NET 的示例,该应用程序使用 rest 或 Google .NET API 库来建立所需的 OAuth2 令牌数据/等,这些数据随后将用于访问所有这些 API。

https://cloud.google.com/dns/api/v1/managedZones

请 ---- 没有 gcloud.exe 的东西。期望客户下载庞大且过于复杂的安装程序只是为了获得该工具是不切实际的。 :)

【问题讨论】:

  • 您介意描述一下您的应用实际在做什么吗?根据您的用例,您可能想要使用服务帐户 - 相对容易使用。如果您需要社区的帮助,我还建议您发布您迄今为止所做的工作。
  • 那么用户将使用自己的帐户访问 Cloud DNS 还是提供服务(您将在您的帐户中为他们托管 dns)?我的问题主要旨在了解谁/什么将被认证。在第一个用例中,您基本上是为 CloudDNS 设置创建 UI。在后一种情况下,您将成为服务提供商。
  • 好的,我已经有一段时间没有使用 C# 进行此操作了,但是如果您发布与 oauth2 身份验证相关的代码,我可能会向您提示正确的方向。
  • 对,所以我建议您按顺序阅读一些文献: oauth2 如何适用于已安装的应用程序:developers.google.com/identity/protocols/OAuth2InstalledApp 以developers.google.com/api-client-library/dotnet/get_started 开头的简单示例@ 示例实现:github.com/google/google-api-dotnet-client-samples
  • 实际上并非如此,而且您坚持认为文档很烂也无济于事(主要是因为我已经知道了)。第一:是的,用户必须与 google 交互才能验证您的应用程序 - 使用 oauth 无法解决这个问题。如果你找到一个你打破它。当用户登录并且您的应用程序获得授权时会发生什么取决于您提供的 redirect_url。您可以让 google 将信息发送到您的应用程序,或者让用户将身份验证代码复制到您的应用程序中。完成后,您可以向 google 请求刷新令牌。

标签: c# api rest google-app-engine dns


【解决方案1】:

抽出一些时间来创建一个小型示例应用程序。您可以在github 上找到代码。

您说您不想使用 client_secrets.json。我发现的唯一快速解决方案是通过内存流提供必要的东西 - 可能有更好的方法。

大部分身份验证和 Cloud DNS 客户端都在这些行中完成

using (var memstream = new MemoryStream())
{
    // Ugly way of providing clientId & Secret inmemory
    var writer = new StreamWriter(memstream);
    writer.Write(@"{""installed"":{""auth_uri"":""https://accounts.google.com/o/oauth2/auth"",""client_secret"":""");
    writer.Write(clientSecret);
    writer.Write(@""",""token_uri"":""https://accounts.google.com/o/oauth2/token"",""client_email"":"""",""redirect_uris"":[""urn:ietf:wg:oauth:2.0:oob"",""oob""],""client_x509_cert_url"":"""",""client_id"":""");
    writer.Write(clientId);
    writer.Write(@""",""auth_provider_x509_cert_url"":""https://www.googleapis.com/oauth2/v1/certs""}}");
    writer.Flush();
    memstream.Position = 0;

    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(memstream).Secrets,
        new[] { DnsService.Scope.NdevClouddnsReadwrite},
        "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary"));
}

// Create the service.
var service = new DnsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "Cloud DNS API Sample",
    });

该示例缺少任何良好的编码风格(我可以使用 Json 库,并且可以将编写器包装在使用中),但该示例应该可以工作。 我希望这有助于您走上正轨。

编辑:我删除了示例中使用的客户端 ID 和密码,因此您需要将其替换为您自己的以使代码正常工作。

【讨论】:

  • 我设法使用 webbrowser 控件编写了 Oauth2 例程(以提示权限),然后我取回令牌并处理它。开始只是直接调用其余的api。我接受了您的解决方案,因为您为此付出了很多努力,如果我需要使用 Google .NET 库,我将来可能会再次查看。不知道为什么,但我发现浏览器控制方法获取令牌要简单得多。不确定refresh 令牌等的用途是什么,因为如果使用该令牌出现错误,我总是可以再次在对话框中显示 Oauth2 权限请求窗口。
  • 您仍然在 GitHub 中拥有 client_id 和 secret。我建议更改这些设置或从您的帐户中删除访问权限,以免人们抓住它并滥用您的帐户。
  • 如果你能正常工作,我很高兴。客户端密码不是问题,因为我从项目中删除了整个凭据。
  • 还没有向 dns api 发出任何休息请求,但是设置了权限标志,所以我相信应该没问题。只是好奇,我只需要使用https://www.googleapis.com/auth/ndev.clouddns.readwrite 来创建/删除域以及它们的记录,或者在此之上我是否需要另一个权限——比如说——https://www.googleapis.com/auth/cloud-platform(虽然这个范围似乎有点太宽了)。我想尽可能缩小范围。
  • 前者应该足够了。我不愿意对我的付费服务给予如此广泛的许可。
猜你喜欢
  • 2019-04-08
  • 2019-03-20
  • 2014-08-16
  • 2020-05-01
  • 1970-01-01
  • 2016-10-15
  • 2016-06-02
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多