private DiscourseSignInResult BuildResult(User user)
        {
            var discourse = new DiscourseSignInRequest {
                Nonce = "123", Redirect = _discourseUrl, User = user
            };
            var discourseSignInResult = new DiscourseSignInResult(discourse);

            DiscourseSignInResult.CalculateHash(discourseSignInResult, _discourseSsoToken);
            return(discourseSignInResult);
        }
        public async Task <UserSignInResult> Handle(UserSignInCommand request, CancellationToken cancellationToken)
        {
            AuthenticationResultType result;

            try
            {
                result = await _mediator.Send(new CognitoSignInCommand
                {
                    Email    = request.Email.ToLower().Trim(),
                    Password = request.Password
                }, cancellationToken);
            }
            catch (AmazonCognitoIdentityProviderException e)
            {
                if (e is UserNotFoundException || e.Message.Contains("Incorrect username or password"))
                {
                    throw new UserException("Incorrect username or password.");
                }

                throw;
            }

            if (result == null || string.IsNullOrEmpty(result.IdToken))
            {
                return(null);
            }

            var email = await _mediator.Send(new CognitoDecodeTokenCommand { Token = result.IdToken },
                                             cancellationToken);

            var user = await _mediator.Send(new GetUserByEmailQuery { Email = email, IncludeGroups = true },
                                            cancellationToken);

            if (user == null)
            {
                throw new NotFoundException("User", request.Email);
            }

            if (request.Type == LoginType.Forums)
            {
                var discourse = ValidateForumsSignature(request);
                discourse.User = user;
                var secret = _configuration.GetValue <string>("Forums:Token");
                var discourseSignInResult = new DiscourseSignInResult(discourse);
                DiscourseSignInResult.CalculateHash(discourseSignInResult, secret);
                return(discourseSignInResult);
            }

            var payload = await _mediator.Send(new GetSignInPayloadQuery { User = user }, cancellationToken);

            return(await _mediator.Send(new UserCreateSignInJwtCommand
            {
                Payload = payload
            }, cancellationToken));
        }