You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dropbox企业账户文件上传授权问题及C#代码求助

Dropbox令牌过期问题及代码排查咨询

我们有一款基于C# (.Net Framework 4.8)的桌面应用,原本使用静态Dropbox令牌向企业账户上传文件,用于多服务器的文件压缩上传。近期出现以下错误:

System.AggregateException: One or more errors occurred. --->
Dropbox.Api.AuthException: expired_access_token

了解到当前令牌有效期仅4小时,需要重新获取。应用处于Development状态,仅内部使用。现咨询两个问题:

  1. 是否可以获取无需频繁刷新的长期访问令牌?如果可以,如何获取?目前在Dropbox网站获取的令牌以sl_开头,属于短期令牌。
  2. 如果必须重新获取令牌,能否无需浏览器验证会话?

同时附上相关代码,请求排查问题:

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,令牌过期后无法自动更新;
  • 优化建议:
    1. 若使用永久令牌,直接替换现有短期令牌即可,无需修改代码;
    2. 若使用短期令牌,需实现令牌刷新机制:在每次请求前检查令牌有效期,过期时调用刷新接口获取新令牌,再初始化DropboxClient;
    3. UploadFile方法中循环创建DropboxClient实例会造成资源浪费,建议将实例复用,仅在令牌刷新时重新创建。

内容的提问来源于stack exchange,提问作者ErocM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:31