Как назначить токен OAuth моему HttpClient с помощью .Net Core 2.2 AddHttpClient?

Я пишу приложение Asp.Net Core 2.2, в которое добавляю HttpClient.

        services.AddAuthentication(o => {
            o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
            .AddQuickbooksOnline(o => {
                o.ClientId = Configuration["ecm.qbo.client-id"];
                o.ClientSecret = Configuration["ecm.qbo.client-secret"];
                o.Scope.Add(QuickbooksOnlineScopes.Accounting);
            });

        services.AddHttpClient("qbo", c => {
            c.BaseAddress = new Uri("https://sandbox-quickbooks.api.intuit.com");
            c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            c.DefaultRequestHeaders.Add("content-type", "application/json");
            c.DefaultRequestHeaders.Authorization=// How do I get the token to be assigned here?
        });

        service.AddScoped<IInventoryService, QboInventoryService>();

Итак, в основном я написал себе расширение, которое позволяет мне использовать аутентификацию AddQuickbooksOnline с минимальной конфигурацией, так как многие конфигурации выполняются расширением по умолчанию.

После регистрации и аутентификации в моем приложении я показываю кнопку GetProducts для аутентифицированного пользователя.

Я хочу, чтобы эта кнопка вызывала мой ProductController.

public class ProductController : ControllerBase {
    private readonly IInventoryService _inventoryService;
    public ProductController(IInventoryService inventoryService) {
        _inventoryService=inventoryService??throw new ArgumentNullException(nameof(inventoryService));
    }

    public async Task<IEnumerable<Product>> Get() {
        var products=await _inventoryService.GetAllProducts();
        return products;
    }
}

И служба на самом деле зависит от настроенного HttpClient, который я хочу добавить в конфигурацию своих служб.

public class QboInventoryService : IInventoryService {
    private readonly IHttpClientFactory _clientFactory;
    private readonly IConfiguration _config;
    public QboInventoryService(IHttpClientFactory clientFactory, IConfiguration config) {
        _clientFactory=clientFactory??throw new ArgumentNullException(nameof(clientFactory));
        _config=config??throw new ArgumentNullException(nameof(config));
    }

    public async Task<IEnumerable<Product>> GetAllProducts() {
        IEnumerable<Product> products=new List<Product>();

        var client=_clientFactory.CreateClient("qbo");
        var response=await client.GetAsync(config["qbo.products.query"]);

        if(response.IsSuccessStatusCode) {
            var content=await response.Content.ReadAsStringAsync();
            products=JsonConvert.DeserializeObject<IEnumerable<Product>>(content);
        }

        return products;
    }
}

Итак, чтобы сделать вызов QBO WebAPI, мне нужно предоставить токен OAuth аутентифицированного пользователя создаваемому HttpClient.


person Will Marcouiller    schedule 11.06.2019    source источник
comment
Нулевая проверка не требуется в ваших конструкторах - инфраструктура DI автоматически выдаст исключение, если инъекция не может быть удовлетворена ;-)   -  person Robert Perry    schedule 15.06.2019
comment
Кроме того, в чем собственно заключается ваш вопрос? Не ясно   -  person Robert Perry    schedule 15.06.2019
comment
@RobertPerry, спасибо за внимание. Если вы посмотрите на первый пример кода, на строку, где вызывается services.AddHttpClient, посмотрите на инициализацию. c.DefaultRequestHeaders.Authorization=??? Вы видите мой вопрос там, когда внимательно искали.   -  person Will Marcouiller    schedule 15.06.2019
comment
@RuardvanElburg, ты абсолютно прав! Это именно то, что я хотел. Спасибо, что указали мне на ответ. :)   -  person Will Marcouiller    schedule 19.06.2019