/
va1eriy
/
taskwards
Обзор
Документация
Войти
/
va1eriy
/
taskwards
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Taskwards.Web/Infrastructure/Auth/AuthService.cs
120 строк
4 KB
Valeriy Kokorev
feat: add automatic token refresh with AuthDelegatingHandler
27 фев 2026, 08:52
27 фев 2026, 08:52
afe7bb4
Код
Авторство
О чём код?
using System.Net; using System.Net.Http.Json; using Taskwards.Web.Infrastructure.Common; namespace Taskwards.Web.Infrastructure.Auth; /// <summary> /// Реализация IAuthService /// </summary> public class AuthService : IAuthService { private readonly HttpClient _httpClient; private readonly ITokenStorageService _tokenStorage; private readonly TaskwardsAuthStateProvider _authStateProvider; public AuthService(HttpClient httpClient, ITokenStorageService tokenStorage, TaskwardsAuthStateProvider authStateProvider) { _httpClient = httpClient; _tokenStorage = tokenStorage; _authStateProvider = authStateProvider; } public async Task<AuthServiceResult> LoginAsync(string email, string password) { try { var response = await _httpClient.PostAsJsonAsync("api/auth/login", new { email, password }); if (!response.IsSuccessStatusCode) return await HandleErrorResponse(response); var apiResult = await response.Content.ReadFromJsonAsync<ApiAuthResponse>(); if (apiResult == null) return new AuthServiceResult(false, "Ошибка обработки ответа сервера"); var authResult = apiResult.ToAuthResult(); await _tokenStorage.SetTokensAsync(authResult); _authStateProvider.NotifyAuthStateChanged(); return new AuthServiceResult(true); } catch (HttpRequestException) { return new AuthServiceResult(false, "Не удалось подключиться к серверу"); } } public async Task<AuthServiceResult> RegisterAsync(string userName, string email, string password) { try { var response = await _httpClient.PostAsJsonAsync("api/auth/register", new { userName, email, password }); if (!response.IsSuccessStatusCode) return await HandleErrorResponse(response); var apiResult = await response.Content.ReadFromJsonAsync<ApiAuthResponse>(); if (apiResult == null) return new AuthServiceResult(false, "Ошибка обработки ответа сервера"); var authResult = apiResult.ToAuthResult(); await _tokenStorage.SetTokensAsync(authResult); _authStateProvider.NotifyAuthStateChanged(); return new AuthServiceResult(true); } catch (HttpRequestException) { return new AuthServiceResult(false, "Не удалось подключиться к серверу"); } } public async Task LogoutAsync() { var refreshToken = await _tokenStorage.GetRefreshTokenAsync(); if (!string.IsNullOrEmpty(refreshToken)) { try { await _httpClient.PostAsJsonAsync("api/auth/logout", new { refreshToken }); } catch { // Даже если API недоступен — очищаем локальные токены } } await _tokenStorage.ClearTokensAsync(); _authStateProvider.NotifyAuthStateChanged(); } private static async Task<AuthServiceResult> HandleErrorResponse(HttpResponseMessage response) { var statusCode = (int)response.StatusCode; var message = response.StatusCode switch { HttpStatusCode.Unauthorized => "Неверный email или пароль", (HttpStatusCode)423 => "Аккаунт временно заблокирован. Попробуйте позже", HttpStatusCode.Conflict => "Пользователь с таким email уже существует", _ => await TryReadErrorMessage(response) ?? "Произошла ошибка. Попробуйте позже" }; return new AuthServiceResult(false, message, statusCode); } private static async Task<string?> TryReadErrorMessage(HttpResponseMessage response) { try { var error = await response.Content.ReadFromJsonAsync<ApiErrorResponse>(); return error?.Message; } catch { return null; } } }