Как обновить токен с помощью IHttpClientFactoryC#

Место общения программистов C#
Anonymous
Как обновить токен с помощью IHttpClientFactory

Сообщение Anonymous »

Я использую IHttpClientFactory для отправки запросов и получения HTTP-ответов от двух внешних API с использованием Net Core 2.2.

Я ищу хорошую стратегию для получения нового токена доступа с использованием токена обновления, который хранится в appsettings.json. Новый токен доступа необходимо запрашивать, когда текущий запрос возвращает ошибки 403 или 401. Когда новый токен доступа и обновления получен, файл appsettings.json необходимо обновить новыми значениями, чтобы его можно было использовать в последующих запросах.

Я использую двух клиентов для отправки запросов к двум разным API, но только один из них использует механизм аутентификации токена.

Я реализовал что-то простое, что работает, но я я ищу более элегантное решение, которое может динамически обновлять заголовок по истечении срока действия текущего токена:

Я зарегистрировал IHttpClientFactory в методе Startup.ConfigureServices следующим образом:

Код: Выделить всё

services.AddHttpClient();
После регистрации я использую его двумя разными методами для вызова двух разных API, первый метод:

Код: Выделить всё

   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;

}

}
Обратите внимание, что я обновляю объект POCO, представляющий конфигурацию, но не файл appsettings.json, поэтому новые значения сохраняются в памяти. Я хочу обновить файл appsettings.json для последующих запросов.

Если предложенное решение требует определения основных настроек Httpclient в Startup.ConfigureService, оно должно разрешить создание различных экземпляров HttpClien, поскольку один из экземпляров HttpClient (используется в другом методе для вызова второго API) не требует токена для отправки запросов.>

Вернуться в «C#»