private async Task GenerateToken(HttpContext context) { var email = context.Request.Form["email"].ToString(); var password = context.Request.Form["password"].ToString(); var _accountService = (IAccountService)context.RequestServices.GetService(typeof(IAccountService)); //var _verifyService = (IVerificationService)context.RequestServices.GetService(typeof(IVerificationService)); //var _rawRabbitClient = (IBusClient)context.RequestServices.GetService(typeof(IBusClient)); var identity = await _accountService.CheckAsync(email, password); //response if account null or inactive if (identity == null || identity.Status == false) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 400; var code = Errors.INCORRECT_LOGIN; var message = Errors.INCORRECT_LOGIN_MSG; if (identity != null && identity.Status == false) { code = Errors.ACCOUNT_INACTIVE; message = Errors.ACCOUNT_INACTIVE_MSG; } await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = code, Message = message }, Formatting.Indented)); return; } var permissions = await _accountService.GetPermissionsOfAccountAsync(identity.Id); var now = DateTime.Now; var encodedJwt = TokenProviderMiddleware.GenerateAccessToken(_options, now, identity.Email, identity.Id.ToString(), permissions.ToArray()); var response = new SignInResponseModel { AccessToken = encodedJwt, Expires = now.AddSeconds((int)_options.Expiration.TotalSeconds), Account = identity.ToViewModel() }; // Serialize and return the response context.Response.ContentType = "application/json"; await context.Response.WriteAsync(JsonConvert.SerializeObject(response, new JsonSerializerSettings { Formatting = Formatting.Indented })); }
private async Task GenerateToken(HttpContext context) { var username = context.Request.Form["username"].ToString(); var password = context.Request.Form["password"].ToString(); var _accountService = (IAccountService)context.RequestServices.GetService(typeof(IAccountService)); var _verifyService = (IVerificationService)context.RequestServices.GetService(typeof(IVerificationService)); var _rawRabbitClient = (IBusClient)context.RequestServices.GetService(typeof(IBusClient)); //if username is not an email if (username != null && !username.Contains("@")) { //try to format username as internationlazition phone number try { //try to format with expectation that user filled country code username = PhoneNumberHelpers.GetFormatedPhoneNumber(username); } catch (NumberParseException) { //the username user provide is not an email or valid phone number context.Response.ContentType = "application/json"; context.Response.StatusCode = 400; await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = Errors.INCORRECT_LOGIN, Custom = Errors.INVALID_PHONE_NUMBER, Message = Errors.INCORRECT_LOGIN_MSG }, Formatting.Indented)); return; } } var identity = await _accountService.CheckAsync(username, password); //response if account null or inactive if (identity == null || identity.Status == UserStatus.InActive || (identity.AccountType == AccountType.Jobseeker && username.Contains("@"))) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 400; var code = Errors.INCORRECT_LOGIN; var message = Errors.INCORRECT_LOGIN_MSG; if (identity != null && identity.Status == UserStatus.InActive) { code = Errors.ACCOUNT_INACTIVE; message = Errors.ACCOUNT_INACTIVE_MSG; } await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = code, Message = message }, Formatting.Indented)); return; } if (identity.AccountType == AccountType.Jobseeker && !identity.PhoneNumberVerified) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 400; //1 account has only 1 verification => get first var verification = (await _verifyService.GetVerificationsOfAccount(identity.Id)).FirstOrDefault(); //account is locked because exceeded limit of retried or resend times if (verification.Retry >= VerificationService.MAX_RETRY || verification.Resend > VerificationService.MAX_RESEND) { await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = Errors.VERIFICATION_LOCKED, Message = Errors.VERIFICATION_LOCKED_MSG }, Formatting.Indented)); } else //wait for verification { await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = Errors.WAIT_FOR_VERIFICATION, Message = Errors.WAIT_FOR_VERIFICATION_MSG }, Formatting.Indented)); } return; } //add banana reward for first login in day if (identity.AccountType == AccountType.Jobseeker) { var tracker = await _accountService.AddTracker(new LoginTracker { Account = identity, LoginAt = DateTime.Now }); if (tracker != null) { await _rawRabbitClient.PublishAsync(new AccountLoggedIn { AccountId = identity.Id, LoginAt = tracker.LoginAt }); } } var permissions = await _accountService.GetPermissionsOfAccountAsync(identity.Id); var now = DateTime.Now; var encodedJwt = TokenProviderMiddleware.GenerateAccessToken(_options, now, identity.UserName, identity.Id.ToString(), permissions.ToArray()); var response = new SignInResponseModel { AccessToken = encodedJwt, Expires = now.AddSeconds((int)_options.Expiration.TotalSeconds), Account = identity.ToViewModel() }; // Serialize and return the response context.Response.ContentType = "application/json"; await context.Response.WriteAsync(JsonConvert.SerializeObject(response, new JsonSerializerSettings { Formatting = Formatting.Indented })); }