Dropbox企业账户文件上传授权问题及C#代码求助
Dropbox令牌过期问题及代码排查咨询
我们有一款基于C# (.Net Framework 4.8)的桌面应用,原本使用静态Dropbox令牌向企业账户上传文件,用于多服务器的文件压缩上传。近期出现以下错误:
System.AggregateException: One or more errors occurred. --->
Dropbox.Api.AuthException: expired_access_token
了解到当前令牌有效期仅4小时,需要重新获取。应用处于Development状态,仅内部使用。现咨询两个问题:
- 是否可以获取无需频繁刷新的长期访问令牌?如果可以,如何获取?目前在Dropbox网站获取的令牌以
sl_开头,属于短期令牌。 - 如果必须重新获取令牌,能否无需浏览器验证会话?
同时附上相关代码,请求排查问题:
private async Task<int> UploadFile() { var newargs = _appParms.Reverse().Take(_appParms.Length - 2).Reverse().ToList(); foreach (var newarg in newargs) { if (!File.Exists(_appParms[2])) { Console.WriteLine($"File does not exist: {newarg}"); continue; } var filename = Path.GetFileName(newarg); var client = CreateDropBoxInstance(); var path = $"/{_appParms[1]}"; await CreateFolder(client, path); var list = await ListFolder(client, path); var firstFile = list.Entries.FirstOrDefault(i => i.IsFile && i.Name == filename); if (firstFile != null) { Console.WriteLine("File already exists on server, failed to upload."); Console.WriteLine("Change the upload folder or file name and try again."); return (int)Enums.ReturnCode.FailFileAlreadyExists; } await ChunkUpload2(client, path, newarg); } return (int)Enums.ReturnCode.Success; } private static DropboxClient CreateDropBoxInstance() { // Specify socket level timeout which decides maximum waiting time when no bytes are // received by the socket. var httpClient = new HttpClient(new WebRequestHandler { ReadWriteTimeout = 10 * 1000 }) { // Specify request level timeout which decides maximum time that can be spent on // download/upload files. Timeout = TimeSpan.FromMinutes(20) }; try { var config = new DropboxClientConfig("DropBoxBackup") { HttpClient = httpClient }; return new DropboxClient(AccessToken, config); } catch (HttpException e) { Console.WriteLine("Exception reported from RPC layer"); Console.WriteLine(" Status code: {0}", e.StatusCode); Console.WriteLine(" Message : {0}", e.Message); if (e.RequestUri != null) { Console.WriteLine(" Request uri: {0}", e.RequestUri); } return null; } }
问题解答
1. 长期访问令牌获取方式
对于企业账户且仅内部使用的开发状态应用,可以获取永久访问令牌:
- 登录Dropbox开发者控制台,找到你的应用;
- 在"Permissions"页面确保已添加所需的文件读写权限(如
files.content.write); - 切换到"Settings"页面,在"OAuth 2"部分,选择"Access token expiration"为"No expiration";
- 重新生成访问令牌,此时得到的令牌以
sl_开头但为永久有效(仅企业账户的内部应用支持此设置,公开应用无法启用)。
2. 无浏览器验证的令牌刷新方式
如果必须使用短期令牌,可采用密码授权流(Password Grant),仅适用于Dropbox Business账户的内部应用:
- 确保应用在开发者控制台中设置为"Team-only";
- 使用Dropbox API的
/oauth2/token端点,通过企业账户的用户名、密码以及应用的client_id和client_secret直接请求令牌,无需浏览器交互; - 注意:此方式仅允许内部使用,需妥善保管账户凭证,避免泄露。
代码问题排查
从提供的代码来看,核心问题在于使用静态短期令牌未实现自动刷新逻辑:
- 当前
CreateDropBoxInstance方法直接传入静态AccessToken,令牌过期后无法自动更新; - 优化建议:
- 若使用永久令牌,直接替换现有短期令牌即可,无需修改代码;
- 若使用短期令牌,需实现令牌刷新机制:在每次请求前检查令牌有效期,过期时调用刷新接口获取新令牌,再初始化
DropboxClient; UploadFile方法中循环创建DropboxClient实例会造成资源浪费,建议将实例复用,仅在令牌刷新时重新创建。
内容的提问来源于stack exchange,提问作者ErocM
相关产品推荐
相关产品推荐

