private async Task <TokenData> GetTokens(string authCode, IdentityProviderClientSettings clientSettings, string redirectUri)
        {
            var httpClient = _httpClientFactory.CreateClient();

            var discoveryResponse = await _discoveryCache.GetAsync();

            if (discoveryResponse.IsError)
            {
                _discoveryCache.Refresh();
                throw new Exception(discoveryResponse.Error);
            }

            var tokenResponse = await httpClient.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
            {
                Address      = discoveryResponse.TokenEndpoint,
                Code         = authCode,
                ClientId     = clientSettings.ClientId,
                ClientSecret = clientSettings.ClientSecret,
                RedirectUri  = redirectUri
            });

            if (tokenResponse.IsError)
            {
                throw new Exception(tokenResponse.Error);
            }

            return(new TokenData(tokenResponse));
        }
        private async Task ProcessMobileCallback(IdentityProviderClientSettings clientSettings, string redirectUri)
        {
            var userSession = new UserSession.UserSession();

            var authCode = HttpContext.Request.Query["code"];

            var tokens = await GetTokens(authCode, clientSettings, redirectUri);

            var userId = GetUserId(tokens.IdentityToken);

            var authResult = await _clientSessionsClient.Authenticate(userId, "hobbit");

            SaveAuthResult(userSession, authResult);

            SaveTokensToUserSession(userSession, tokens);

            await SaveLykkeSession(authResult.SessionToken, tokens);

            await _userSessionManager.SetUserSession(userSession);
        }