如何在 Dropbox API v2 中创建不过期令牌?

问题描述 投票:0回答:3

正如标题所说,最近 Dropbox API 改版后,Token 开始有过期时间了..

以前如果我不撤销的话,Token是可以永久使用的。 也许出于安全原因添加了过期时间。

但是,这对于我的申请来说非常不方便。我需要上传文件很长时间(可能一次超过一个月)。

按照目前的API,我只能反复刷新token来保证token不会过期...

有谁知道是否还有办法在当前的 Dropbox API 中创建一组不会过期的令牌?

video dropbox-api
3个回答
5
投票

这就是获取刷新令牌所需要做的一切,代码片段位于

C#

第 1 步:访问以下 URL 并完成步骤。在最后一步中,您应该看到屏幕上打印

Access Code Generated
,复制代码。

https://www.dropbox.com/oauth2/authorize?client_id=YOUR_APP_KEY&response_type=code&token_access_type=offline

第 2 步:使用以下代码获取刷新令牌:(注意:您只需执行一次

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.dropbox.com/oauth2/token"))
    {
        var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("YOUR_APP_KEY:YOUR_APP_SECRET"));
        request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}"); 

        var contentList = new List<string>();
        contentList.Add("code=ACCESS_CODE_FROM_STEP_1");
        contentList.Add("grant_type=authorization_code");
        request.Content = new StringContent(string.Join("&", contentList));
        request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); 

        var response = await httpClient.SendAsync(request);
        // process the response
    }
}

响应应该是这样的:

{
    "uid": "XXXXXXXX",
    "access_token": "XXXXXXXX",
    "expires_in": 14400,
    "token_type": "bearer",
    "scope": "files.content.read files.content.write",
    "refresh_token": "XXXXXXXX",
    "account_id": "dbid:XXXXXXXX"
}

您正在寻找

refresh_token
您应该安全地存放它

第 3 步:每当您需要新的访问令牌时,请运行以下代码:

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("POST"), $"https://api.dropbox.com/oauth2/token"))
    {
        var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("YOUR_APP_KEY:YOUR_APP_SECRET"));
        request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

        var contentList = new List<string>();
        contentList.Add("refresh_token=REFRESH_TOEKN");
        contentList.Add("grant_type=refresh_token");
        request.Content = new StringContent(string.Join("&", contentList));
        request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");

        var res = httpClient.SendAsync(request).Result;
        // process the response
    }
}

响应应该是这样的:

{
    "access_token": "XXXXXXXX",
    "token_type": "bearer",
    "expires_in": 14400
}

您正在寻找

access_token
。并且还要注意
expires_in
值,您可以并且可能应该将
access_token
存储在某种内存缓存中,以防止在每次 API 调用时请求新令牌。


这是获取新刷新令牌的

curl

curl https://api.dropbox.com/oauth2/token -d grant_type=refresh_token -d refresh_token=<REFRESH_TOKEN> -u <APP_KEY>:<APP_SECRET>

4
投票

Dropbox 正在切换为仅发行短期访问令牌(和可选的刷新令牌),而不是长期访问令牌。您可以在此处找到有关此迁移的更多信息

应用程序仍然可以通过请求“离线”访问来获得长期访问权限,在这种情况下,应用程序会收到一个“刷新令牌”,可用于根据需要检索新的短期访问令牌,而无需进一步的手动用户干预。您可以在OAuth 指南授权文档中找到更多信息。

仅供参考,虽然现在已弃用创建新的长期访问令牌,但我们目前没有计划禁用现有的长期访问令牌。 (如果情况发生变化,我们当然会提前宣布。)在这种情况下,您可以继续使用现有的长期访问令牌而不会中断(如果有的话)。另请注意,更改后您将无法创建新的长期访问令牌。

虽然更改于 2021 年 9 月 30 日开始,但我们正在逐步发布它,因此直到现在您可能还没有看到您的应用受到影响。一旦它应用于您的应用程序,无论您的应用程序的“访问令牌过期”设置如何,它都会适用,并且该设置可能不再适用于您的应用程序。


0
投票

我为此创建了一个 GitHub 存储库来处理这个问题。 https://github.com/FranklinThaker/Dropbox-API-Uninterrupted-Access

如果我在此存储库中遗漏了某些内容或需要修复某些内容,请告诉我。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.