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

如何在C#中通过编程获取Dropbox访问令牌(.NET Core Web API场景)

在.NET Core Web API中程序化获取Dropbox访问令牌

要实现程序化获取Dropbox访问令牌,需遵循Dropbox的OAuth 2.0授权码流程,以下是具体实现步骤和代码示例:

前置准备

  1. 前往Dropbox开发者控制台创建应用,选择「Scoped access」类型。
  2. 配置应用需要的权限(如files.content.write、files.content.read,根据文件上传需求选择)。
  3. 设置重定向URI(例如https://your-api-domain.com/api/dropbox/callback),用于接收Dropbox返回的授权码。
  4. 获取应用的App Key和App Secret,后续代码中会用到。

1. 生成授权跳转URL

提供一个API接口生成Dropbox授权页面的URL,引导用户登录并授权你的应用:

using Microsoft.AspNetCore.Mvc;
using System;

[ApiController]
[Route("api/dropbox")]
public class DropboxController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public DropboxController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet("auth-url")]
    public IActionResult GetAuthorizationUrl()
    {
        var appKey = _configuration["Dropbox:AppKey"];
        var redirectUri = _configuration["Dropbox:RedirectUri"];
        var scope = "files.content.write files.content.read"; // 按需调整权限
        var state = Guid.NewGuid().ToString();

        // 建议将state存入缓存(如Redis),用于回调时验证CSRF
        // _cache.SetString("DropboxState", state, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) });

        var authUrl = $"https://www.dropbox.com/oauth2/authorize?client_id={appKey}&response_type=code&redirect_uri={Uri.EscapeDataString(redirectUri)}&scope={Uri.EscapeDataString(scope)}&state={state}";

        return Ok(new { AuthorizationUrl = authUrl });
    }
}

2. 回调接口交换访问令牌

用户授权后,Dropbox会重定向到你配置的回调地址,并携带code和state参数,通过这个接口将授权码交换为访问令牌:

using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

[HttpGet("callback")]
public async Task<IActionResult> AuthorizationCallback(string code, string state)
{
    // 验证state,防止CSRF攻击
    // var savedState = _cache.GetString("DropboxState");
    // if (savedState != state) return BadRequest("无效的state参数");

    var appKey = _configuration["Dropbox:AppKey"];
    var appSecret = _configuration["Dropbox:AppSecret"];
    var redirectUri = _configuration["Dropbox:RedirectUri"];

    using var client = new HttpClient();
    var requestContent = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("code", code),
        new KeyValuePair<string, string>("grant_type", "authorization_code"),
        new KeyValuePair<string, string>("client_id", appKey),
        new KeyValuePair<string, string>("client_secret", appSecret),
        new KeyValuePair<string, string>("redirect_uri", redirectUri)
    });

    var response = await client.PostAsync("https://api.dropboxapi.com/oauth2/token", requestContent);
    response.EnsureSuccessStatusCode();

    var tokenResponse = await response.Content.ReadFromJsonAsync<DropboxTokenResponse>();

    // 将access_token和refresh_token安全存储(如加密后存入数据库),供后续文件上传使用
    return Ok(new 
    { 
        AccessToken = tokenResponse.AccessToken, 
        RefreshToken = tokenResponse.RefreshToken,
        ExpiresIn = tokenResponse.ExpiresIn
    });
}

// 令牌响应模型
public class DropboxTokenResponse
{
    [JsonPropertyName("access_token")]
    public string AccessToken { get; set; }

    [JsonPropertyName("token_type")]
    public string TokenType { get; set; }

    [JsonPropertyName("expires_in")]
    public int ExpiresIn { get; set; }

    [JsonPropertyName("refresh_token")]
    public string RefreshToken { get; set; }

    [JsonPropertyName("scope")]
    public string Scope { get; set; }
}

3. 刷新过期的访问令牌

Dropbox的access_token会过期(默认14天),可以用refresh_token获取新的access_token,无需用户再次授权:

public async Task<string> RefreshAccessToken(string refreshToken)
{
    var appKey = _configuration["Dropbox:AppKey"];
    var appSecret = _configuration["Dropbox:AppSecret"];

    using var client = new HttpClient();
    var requestContent = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("refresh_token", refreshToken),
        new KeyValuePair<string, string>("grant_type", "refresh_token"),
        new KeyValuePair<string, string>("client_id", appKey),
        new KeyValuePair<string, string>("client_secret", appSecret)
    });

    var response = await client.PostAsync("https://api.dropboxapi.com/oauth2/token", requestContent);
    response.EnsureSuccessStatusCode();

    var tokenResponse = await response.Content.ReadFromJsonAsync<DropboxTokenResponse>();
    return tokenResponse.AccessToken;
}

注意事项

  • 不要硬编码App Key和App Secret,建议通过appsettings.json配置并使用IConfiguration读取。
  • 务必验证state参数,避免CSRF攻击。
  • 根据实际业务需求选择最小必要的权限范围,遵循权限最小化原则。
  • refresh_token是长期有效的(除非用户主动撤销授权),需加密后安全存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:24:54