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));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> ExternalLoginGoogle([FromBody] GoogleLoginDto externalLoginDto)
        {
            var userIp = Request.HttpContext.Connection.RemoteIpAddress;
            var result = await _externalLoginService.LoginGoogle(externalLoginDto, userIp);

            return(HandleExternalLoginResult(result));
        }
Exemplo n.º 3
0
        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"));
        }