Вопрос или проблема
В моем приложении 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.