using System.Security.Cryptography; using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; using Microsoft.Extensions.Logging; using WatchIt.Common.Model.Accounts; using WatchIt.Website.Services.Configuration; namespace WatchIt.Website.Services.Tokens; public class TokensService : ITokensService { #region SERVICES private readonly ILogger _logger; private readonly ProtectedLocalStorage _localStorageService; private readonly IConfigurationService _configurationService; #endregion #region CONSTRUCTORS public TokensService(ILogger logger, ProtectedLocalStorage localStorageService, IConfigurationService configurationService) { _logger = logger; _localStorageService = localStorageService; _configurationService = configurationService; } #endregion #region PUBLIC METHODS public async Task GetAccessToken() => await GetValueAsync(GetAccessTokenStorageKey()); public async Task GetRefreshToken() => await GetValueAsync(GetRefreshTokenStorageKey()); public async Task SaveAuthenticationData(AuthenticateResponse authenticateResponse) => await Task.WhenAll(SaveAccessToken(authenticateResponse.AccessToken), SaveRefreshToken(authenticateResponse.RefreshToken)); public async Task SaveAccessToken(string accessToken) => await _localStorageService.SetAsync(GetAccessTokenStorageKey(), accessToken); public async Task SaveRefreshToken(string refreshToken) => await _localStorageService.SetAsync(GetRefreshTokenStorageKey(), refreshToken); public async Task RemoveAuthenticationData() => await Task.WhenAll(RemoveAccessToken(), RemoveRefreshToken()); public async Task RemoveAccessToken() => await _localStorageService.DeleteAsync(GetAccessTokenStorageKey()); public async Task RemoveRefreshToken() => await _localStorageService.DeleteAsync(GetRefreshTokenStorageKey()); #endregion #region PRIVATE METHODS private string GetAccessTokenStorageKey() => _configurationService.Data.StorageKeys.AccessToken; private string GetRefreshTokenStorageKey() => _configurationService.Data.StorageKeys.RefreshToken; private async Task GetValueAsync(string key) { try { ProtectedBrowserStorageResult result = await _localStorageService.GetAsync(key); return result.Success ? result.Value : default; } catch (CryptographicException ex) { _logger.LogError(ex, "Browser storage error has occurred. Deleting value."); await _localStorageService.DeleteAsync(key); return default; } } #endregion }