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

Вопрос или проблема

В моем приложении Blazor WASM я получаю 401 -Unauthorized статус-код, когда вызываю свой бэкенд API, используя следующий код. Как я могу проверить, что действительный access_token прикрепляется к моим вызовам API?

Вот код Program.cs:

builder.Services.AddHttpClient("MyApiClient",
        client => client.BaseAddress = new Uri("https://api.test.com"))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("MyApiClient"));

И в своем сервисе я выполняю вызов API с помощью этого кода:

public async Task<User> GetUser()
{
   // Установить URL
   var url = "/account/info";
   var user = await GetAsync<User>(url);
   return user;
}

private async Task<T> GetAsync<T>(string url)
{
    if (string.IsNullOrWhiteSpace(url))
        return default;

    using (var client = _httpClientFactory.CreateClient("MyApiClient"))
    {
        var result = await client.GetAsync(url);
        if (!result.IsSuccessStatusCode)
            throw new Exception("Мой вызов API GET не удался. URL: " + url);

        var json = await result.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(json);
    }
}

Вы видите что-то, что выглядит неправильно? Если нет, как я могу убедиться, что действительный access_token прикрепляется к моим вызовам API?

П.С. Я вижу, что HttpClient создается правильно, и BaseAddress корректен в сообщении об ошибке, которое я получаю. Сообщение об ошибке – это стандартная ошибка несанкционированного доступа. Я не вижу никаких дополнительных данных в сообщении об ошибке, кроме того, что url определенно правильный.

Я также хочу упомянуть, что я управляю идентификацией и токенами доступа через Azure AD B2C. Эта настройка кажется правильной, так как пользователь может успешно войти в систему, и идентификатор пользователя также правильный.

Ответ или решение

Ваша проблема с получением статуса 401 - Unauthorized при вызове API может быть связана с несколькими аспектами настройки вашего Blazor WASM приложения. Рассмотрим, как убедиться, что действительный access_token прикрепляется к вашим API вызовам, и какие шаги вы можете предпринять для диагностики и устранения неполадок.

1. Настройка HttpClient с использованием BaseAddressAuthorizationMessageHandler

Ваш код, связанный с настройкой HttpClient, выглядит хорошо на первый взгляд. Ваша конфигурация:

builder.Services.AddHttpClient("MyApiClient", 
        client => client.BaseAddress = new Uri("https://api.test.com"))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

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

2. Проверка получения токена

Убедитесь, что вы правильно получаете и сохраняете access_token в локальном хранилище или в контексте сессии. Следите за тем, чтобы токен обновлялся, если пользователь аутентифицировался повторно или когда чек на истечение срока действия токена проходит. Ниже приведен пример, как это можно сделать:

var token = await _tokenProvider.GetAccessTokenAsync();

Где _tokenProvider должен предоставлять вам актуальный токен для использования.

3. Использование BaseAddressAuthorizationMessageHandler

Этот обработчик сообщений должен автоматически добавлять Authorization заголовок с вашим access_token. Убедитесь, что ваш BaseAddressAuthorizationMessageHandler правильно реализован. Вот пример его реализации:

public class BaseAddressAuthorizationMessageHandler : DelegatingHandler
{
    private readonly ITokenProvider _tokenProvider; // Предполагается, что у вас есть реализация интерфейса для получения токена

    public BaseAddressAuthorizationMessageHandler(ITokenProvider tokenProvider)
    {
        _tokenProvider = tokenProvider;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var token = await _tokenProvider.GetAccessTokenAsync();
        if (!string.IsNullOrWhiteSpace(token))
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

4. Проверка правильности токена

Чтобы убедиться, что ваш токен корректно прикрепляется, вы можете использовать инструменты разработчика в вашем браузере во вкладке "Сеть". Проверьте, отправляется ли заголовок Authorization с токеном при вызове вашего API.

5. Обработка ошибок

Если токен не прикрепляется или API продолжает возвращать 401, проверьте сам токен на валидность с помощью инструментов, таких как jwt.io. Убедитесь, что токен не истек и что он подписан вашим идентификатором клиента.

Заключение

Проверка цепочки получения и использования access_token — ключевая часть устранения проблемы 401. Убедитесь, что обработчик сообщений правильно добавляет токен, и что сам токен действителен и не истек. Использование инструментов разработчика поможет вам увидеть, правильно ли формируется запрос и отправляется ли заголовок Authorization. Если вы выполните все предложенные шаги, это должно помочь вам диагностировать и устранить проблему с аутентификацией в вашем приложении Blazor WASM.

Оцените материал
Добавить комментарий

Капча загружается...