using System.Security.Cryptography; using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; using Microsoft.Extensions.Caching.Memory; namespace WatchIt.Website.Services.Tokens; public class TokensService : ITokensService { #region SERVICES private readonly ILogger _logger; private readonly ProtectedLocalStorage _localStorageService; private readonly Configuration.Tokens _configuration; #endregion #region CONSTRUCTORS public TokensService(ILogger logger, IConfiguration configuration, ProtectedLocalStorage localStorageService) { _logger = logger; _localStorageService = localStorageService; _configuration = configuration.GetSection("Tokens").Get()!; } #endregion #region PUBLIC METHODS #region Access token public async Task GetAccessToken() => await GetValueAsync(_configuration.StorageKeys.AccessToken); public async Task SetAccessToken(string accessToken) => await _localStorageService.SetAsync(_configuration.StorageKeys.AccessToken, accessToken); public async Task DeleteAccessToken() => await _localStorageService.DeleteAsync(_configuration.StorageKeys.AccessToken); #endregion #region Refresh token public async Task GetRefreshToken() => await GetValueAsync(_configuration.StorageKeys.RefreshToken); public async Task SetRefreshToken(string accessToken) => await _localStorageService.SetAsync(_configuration.StorageKeys.RefreshToken, accessToken); public async Task DeleteRefreshToken() => await _localStorageService.DeleteAsync(_configuration.StorageKeys.RefreshToken); #endregion #endregion #region PRIVATE METHODS 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 }