public async Task <AuthorizeTokenResponse> RefreshTokenAsync(RefreshTokenRequest request, CancellationToken cancellationToken)
        {
            var result = new AuthorizeTokenResponse();

            try
            {
                var accessToken  = request.AccessToken;
                var refreshToken = request.RefreshToken;

                var principal = _jwtTokenService.GetPrincipalFromExpiredToken(accessToken);

                // this is mapped to the Name claim by default
                var username = principal.Identity.Name;

                if (!await _userService.ValidateRefreshTokenAsync(username ?? string.Empty, refreshToken, cancellationToken))
                {
                    return(result);
                }

                result.Success      = true;
                result.AccessToken  = _jwtTokenService.GenerateAccessToken(principal.Claims);
                result.ExpiresIn    = DateTimeOffset.UtcNow.AddMinutes(_jwtTokenOptions.AccessExpiration).Ticks;
                result.RefreshToken = _jwtTokenService.GenerateRefreshToken();

                await _userService.UpdateRefreshTokenAsync(
                    username ?? string.Empty,
                    result.RefreshToken,
                    DateTime.Now.Add(TimeSpan.FromMinutes(_jwtTokenOptions.RefreshExpiration)),
                    cancellationToken);
            }
            catch (Exception ex)
            {
                result.Success = false;
            }

            return(result);
        }
        public async Task <AuthorizeTokenResponse> GetTokenAsync(
            AuthorizeTokenRequest request,
            CancellationToken cancellationToken)
        {
            var result = new AuthorizeTokenResponse();

            if (!await _userService.IsValidUserAsync(request.UserName, request.Password, cancellationToken))
            {
                return(result);
            }

            var claims = new[]
            {
                new Claim(ClaimTypes.Name, request.UserName)
            };

            try
            {
                result.Success      = true;
                result.AccessToken  = _jwtTokenService.GenerateAccessToken(claims);
                result.ExpiresIn    = DateTimeOffset.UtcNow.AddMinutes(_jwtTokenOptions.AccessExpiration).Ticks;
                result.RefreshToken = _jwtTokenService.GenerateRefreshToken();

                await _userService.UpdateRefreshTokenAsync(
                    request.UserName,
                    result.RefreshToken,
                    DateTime.Now.Add(TimeSpan.FromMinutes(_jwtTokenOptions.AccessExpiration)),
                    cancellationToken);
            }
            catch
            {
                result.Success = false;
            }

            return(result);
        }