public async Task <ActionResult <UserDto> > GoogleLogin(GoogleUserDto loginDto)
        {
            var command = new GoogleLoginCommand(loginDto, this);
            var result  = await _mediator.Send(command);

            return(result);
        }
예제 #2
0
        private async void RefreshUser()
        {
            UserSettings.IsRefreshingAuthToken = true;

            try
            {
                await App.RefreshLoginAsync();
            }
            finally
            {
                UserSettings.IsRefreshingAuthToken = false;
            }

            if (UserSettings.IsLoggedIn)
            {
                App.GoToMainPage();
            }
            else
            {
                IsBusy = false;
                MicrosoftLoginCommand.ChangeCanExecute();
                GoogleLoginCommand.ChangeCanExecute();
                NotNowCommand.ChangeCanExecute();
            }
        }
        public async Task <ActionResult <UserDto> > Handle(GoogleLoginCommand request, CancellationToken cancellationToken)
        {
            var payload = await Google.Apis.Auth.GoogleJsonWebSignature.ValidateAsync(request.GoogleUserDto.IdToken, new Google.Apis.Auth.GoogleJsonWebSignature.ValidationSettings
            {
                Audience = new[] { _config["Authentication:Google:ClientId"] }
            });

            var user = await _userManager.FindByLoginAsync("google", payload.Subject);

            if (user != null)
            {
                return(request.Controller.Ok(new UserDto
                {
                    Id = user.Id,
                    FirstName = user.FirstName,
                    LastName = user.LastName,
                    EmployeeNumber = user.EmployeeNumber,
                    Email = user.Email,
                    Token = await _tokenService.CreateToken(user)
                }));
            }

            user = await _userManager.FindByEmailAsync(payload.Email);

            if (user == null)
            {
                user = new AppUser
                {
                    FirstName = payload.GivenName,
                    LastName  = payload.FamilyName,
                    Email     = payload.Email,
                    UserName  = payload.Email
                };

                await _userManager.CreateAsync(user);

                await _userManager.AddToRoleAsync(user, "Customer");
            }

            var info   = new UserLoginInfo("google", payload.Subject, payload.Subject.ToUpperInvariant());
            var result = await _userManager.AddLoginAsync(user, info);

            if (result.Succeeded)
            {
                return(request.Controller.Ok(new UserDto
                {
                    Id = user.Id,
                    FirstName = user.FirstName,
                    LastName = user.LastName,
                    EmployeeNumber = user.EmployeeNumber,
                    Email = user.Email,
                    Token = await _tokenService.CreateToken(user)
                }));
            }

            return(request.Controller.UnprocessableEntity(new ApiResponse(422, "Unable to process GMail account. Please try to login again.")));
        }