using Microsoft.AspNetCore.Components.Authorization; using System.Security.Claims; using System.Net.Http.Headers; using TechHelper.Features; using Microsoft.JSInterop; namespace TechHelper.Client.AuthProviders { public class AuthStateProvider : AuthenticationStateProvider { private readonly HttpClient _httpClient; private readonly AuthenticationState _anonymous; private readonly ILocalStorageService _localStorageService; public AuthStateProvider(ILocalStorageService localStorageService, HttpClient httpClient) { _localStorageService = localStorageService; _httpClient = httpClient; _anonymous = new AuthenticationState( new ClaimsPrincipal(new ClaimsIdentity())); } public override async Task GetAuthenticationStateAsync() { string? token = null; try { token = _localStorageService.GetItem("authToken"); } catch (Exception ex) { Console.WriteLine($"Error accessing LocalStorage or parsing token: {ex.Message}"); return _anonymous; } if (string.IsNullOrEmpty(token)) return _anonymous; _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token); return new AuthenticationState(new ClaimsPrincipal( new ClaimsIdentity(JWTParser.ParseClaimsFromJwt(token), "jwtAuthType"))); } public void NotifyUserAuthentication(string token) { var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity( JWTParser.ParseClaimsFromJwt(token), "jwtAuthType")); var authState = Task.FromResult(new AuthenticationState(authenticatedUser)); NotifyAuthenticationStateChanged(authState); } public void NotifyUserLogout() { var authState = Task.FromResult(_anonymous); NotifyAuthenticationStateChanged(authState); } } }