2015-04-26 153 views
1

我正在尝试在当前的C#应用​​程序中使用Dropbox API。
目前我正在努力与OAuth2认证(隐式流)。
Dropbox API令牌流 - 无回应令牌

首先,我选择了隐式流程,因为我开发了一个纯粹的客户端应用程序,并且关于API的文档,这个流程是针对这种类型的应用程序制作的。
接下来,我制备的请求:

https://www.dropbox.com/1/oauth2/authorize?response_type=token&client_id=MYCLIENTID&redirect_uri=http%3A%2F%2Flocalhost 

然后我设置一个简单TcpListener监听端口80从收存箱接收回调。出于测试目的,我只接受TcpClient并创建一个StreamReader读取每行接受客户端的流线。

var listener = new TcpListener(IPAddress.Any, 80); 
listener.Start(); 

var client = listener.AcceptTcpClient(); 

using (var reader = new StreamReader(client.GetStream())) 
{ 
    string line = null; 
    while((line = reader.ReadLine()) != "") { } 
} 

对于同意对话框我只是创造一个Window与此刻WebBrowser控制它:

var browser = new WebBrowser {Source = new Uri(authUri)}; 
var window = new Window {Content = browser}; 

...其中authUri是请求URI从上面。

现在的文件说,这个流动的样品反应可能是:

[REDIRECT_URI]#access_token=ABCDEFG&token_type=bearer&uid=12345&state=[STATE] 

所以启动应用程序时它显示我的同意对话框。我输入我的凭证并点击“允许”。然后,我的listener开始接受新客户。在调试器中,我现在进入using块并读取每行的流水线以检查返回的内容。
我期望像GET /#access_token....作为第一行的内容,但我实际上得到GET/HTTP1.1。以下几行仅包含一些没有任何重要信息的标题。

之后,我尝试了code流程,如果这实际上有效。没有问题。我得到验证码并用必要的参数呼叫/token并获得所需的验证令牌。这个流程唯一的问题是我必须提供我的应用程序秘密,并且从我所了解的应用程序秘密来说,它绝不应该在客户端应用程序中运行在您自己的服务器上,以防止它受到攻击。

我真的不明白为什么我不能在隐式流程中获得令牌,所以也许你们中的任何人都可以帮我解决这个问题。我故意不使用任何第三方库来提高自己的技能。请不要介意我没有在代码示例中进行任何错误检查,因为它仅用于测试目的。

回答

2

在隐式流程中,访问令牌是URL片段(散列之后的部分)的一部分。网址片段不会发送到服务器。

顺便说一句,你可以看看https://blogs.dropbox.com/developers/2014/04/dropbox-authorization-in-a-windows-forms-app/。如果您无论如何都要嵌入WebBrowser控件,则根本不需要重定向到localhost,除了更简单之外,这是一个潜在的安全胜利。

+0

工程就像一个魅力! :)我只是不得不听一个不同于博客文章中解释的事件,因为我使用的是System.Windows.Controls.WebBrowser控件。 – TorbenJ