public async Task <IActionResult> Login([FromBody] LoginModel model) { var connectionInfo = new ConnectionInfo { IpAddress = Request.HttpContext.Connection.RemoteIpAddress, BrowserInfo = UserAgentParser.FromUserAgent(Request.Headers["User-Agent"]) }; var loginResponse = await _userService.LoginUser(new Email(model.Email), model.Password, model.TwoFactorCode, connectionInfo); if (!loginResponse.Success) { switch (loginResponse.Error) { case LoginError.InvalidLoginDetails: return(StatusCode(401, new ErrorResult <string> { Error = StrResource.UsernameOfPasswordInvalid })); case LoginError.NotValidatedEmail: return(StatusCode(403, new ErrorResult <string> { Error = StrResource.EmailNotVerified })); case LoginError.NotWhitelistedIp: return(StatusCode(403, new ErrorResult <string> { Error = StrResource.EmailWhitelistIpAddress })); case LoginError.TwoFactorRequiered: return(StatusCode(403, new ErrorResult <string> { Error = StrResource.TwoFactorCodeRequiered })); case LoginError.TwoFactorInvalid: return(StatusCode(401, new ErrorResult <string> { Error = StrResource.TwoFactorCodeInvalid })); default: throw new ArgumentOutOfRangeException(); } } var response = new OAuthTokenResponse { AccessToken = loginResponse.OAuthToken.AccessToken, Expires = loginResponse.OAuthToken.Expires.ToUnixTimeSeconds(), Type = loginResponse.OAuthToken.Type.ToString(), RefreshToken = loginResponse.OAuthToken.RefreshToken, }; return(Ok(new SuccessResult <OAuthTokenResponse> { Data = response })); }