private async Task <(string, JwtRefreshTokenModel)> _getTokenAndRefresh(ClaimsIdentity identity, string userName,
                                                                                string[] roles, ApplicationUser user)
        {
            var jwt = await TokenIssuer.GenerateJwt(
                identity,
                _jwtFactory,
                userName,
                roles,
                _jwtOptions,
                new JsonSerializerSettings { Formatting = Formatting.Indented }
                );

            var refresh = TokenIssuer.GenerateRefreshToken(128);

            user.AddRefreshToken(
                refresh,
                _contextAccessor.HttpContext.Connection.RemoteIpAddress.ToString());

            await _unitOfWork.CompleteAsync();

            return(jwt.Token, new JwtRefreshTokenModel(refresh, jwt));
        }
        private async Task <JwtRefreshTokenModel> _processUserDetails(FacebookUserData userInfo)
        {
            // 4. ready to create the local user account (if necessary) and jwt
            var user = await _userManager.FindByEmailAsync(userInfo.Email);

            if (user is null)
            {
                var appUser = new ApplicationUser {
                    FirstName  = userInfo.FirstName,
                    LastName   = userInfo.LastName,
                    FacebookId = userInfo.Id,
                    Email      = userInfo.Email,
                    UserName   = userInfo.Email,
                    PictureUrl = userInfo.Picture.Data.Url
                };
                var result = await _userManager.CreateAsync(appUser, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8));

                if (!result.Succeeded)
                {
                    throw new InvalidOperationException(
                              ModelState.ToString()
                              );
                }
            }
            else
            {
                user.PictureUrl = userInfo.Picture.Data.Url;
                var result = await _userManager.UpdateAsync(user);

                if (!result.Succeeded)
                {
                    throw new InvalidOperationException(
                              ModelState.ToString()
                              );
                }
            }

            // generate the jwt for the local user...
            var localUser = await _userManager.FindByNameAsync(userInfo.Email);

            if (localUser is null)
            {
                throw new InvalidOperationException(
                          ModelState.ToString()
                          );
            }
            var roles = await _userManager.GetRolesAsync(localUser);

            var jwt = await TokenIssuer.GenerateJwt(
                _jwtFactory.GenerateClaimsIdentity(localUser.UserName, localUser.Id),
                _jwtFactory,
                localUser.UserName,
                roles.ToArray <string>(),
                _jwtOptions,
                new JsonSerializerSettings { Formatting = Formatting.Indented });

            var refresh = TokenIssuer.GenerateRefreshToken(128);

            user.AddRefreshToken(
                refresh,
                _contextAccessor.HttpContext.Connection.RemoteIpAddress.ToString());

            await _unitOfWork.CompleteAsync();

            return(new JwtRefreshTokenModel(refresh, jwt));
        }