Я ищу хорошую стратегию для получения нового токена доступа с использованием токена обновления, который хранится в appsettings.json. Новый токен доступа необходимо запрашивать, когда текущий запрос возвращает ошибки 403 или 401. Когда новый токен доступа и обновления получен, файл appsettings.json необходимо обновить новыми значениями, чтобы его можно было использовать в последующих запросах.
Я использую двух клиентов для отправки запросов к двум разным API, но только один из них использует механизм аутентификации токена.
Я реализовал что-то простое, что работает, но я я ищу более элегантное решение, которое может динамически обновлять заголовок по истечении срока действия текущего токена:
Я зарегистрировал IHttpClientFactory в методе Startup.ConfigureServices следующим образом:
Код: Выделить всё
services.AddHttpClient();
Код: Выделить всё
public async Task GetInformationAsync(AirCallModel model)
{
try
{
CandidateResults modelCandidateResult = null;
var request = new HttpRequestMessage(HttpMethod.Get,
"https://*******/v2/*****");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _appSettings.Value.Token);
var clientJAAPI = _httpClientFactory.CreateClient();
var responseclientJAAPI = await clientJAAPI.SendAsync(request);
if (responseclientJAAPI.IsSuccessStatusCode)
{
modelCandidateResult = await responseclientJAAPI.Content
.ReadAsAsync();
....
}
if ((responseclientJAAPI .StatusCode.ToString() == "Unauthorized")
{
await RefreshAccessToken();
//Calls recursively this method again
return await GetInformationAsync(model);
}
return null;
}
catch (Exception e)
{
return null;
}
}
Код: Выделить всё
private async Task RefreshAccessToken()
{
var valuesRequest = new List();
valuesRequest.Add(new KeyValuePair("client_id", "*****"));
valuesRequest.Add(new KeyValuePair("client_secret","****"));
valuesRequest.Add(new KeyValuePair("grant_type", "refresh_token"));
valuesRequest.Add(new KeyValuePair("refresh_token", "*****"));
RefreshTokenResponse refreshTokenResponse = null;
var request = new HttpRequestMessage(HttpMethod.Post,
"https://*****/connect/token");
request.Content = new FormUrlEncodedContent(valuesRequest);
var clientJAAPI = _httpClientFactory.CreateClient();
var responseclientJAAPI = await clientJAAPI.SendAsync(request);
if (responseclientJAAPI.IsSuccessStatusCode)
{
refreshTokenResponse = await responseclientJAAPI.Content.ReadAsAsync();
//this updates the POCO object representing the configuration but not the appsettings.json :
_appSettings.Value.Token = refreshTokenResponse.access_token;
}
}
Если предложенное решение требует определения основных настроек Httpclient в Startup.ConfigureService, оно должно разрешить создание различных экземпляров HttpClien, поскольку один из экземпляров HttpClient (используется в другом методе для вызова второго API) не требует токена для отправки запросов.>