public async Task <T> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (normalizedUserName == null)
            {
                throw new ArgumentNullException(nameof(normalizedUserName));
            }
            T foundUser = null;

            try
            {
                TokkepediaApiClient apiClient = new TokkepediaApiClient();
                foundUser = (T)(dynamic)await apiClient.GetUserAsync(normalizedUserName);
            }
            catch
            {
            }

            return(null);

            //return (T)(dynamic)(new FirebaseIdentityUser());
        }
        public async Task <T> FindByIdAsync(string userId, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (userId == null)
            {
                throw new ArgumentNullException(nameof(userId));
            }

            T foundUser = null;

            try
            {
                TokkepediaApiClient apiClient = new TokkepediaApiClient();
                var item = await apiClient.GetUserAsync(userId);

                foundUser = (T)(dynamic)item;
            }
            catch
            {
            }

            return(foundUser);
        }
        public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            // profile claims

            // Sign in the user with this external login provider if the user already has a login.
            FirebaseAuthType authType;
            string           email = "", photoUrl = "";

            if (info.ProviderDisplayName == "Facebook")
            {
                authType = FirebaseAuthType.Facebook;
                var claims = info.Principal.Identities.First().Claims;
                email = claims.ElementAt(1).Value;
            }
            else if (info.ProviderDisplayName == "Google")
            {
                authType = FirebaseAuthType.Google;
                var claims = info.Principal.Identities.First().Claims;
                email    = claims.ElementAt(4).Value;
                photoUrl = claims.ElementAt(5).Value;
            }
            else
            {
                authType = new FirebaseAuthType();
            }


            var token = info.AuthenticationTokens.First().Value;

            TokkepediaApiClient apiClient = new TokkepediaApiClient();
            FirebaseAuthLink    link      = null;

            try
            {
                link = await apiClient.LoginOAuthAsync(info.ProviderDisplayName, token);
            }
            catch
            {
            }

            TokketUser user = await apiClient.GetUserAsync(link.User.LocalId);

            // If the user does not have an account, then ask the user to create an account.
            if (user == null)
            {
                ReturnUrl     = returnUrl;
                LoginProvider = info.LoginProvider;
                if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Email))
                {
                    Input = new InputModel
                    {
                        FirebaseToken = link.FirebaseToken,
                        Id            = link.User.LocalId,
                        UserName      = link.User.LocalId,
                        DisplayName   = info.Principal.Identity.Name,
                        Email         = info.Principal.FindFirstValue(ClaimTypes.Email)
                    };
                }
                return(Page());
            }
            //Sign user in
            else
            {
                if (user.IsLockedOut)
                {
                    return(RedirectToPage("./Lockout"));
                }

                await _signInManager.SignInAsync(user, true);

                _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
                return(LocalRedirect(returnUrl));
            }

            //var result = new Microsoft.AspNetCore.Identity.SignInResult();// await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor : true);
            //if (result.Succeeded)
            //{
            //    _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
            //    return LocalRedirect(returnUrl);
            //}
            //if (result.IsLockedOut)
            //{
            //    return RedirectToPage("./Lockout");
            //}
            //else
            //{
            //    // If the user does not have an account, then ask the user to create an account.
            //    ReturnUrl = returnUrl;
            //    LoginProvider = info.LoginProvider;
            //    if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Email))
            //    {
            //        Input = new InputModel
            //        {
            //            Email = info.Principal.FindFirstValue(ClaimTypes.Email)
            //        };
            //    }
            //    return Page();
            //}
        }