public Account FacebookAuthenticate(string accessToken)
        {
            var userInfo = GetFacebookUserInformation(accessToken);

            if (userInfo == null)
            {
                return(null);
            }
            var user = _accountRepository.GetByFacebookId(userInfo.Id);

            if (user != null)
            {
                user.Token        = JwtToken.Generate(_settings.Value.Secret, user);
                user.Password     = null;
                user.PasswordSalt = null;
                return(user);
            }
            else
            {
                var salt       = Salt.Generate();
                var newAccount = new Account()
                {
                    Password     = Hash.HashPassword(GenerateRandomPassword(), salt),
                    PasswordSalt = salt,
                    Role         = "member",
                    UserId       = ObjectId.GenerateNewId().ToString(),
                    FacebookId   = userInfo.Id
                };
                _accountRepository.Add(newAccount);
                newAccount.Password     = null;
                newAccount.PasswordSalt = null;
                newAccount.Token        = JwtToken.Generate(_settings.Value.Secret, newAccount);
                return(newAccount);
            }
        }
        public Account Authenticate(string email, string password)
        {
            var account = _accountRepository.GetByEmail(email);

            if (account != null)
            {
                var isValid = Hash.HashPassword(password, account.PasswordSalt) == account.Password;
                if (isValid)
                {
                    account.Token = JwtToken.Generate(_settings.Value.Secret, account);
                }
                // Set important fields to null
                account.Password     = null;
                account.PasswordSalt = null;
            }

            return(account);
        }
        public Account Register(Account account)
        {
            if (_accountRepository.GetByEmail(account.Email) != null)
            {
                return(null);
            }
            var salt             = Salt.Generate();
            var encryptedAccount = new Account()
            {
                Email        = account.Email,
                Password     = Hash.HashPassword(account.Password, salt),
                PasswordSalt = salt,
                Role         = "unverified",
                UserId       = ObjectId.GenerateNewId().ToString(),
                Id           = ObjectId.GenerateNewId().ToString()
            };
            var result = _accountRepository.Add(encryptedAccount);

            // Generate token
            result.Token = JwtToken.Generate(_settings.Value.Secret, encryptedAccount);

            if (result != null)
            {
                Mail mail = new Mail()
                {
                    Subject   = "Thanks for joining TripSharing",
                    To        = result.Email,
                    Url       = $"https://trip-sharing.net/xac-nhan-email/{result.Token}",
                    EmailType = "EmailConfirm"
                };

                // Commment this if run in local
                _publishToTopic.PublishEmail(mail);
            }

            return(result);
        }