using Blazored.LocalStorage; using Microsoft.AspNetCore.Components; using MudBlazor; using System.IdentityModel.Tokens.Jwt; namespace FrontOffice.Main.Utilities; public class AuthService { private readonly ILocalStorageService _localStorage; private readonly NavigationManager _navigation; private readonly ISnackbar _snackbar; private readonly UserAuthInfo _userAuthInfo; private const string TokenStorageKey = "auth:token"; public AuthService(ILocalStorageService localStorage, NavigationManager navigation, ISnackbar snackbar, UserAuthInfo userAuthInfo) { _localStorage = localStorage; _navigation = navigation; _snackbar = snackbar; _userAuthInfo = userAuthInfo; } public async Task IsAuthenticatedAsync() { var token = await _localStorage.GetItemAsync(TokenStorageKey); return !string.IsNullOrWhiteSpace(token); } public async Task GetTokenAsync() { return await _localStorage.GetItemAsync(TokenStorageKey); } public async Task IsCompleteRegisterAsync() { await InitUserAuthInfo(); if (!string.IsNullOrWhiteSpace(_userAuthInfo.NationalCode) && !string.IsNullOrWhiteSpace(_userAuthInfo.FirstName) && !string.IsNullOrWhiteSpace(_userAuthInfo.LastName) && _userAuthInfo.IsSignMainContract) { return true; } return false; } public bool IsCompleteRegister() { InitUserAuthInfo().GetAwaiter(); if (!string.IsNullOrWhiteSpace(_userAuthInfo.NationalCode) && !string.IsNullOrWhiteSpace(_userAuthInfo.FirstName) && !string.IsNullOrWhiteSpace(_userAuthInfo.LastName) && _userAuthInfo.IsSignMainContract) { return true; } return false; } public async Task GetUserAuthInfo() { await InitUserAuthInfo(); return _userAuthInfo; } public async Task InitUserAuthInfo() { var claims = await GetTokenClaimsAsync(); _userAuthInfo.UserClaims= claims; var firstName = claims.FirstOrDefault(c => c.key == "FirstName").value; var lastName = claims.FirstOrDefault(c => c.key == "LastName").value; var nationalCode = claims.FirstOrDefault(c => c.key == "NationalCode").value; var mobileNumber = claims.FirstOrDefault(c => c.key == "MobileNumber").value; var isSignMainContractStr = claims.FirstOrDefault(c => c.key == "IsSignMainContract").value; _userAuthInfo.FirstName = firstName ?? string.Empty; _userAuthInfo.LastName = lastName ?? string.Empty; _userAuthInfo.NationalCode = nationalCode ?? string.Empty; _userAuthInfo.MobileNumber = mobileNumber ?? string.Empty; _userAuthInfo.IsSignMainContract = bool.TryParse(isSignMainContractStr, out var isSignMainContract) && isSignMainContract; } private async Task?> GetTokenClaimsAsync() { var token = await GetTokenAsync(); if (string.IsNullOrEmpty(token)) return null; var handler = new JwtSecurityTokenHandler(); var jwtToken = handler.ReadJwtToken(token); return jwtToken.Claims.Select(c => (c.Type, c.Value)).ToList(); } public async Task LogoutAsync() { await _localStorage.RemoveItemAsync(TokenStorageKey); await _localStorage.RemoveItemAsync("auth:phone-number"); await _localStorage.RemoveItemAsync("auth:redirect"); await _localStorage.RemoveItemAsync("referral:code"); _snackbar.Add("با موفقیت از حساب کاربری خارج شدید.", Severity.Success); _navigation.NavigateTo(RouteConstants.Main.MainPage); } public async Task RequireAuthenticationAsync() { var isAuthenticated = await IsAuthenticatedAsync(); if (!isAuthenticated) { _snackbar.Add("لطفاً ابتدا وارد حساب کاربری شوید.", Severity.Warning); _navigation.NavigateTo(RouteConstants.Main.MainPage); } } }