【发布时间】:2015-04-26 14:24:49
【问题描述】:
我正在尝试在我当前的 C# 应用程序中使用 Dropbox API。
目前我正在努力处理 OAuth2 身份验证(隐式流程)。
首先,我选择了隐式流程,因为我开发了一个纯客户端应用程序,并且关于 API 的文档,此流程是为此类应用程序制定的。
接下来我准备了请求:
https://www.dropbox.com/1/oauth2/authorize?response_type=token&client_id=MYCLIENTID&redirect_uri=http%3A%2F%2Flocalhost
然后我设置一个简单的TcpListener 监听端口 80 以接收来自 Dropbox 的回调。出于测试目的,我只接受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()) != "") { }
}
对于同意对话框,我现在只创建一个带有WebBrowser 控件的Window:
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 并获得所需的验证令牌。此流程的唯一问题是我必须提供我的应用程序密码,据我所知,应用程序密码永远不应位于未在您自己的服务器上运行的客户端应用程序中,以防止其被泄露。
我真的不明白为什么我不能在隐式流程中获得令牌,所以也许你们中的任何人都可以帮助我解决这个问题。我故意不使用任何第三方库来提高自己的技能。请不要介意我没有在代码示例中进行任何错误检查,因为它仅用于测试目的。
【问题讨论】:
标签: c# oauth-2.0 dropbox-api