Dropbox API 令牌流 - 没有令牌响应
Dropbox API Token flow - no token in response
我正在尝试在我当前的 C# 应用程序中使用 Dropbox API。
目前我正在为 OAuth2 身份验证(隐式流程)而苦苦挣扎。
首先,我选择了隐式流程,因为我开发了一个纯 client-side 应用程序,并且关于 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()) != "") { }
}
对于同意对话框,我刚刚创建了一个 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]
因此,当启动应用程序时,它会向我显示同意对话框。我输入我的凭据并单击 "Allow"。然后我的 listener
启动并接受一个新客户。在调试器中,我现在进入 using
块并读取每行的流线以检查返回的内容。
我希望像 GET /#access_token....
这样的内容作为第一行的内容,但实际上我得到了 GET / HTTP1.1
。以下几行只包含一些headers,没有任何重要信息。
之后我尝试了 code
流程,如果这真的有效的话。完全没有问题。我获得身份验证代码并使用必要的参数调用 /token
并获得所需的身份验证令牌。此流程的唯一问题是我必须提供我的应用程序机密,据我所知,该应用程序机密永远不应该在客户端应用程序中,而不是 运行 在您自己的服务器上,以防止它被泄露。
我真的不明白为什么我无法在隐式流中获取令牌,所以也许你们中的任何人都可以帮助我解决这个问题。我故意不使用任何 third-party 库来提高我自己的技能。请不要介意我没有在代码示例中进行任何错误检查,因为它仅用于测试目的。
在隐式流程中,访问令牌是 URL 片段的一部分(散列之后的部分)。 URL 片段未发送到服务器。
顺便说一句,你可以看看https://blogs.dropbox.com/developers/2014/04/dropbox-authorization-in-a-windows-forms-app/。如果您无论如何要嵌入 WebBrowser
控件,则根本不需要重定向到 localhost
,这除了更容易一点之外,还可能是安全方面的胜利。
我正在尝试在我当前的 C# 应用程序中使用 Dropbox API。
目前我正在为 OAuth2 身份验证(隐式流程)而苦苦挣扎。
首先,我选择了隐式流程,因为我开发了一个纯 client-side 应用程序,并且关于 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()) != "") { }
}
对于同意对话框,我刚刚创建了一个 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]
因此,当启动应用程序时,它会向我显示同意对话框。我输入我的凭据并单击 "Allow"。然后我的 listener
启动并接受一个新客户。在调试器中,我现在进入 using
块并读取每行的流线以检查返回的内容。
我希望像 GET /#access_token....
这样的内容作为第一行的内容,但实际上我得到了 GET / HTTP1.1
。以下几行只包含一些headers,没有任何重要信息。
之后我尝试了 code
流程,如果这真的有效的话。完全没有问题。我获得身份验证代码并使用必要的参数调用 /token
并获得所需的身份验证令牌。此流程的唯一问题是我必须提供我的应用程序机密,据我所知,该应用程序机密永远不应该在客户端应用程序中,而不是 运行 在您自己的服务器上,以防止它被泄露。
我真的不明白为什么我无法在隐式流中获取令牌,所以也许你们中的任何人都可以帮助我解决这个问题。我故意不使用任何 third-party 库来提高我自己的技能。请不要介意我没有在代码示例中进行任何错误检查,因为它仅用于测试目的。
在隐式流程中,访问令牌是 URL 片段的一部分(散列之后的部分)。 URL 片段未发送到服务器。
顺便说一句,你可以看看https://blogs.dropbox.com/developers/2014/04/dropbox-authorization-in-a-windows-forms-app/。如果您无论如何要嵌入 WebBrowser
控件,则根本不需要重定向到 localhost
,这除了更容易一点之外,还可能是安全方面的胜利。