Внедрение зависимостей - HttpClient и OAuth2 - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю библиотеку классов (. NET Standard 2), где мне нужно передать HttpClient в конструктор (Dependency Injection).

Библиотека классов вызывает сторонний API, используя OAuth2 (она запрашивает их API - с ClientID и ClientSecret - и возвращает токен, который я собираюсь использовать для последующих вызовов).

У меня есть некоторые проблемы с выяснением того, как сделать OAuth2 «вещи» с инжекцией зависимостей.

В проекте, в котором я использую библиотеку классов, устанавливается зависимость в классе StartUp, например : Services.AddHttpClient ()

Можно ли каким-либо образом прикрепить «материал» OAuth2 к HttpClient?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

То, что вы могли бы сделать, это использовать DelegatingHandler:

interface IOAuth2Stuff
{
    string Token { get; set; }
}

class OAuth2StuffRequestHandler : DelegatingHandler, IOAuth2Stuff
{
    public string Token { get; set; }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // Add OAuth2 stuff to request
        var token = Token;

        return await base.SendAsync(request, cancellationToken);
    }
}

Сконфигурировать ваши услуги:

services.AddSingleton<OAuth2StuffRequestHandler>();
services.AddSingleton<IOAuth2Stuff>(provider => 
    provider.GetRequiredService<OAuth2StuffRequestHandler>());
services.AddHttpClient("ServiceHttpClient")
    .AddHttpMessageHandler<OAuth2StuffRequestHandler>();

А в вашем классе обслуживания:

class Service
{
    public Service(IHttpClientFactory clientFactory, IOAuth2Stuff oauth2)
    {
        var client = clientFactory.CreateClient("ServiceHttpClient");
        // Do oauth2

        // Set oauth2 token to request handler.
        oauth2.Token = "blah blah";
    }
}

Обратите внимание, что срок службы промежуточного ПО в этом примере не идеален.

0 голосов
/ 01 апреля 2020

Один из способов добиться этого - использовать DelegatingHandler, который можно добавить в HTTP-клиент.

Этот ответ - { ссылка } - описывает добавление обработчика сообщений в извлеченный экземпляр HttpClient. из HttpClientFactory.

Внутри класса AuthenticationDelegatingHandler он вызывает GetToken -> что-то, что вам нужно предоставить, чтобы позаботиться о получении / кэшировании / обновлении токена, используйте один из предварительно собранных nuget пакеты, которые могут сделать это для вас. (т.е. https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/ или эквивалент)

...