如何在C#中通过编程获取Dropbox访问令牌(.NET Core Web API场景)
在.NET Core Web API中程序化获取Dropbox访问令牌
要实现程序化获取Dropbox访问令牌,需遵循Dropbox的OAuth 2.0授权码流程,以下是具体实现步骤和代码示例:
前置准备
- 前往Dropbox开发者控制台创建应用,选择「Scoped access」类型。
- 配置应用需要的权限(如
files.content.write、files.content.read,根据文件上传需求选择)。 - 设置重定向URI(例如
https://your-api-domain.com/api/dropbox/callback),用于接收Dropbox返回的授权码。 - 获取应用的
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
相关产品推荐
相关产品推荐

