Где хранить токены доступа и обновления при использовании внешних API с помощью IHttpClientFactory.Net Core - PullRequest
0 голосов
/ 19 мая 2019

Я использую IHttpClientFactory для отправки запросов и получения HTTP-ответов от моего веб-API на внешние API-интерфейсы, использующие Net Core 2.2.

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

Но как я могу обновить appsettings.json новым доступом и обновить токен, чтобы использоватьэто для последующих запросов.

Есть ли гораздо лучший подход для хранения токенов доступа и обновления, чем appsettings.json?

Ответы [ 3 ]

2 голосов
/ 19 мая 2019

Гипотеза о том, что ваш клиентский веб-интерфейс автоматически подключается к вашим внешним API (а также автоматически запрашивает токены), вам не нужно хранить токены и обновлять токены.

Ваш веб-сервис должен хранить токены в памяти (в единичном блоке) и использовать их при необходимости.

Когда внешнему API требуется новый токен (например, после истечения срока действия токена), вам просто нужно запросить новый и обновить свой синглтон.

Мы используем этот способ работы для нескольких проектов иэто надежно.

1 голос
/ 20 мая 2019

Как правило, вы должны хранить токен в базе данных для постоянного сохранения EF Core или любым другим поставщиком данных.

Если вы настаиваете на сохранении в appsettings.json, вам необходимо реализовать пользовательскую функцию.

Для демонстрации установите флажок Ручной запуск IOptionsMonitor <>. OnChange

1 голос
/ 19 мая 2019

Поскольку вы используете IHttpClinetFactory (и при условии, что вы также используете Typed Client ), вы можете создать свой собственный HttpMessageHandler , который будет запускаться до любого запроса, сделанного вашимTyped Client и свяжите его с вашим typed client через DI следующим образом:

services.AddHttpClient<IServiceContract, ServiceImplementation>()
                .AddHttpMessageHandler<TokenHandler>();

Внутри этого TokenHandler вы можете проверить, есть ли в запросе токен в заголовках или нет.Если не проверять кэш (Memory Cache) на наличие доступных токенов, то проверьте время жизни токена.

Если токен истек или в кэше нет такого токена, введите новый токен и сохраните его.в кеше.

Я уверен, что есть лучшие способы, но я бы так и сделал.


Примечание: Если ваше приложение распределено по нескольким серверамзатем используйте Distributed Cache вместо Memory Cache .Вы можете добавить любой легко через DI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...