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,这除了更容易一点之外,还可能是安全方面的胜利。