正如标题所说,最近 Dropbox API 改版后,Token 开始有过期时间了..
以前如果我不撤销的话,Token是可以永久使用的。 也许出于安全原因添加了过期时间。
但是,这对于我的申请来说非常不方便。我需要上传文件很长时间(可能一次超过一个月)。
按照目前的API,我只能反复刷新token来保证token不会过期...
有谁知道是否还有办法在当前的 Dropbox API 中创建一组不会过期的令牌?
这就是获取刷新令牌所需要做的一切,代码片段位于
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>
Dropbox 正在切换为仅发行短期访问令牌(和可选的刷新令牌),而不是长期访问令牌。您可以在此处找到有关此迁移的更多信息。
应用程序仍然可以通过请求“离线”访问来获得长期访问权限,在这种情况下,应用程序会收到一个“刷新令牌”,可用于根据需要检索新的短期访问令牌,而无需进一步的手动用户干预。您可以在OAuth 指南和授权文档中找到更多信息。
仅供参考,虽然现在已弃用创建新的长期访问令牌,但我们目前没有计划禁用现有的长期访问令牌。 (如果情况发生变化,我们当然会提前宣布。)在这种情况下,您可以继续使用现有的长期访问令牌而不会中断(如果有的话)。另请注意,更改后您将无法创建新的长期访问令牌。
虽然更改于 2021 年 9 月 30 日开始,但我们正在逐步发布它,因此直到现在您可能还没有看到您的应用受到影响。一旦它应用于您的应用程序,无论您的应用程序的“访问令牌过期”设置如何,它都会适用,并且该设置可能不再适用于您的应用程序。
我为此创建了一个 GitHub 存储库来处理这个问题。 https://github.com/FranklinThaker/Dropbox-API-Uninterrupted-Access
如果我在此存储库中遗漏了某些内容或需要修复某些内容,请告诉我。谢谢。