public void AuthenticateValidCredentialsTest()
        {
            UserAccountController userController = CreateFakeUserAccountController();

            //Authenticate with valid credentials
            var response = userController.Authenticate(
                new ReceiveLoginUserModel(_users[0].Email, "password-u1")
                );

            Assert.IsType <OkObjectResult>(response.Result);

            //Validate return data from endpoint
            SendLoginUserModel sendLoginUserModel =
                (SendLoginUserModel)((OkObjectResult)response.Result).Value;

            Assert.Equal(_users[0].Id, sendLoginUserModel.Id);
            Assert.Equal(_users[0].Email, sendLoginUserModel.Email);

            TokenCreatorValidator tokenCreatorValidator = new TokenCreatorValidator(_testApiSecret);
            TokenValidationParams tokenValidationParams = tokenCreatorValidator.ValidateToken(sendLoginUserModel.Token);

            Assert.Equal(_users[0].Id, tokenValidationParams.UserId);

            User authenticatedUser = _usersService.GetById(_users[0].Id);

            Assert.Equal(
                Encoding.Default.GetString(authenticatedUser.AuthSalt),
                Encoding.Default.GetString(tokenValidationParams.SaltBytes)
                );
        }
        public ActionResult <SendLoginUserModel> Authenticate([FromBody] ReceiveLoginUserModel userModel)
        {
            User user;

            try {
                user = _userService.Authenticate(userModel.Email, userModel.Password);
            } catch (RequestException) {
                return(BadRequest(new { message = "Email or password is incorrect" }));
            }

            TokenCreationParams tokenCreationParams = _tokenCreatorValidator.CreateToken(user.Id, 60 * 24 * 7);

            user.AuthSalt = tokenCreationParams.SaltBytes;

            _userService.Update(user);

            SendLoginUserModel sendLoginUserModel = _mapper.Map <SendLoginUserModel>(user);

            sendLoginUserModel.Token = tokenCreationParams.TokenStr;
            return(Ok(sendLoginUserModel));
        }