using Blazored.LocalStorage; using Microsoft.AspNetCore.Components.Authorization; using System.Security.Claims; using System.IdentityModel.Tokens.Jwt; using GameIdeas.Shared.Constants; namespace GameIdeas.BlazorApp.Services; public class JwtAuthenticationStateProvider(ILocalStorageService localStorage) : AuthenticationStateProvider { public override async Task GetAuthenticationStateAsync() { var savedToken = await localStorage.GetItemAsStringAsync(GlobalConstants.LS_AUTH_STORAGE_KEY); if (!string.IsNullOrWhiteSpace(savedToken)) { try { var token = new JwtSecurityTokenHandler().ReadJwtToken(savedToken); return new AuthenticationState( new ClaimsPrincipal(new ClaimsIdentity(token.Claims, "jwt")) ); } catch { await localStorage.RemoveItemAsync(GlobalConstants.LS_AUTH_STORAGE_KEY); } } return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); } public async Task NotifyUserAuthenticationAsync(string token) { await localStorage.SetItemAsStringAsync(GlobalConstants.LS_AUTH_STORAGE_KEY, token); NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); } public async Task NotifyUserLogoutAsync() { await localStorage.RemoveItemAsync(GlobalConstants.LS_AUTH_STORAGE_KEY); var nobody = new ClaimsPrincipal(new ClaimsIdentity()); NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(nobody))); } }