public async Task <Result <TokenDto> > LoginGoogle(GoogleLoginDto googleLoginDto, IPAddress userIp) { var loginProvider = _loginDataProviderFactory.Create(LoginProvider.Google); var userData = await loginProvider.GetExternalData(new GoogleExternalDataDto { LoginDto = googleLoginDto, Ip = userIp }); return(await Login(userData, LoginProvider.Google)); }
public async Task <IActionResult> ExternalLoginGoogle([FromBody] GoogleLoginDto externalLoginDto) { var userIp = Request.HttpContext.Connection.RemoteIpAddress; var result = await _externalLoginService.LoginGoogle(externalLoginDto, userIp); return(HandleExternalLoginResult(result)); }
public async Task <IActionResult> GoogleAuth([FromBody] GoogleLoginDto externalLogin) { var payLoad = await _userRepository.ValidateGooglePayLoad(externalLogin.IdToken); //var info = await _signInManager.GetExternalLoginInfoAsync(); if (payLoad == null) { return(Unauthorized("Please login, no provider found")); } // find user by email if he exists var user = await _userManager.FindByEmailAsync(payLoad.Email); if (user != null) { if (payLoad.EmailVerified) { user.EmailConfirmed = true; if (string.IsNullOrEmpty(user.ProfileImageUrl)) { user.ProfileImageUrl = payLoad.Picture; } await _userRepository.Update(user); await _userRepository.Save(); } var identity = await _jwtFactory.GenerateClaimsIdentity(user.UserName, user.Id); var token = await _jwtFactory.GenerateEncodedToken(user.UserName, identity); var mappedUser = _mapper.Map <UserDto>(user); var roles = await _userManager.GetRolesAsync(user); var response = new { id = identity.Claims.Single(c => c.Type == "id").Value, auth_token = token, expires_in = (int)_jwtOptions.ValidFor.TotalSeconds, roles = roles, user = mappedUser, canLogin = true }; return(Ok(new ResponseDto { Data = response, Status = ResponseStatus.Success })); } else { // no user found create a new one and set emailConfirm to true var createdUser = await _userManager.CreateAsync(new ApplicationUser() { Email = payLoad.Email, FirstName = payLoad.GivenName, LastName = payLoad.FamilyName, UserName = payLoad.Email, TwoFactorEnabled = true, EmailConfirmed = true, ProfileImageUrl = payLoad.Picture }); if (createdUser.Succeeded) { // sign in the user with a token and notify the user to update his password var newUser = await _userManager.FindByEmailAsync(payLoad.Email); if (newUser == null) { return(BadRequest("unable to find this user, please try again")); } var identity = await _jwtFactory.GenerateClaimsIdentity(newUser.UserName, newUser.Id); var mappedUser = _mapper.Map <UserDto>(newUser); var roles = await _userManager.GetRolesAsync(newUser); var response = new { id = identity.Claims.Single(c => c.Type == "id").Value, auth_token = await _jwtFactory.GenerateEncodedToken(newUser.UserName, identity), expires_in = (int)_jwtOptions.ValidFor.TotalSeconds, roles = roles, user = mappedUser, canLogin = true, message = "success, please redirect user to setup his password" }; return(Ok(new ResponseDto() { Data = response, Status = ResponseStatus.Success })); } } return(StatusCode(500, "something went wrong")); }