我尝试在当前的C#应用程序中使用Dropbox API
目前,我正在努力进行OAuth2身份验证(隐式流程)。
首先,我选择隐式流程,因为我开发了一个纯客户端应用程序,关于API的文档,这个流程是针对这种类型的应用程序。 接下来我准备了请求:
Polymer 0.5.5
然后我在端口80上设置一个简单的https://www.dropbox.com/1/oauth2/authorize?response_type=token&client_id=MYCLIENTID&redirect_uri=http%3A%2F%2Flocalhost
侦听来接收来自Dropbox的回调。出于测试目的,我只接受TcpListener
并创建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};
是来自上方的请求uri。
现在文档说明此流程的示例响应可能是:
authUri
因此,在启动应用程序时,它会向我显示同意对话框。我输入凭据并点击"允许"。然后我的[REDIRECT_URI]#access_token=ABCDEFG&token_type=bearer&uid=12345&state=[STATE]
开始接受新客户。在调试器中,我现在进入listener
块并读取每行的流线以检查返回的内容
我希望using
之类的内容可以作为第一行的内容,但实际上我得到了GET /#access_token....
。以下行仅包含一些没有任何重要信息的标题。
之后我尝试了GET / HTTP1.1
流程,如果这确实有效的话。没问题。我获得了身份验证代码并使用必要的参数调用code
并获取所需的身份验证令牌。这个流程的唯一问题是我必须提供我的应用程序秘密,并且从我对应用程序秘密的了解是它永远不应该在客户端应用程序中运行,以防止它被泄露。
我真的无法弄清楚为什么我无法在隐式流程中获得令牌,所以也许你们中的任何人都可以帮助我解决这个问题。我故意不使用任何第三方库来提高自己的技能。请注意,我没有在代码示例中进行任何错误检查,因为它仅用于测试目的。
答案 0 :(得分:2)
在隐式流中,访问令牌是URL片段(哈希后的部分)的一部分。 URL片段不会发送到服务器。
顺便说一句,你可以看看https://blogs.dropbox.com/developers/2014/04/dropbox-authorization-in-a-windows-forms-app/。如果您正在嵌入WebBrowser
控件,则根本不需要重定向到localhost
,除了更容易之外,这是一个潜在的安全获胜。