如何在Dropbox API v2中创建未过期的令牌



正如标题所说,在最近对Dropbox API进行修订后,代币开始有一个到期时间。。

在过去,如果我不撤销,代币可以永久使用。可能是出于安全原因添加了过期时间。

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

根据目前的API,我只能重复刷新令牌,以保持令牌不过期。。。

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

Dropbox正在切换到只发布短寿命访问令牌(以及可选的刷新令牌(,而不是长寿命访问令牌。您可以在此处找到有关此迁移的更多信息。

应用程序仍然可以通过请求";脱机";在这种情况下;刷新令牌";可用于根据需要检索新的短寿命访问令牌,而无需进一步的手动用户干预。您可以在OAuth指南和授权文档中找到更多信息。

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

虽然更改始于2021年9月30日,但我们正在逐步发布,因此您可能直到现在才看到您的应用程序受到影响。一旦它应用于你的应用程序,它就会应用,而不管";访问令牌到期";设置,而该设置可能不再适用于您的应用。

以下是获取刷新令牌所需的全部操作,代码片段位于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>

最新更新