前言
在《ASP.NET Core 自動刷新JWT Token》中我們實現了為客戶端自動提供最新的Token。
但是,當我們的 ASP.NET Core 應用需要調用第三方 API 時,如何更優雅地刷新第三方提供的 Token 呢?
思路
我們可以在啟動時就獲取第三方提供的 Token 并保存到全局變量,然后在 Token 過期時間內定時獲取第三方最新的 Token 并更新全局變量。
這樣每次調用 HttpClient 訪問第三方 API 時,都是使用的準備好的 Token, 保證沒有過期。
實現
創建一個后臺服務 BackgroundService,然后在其 ExecuteAsync 方法中創建一個定時器 PeriodicTimer,定時刷新 Token:
public?class?RefreshTokenService?:?BackgroundService,?IDisposable
{private?readonly?ITokenManager?tokenManager;public?RefreshTokenService(ITokenManager?tokenManager){this.tokenManager?=?tokenManager;}protected?async?override?Task?ExecuteAsync(CancellationToken?stoppingToken){tokenManager.Token?=?await?GetToken();//30?分鐘刷新一次var?timer?=?new?PeriodicTimer(TimeSpan.FromMinutes(30));while?(await?timer.WaitForNextTickAsync(stoppingToken)){tokenManager.Token?=?await?GetToken();}}private?async?Task<string>??GetToken(){//調用第三方服務獲取Token}
}
接口ITokenManager
定義如下,用于存儲 Token:
public?interface?ITokenManager
{string?Token?{?get;?set;?}
}
最后,我們在啟動時進行依賴注入:
builder.Services.AddSingleton<ITokenManager,TokenManager>();builder.Services.AddHostedService<RefreshTokenService>();
結論
現在,任何注入ITokenManager
的類,都能始終獲得有效的 Token 了。
添加微信號【MyIO666】,邀你加入技術交流群