2015-06-10 31 views
0

无限循环错误。有人可以通过Rest将Google OAuth2用于Cloud DNS吗?

我一直花太多时间在Google的圈子里面讨论关于在桌面应用程序中实现他们的云服务的非常糟糕的API文档。

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

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

可能在使用休息或谷歌.NET API库建立所需的OAuth2令牌数据的/ etc这将后来被用来访问所有WinForms应用程序使用C#.NET有人举一个例子这些API的在这里。

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

并请----没有gcloud.exe东西。期望客户下载这个庞大而复杂的安装程序来获取该工具并不现实。 :)

+1

你介意描述你的应用程序实际在做什么吗?根据您的使用情况,您可能需要使用服务帐户 - 这些服务帐户相对易于使用。如果你需要社区的帮助,我还建议发布你迄今为止所做的工作。 – konqi

+0

@ konqi - 感谢您的回复。该应用程序将负责添加域(注册/创建)以及添加/更新DNS记录。用户还应该能够删除其域名或删除记录,并列出需要使用的DNS服务器,例如:“ns1.google.ca”,“ns2.google.ca” - 谷歌设置的DNS服务器(例如)GoDaddy或他们通过域名购买域名的用户必须向其域名申请的记录。 –

+1

那么用户将使用他们自己的帐户访问云端DNS或者这是一个提供的服务(您将在您的帐户中为他们托管DNS)?我的问题主要是为了了解谁将会被认证。在第一个用例中,您基本上为CloudDNS设置创建了一个UI。在后一种情况下,你会成为服务提供者。 – konqi

回答

1

发现一段时间来创建一个小样本应用程序。你可以在github找到代码。

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

大部分的认证和云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 lib和我可以使用包裹作家),但完成样品应该工作。 我希望这有助于让你走上正轨。

编辑:我删除了样本中使用的客户端ID和密码,因此您需要用自己的代码替换这些代码以使代码正常工作。

+0

我设法使用webbrowser控件编写Oauth2例程(以提示权限),然后取回令牌并对其进行处理。开始直接调用其余的api。我在接受您的解决方案时付出了很多努力,如果需要使用Google .NET库,我将来可能会再次审核。不知道为什么,但我发现浏览器控制方法更容易得到令牌。不知道'refresh'令牌是什么,因为如果使用令牌我得到一个错误,我总是可以再次在对话框中显示Oauth2权限请求窗口。 –

+0

你仍然有GitHub中的client_id和secret。我建议更改这些或从您的帐户中删除访问权限,以免人们抓取并滥用您的帐户。 –

+1

我很高兴,如果你有它的工作。客户秘密不是问题,因为我从我的项目中删除了整个凭证。 – konqi

相关问题