6.61实现自动刷新授权 Token

创建于 2026 年 8 月 17 日约 1 分钟读完

在与第三方 API 接口对接时,通常需要在请求头中携带授权 Token。由于 Token 具有时效性,开发者需要定期刷新 Token。以下示例展示了如何通过 DelegatingHandler 实现自动刷新 Token 的逻辑。当响应返回 401 状态码时,系统会自动重新获取授权 Token 并更新请求头。

cs
public class AuthorizationDelegatingHandler : DelegatingHandler{    protected override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken)    {        // 参考 SendAsync 代码        return base.Send(request, cancellationToken);    }    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,        CancellationToken cancellationToken)    {        // 克隆原始请求(解决 StreamContent 只能读取一次的问题)        var clonedRequest = await request.CloneAsync(cancellationToken);        // 首次发送请求        var response = await base.SendAsync(clonedRequest, cancellationToken);        // 检测 401 状态码        if (response.StatusCode != HttpStatusCode.Unauthorized)        {            return response;        }        // 刷新 Token        var newToken = await GetNewTokenAsync(); // 实现获取新 Token 的逻辑        // 重新克隆请求并添加新 Token        clonedRequest = await clonedRequest.CloneAsync(cancellationToken);        clonedRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", newToken);        // 重试请求        response = await base.SendAsync(clonedRequest, cancellationToken);        return response;    }    private async Task<string> GetNewTokenAsync()    {        // 这里实现获取新 Token 的逻辑        // 例如:调用身份认证服务获取新的 Token        return "newToken";    }}

接下来,在 Program.csStartup.cs 文件中注册 AuthorizationDelegatingHandler

csharp
// 注册 AuthorizationDelegatingHandler 为服务services.TryAddSingleton<AuthorizationDelegatingHandler>();// 为默认 HttpClient 客户端启用 AuthorizationDelegatingHandlerservices.AddHttpClient()    .AddHttpMessageHandler<AuthorizationDelegatingHandler>();// 若为特定命名的 HttpClient 客户端启用,可如下配置// services.AddHttpClient("weixin")//     .AddHttpMessageHandler<AuthorizationDelegatingHandler>();

通过上述代码,我们实现了一个自动刷新 Token 的机制。当 Token 过期时,系统会自动获取新的 Token 并重试请求,从而确保与第三方 API 的持续有效通信。