middleware('guest')->only(['getRegister', 'postRegister', 'socialRegister']); $this->socialAuthService = $socialAuthService; $this->emailConfirmationService = $emailConfirmationService; $this->userRepo = $userRepo; $this->redirectTo = url('/'); $this->redirectPath = url('/'); parent::__construct(); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|min:2|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|min:8', ]); } /** * Check whether or not registrations are allowed in the app settings. * @throws UserRegistrationException */ protected function checkRegistrationAllowed() { if (!setting('registration-enabled') || config('auth.method') === 'ldap') { throw new UserRegistrationException(trans('auth.registrations_disabled'), '/login'); } } /** * Show the application registration form. * @return Response * @throws UserRegistrationException */ public function getRegister() { $this->checkRegistrationAllowed(); $socialDrivers = $this->socialAuthService->getActiveDrivers(); $samlEnabled = (config('saml2.enabled') === true) && (config('saml2.auto_register') === true); return view('auth.register', [ 'socialDrivers' => $socialDrivers, 'samlEnabled' => $samlEnabled, ]); } /** * Handle a registration request for the application. * @param Request|Request $request * @return RedirectResponse|Redirector * @throws UserRegistrationException */ public function postRegister(Request $request) { $this->checkRegistrationAllowed(); $this->validator($request->all())->validate(); $userData = $request->all(); return $this->registerUser($userData); } /** * Create a new user instance after a valid registration. * @param array $data * @return User */ protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); } /** * The registrations flow for all users. * @param array $userData * @param bool|false|SocialAccount $socialAccount * @param bool $emailVerified * @return RedirectResponse|Redirector * @throws UserRegistrationException */ protected function registerUser(array $userData, $socialAccount = false, $emailVerified = false) { $registrationRestrict = setting('registration-restrict'); if ($registrationRestrict) { $restrictedEmailDomains = explode(',', str_replace(' ', '', $registrationRestrict)); $userEmailDomain = $domain = mb_substr(mb_strrchr($userData['email'], "@"), 1); if (!in_array($userEmailDomain, $restrictedEmailDomains)) { throw new UserRegistrationException(trans('auth.registration_email_domain_invalid'), '/register'); } } $newUser = $this->userRepo->registerNew($userData, $emailVerified); if ($socialAccount) { $newUser->socialAccounts()->save($socialAccount); } if ($this->emailConfirmationService->confirmationRequired() && !$emailVerified) { $newUser->save(); try { $this->emailConfirmationService->sendConfirmation($newUser); } catch (Exception $e) { $this->showErrorNotification(trans('auth.email_confirm_send_error')); } return redirect('/register/confirm'); } auth()->login($newUser); $this->showSuccessNotification(trans('auth.register_success')); return redirect($this->redirectPath()); } /** * Redirect to the social site for authentication intended to register. * @param $socialDriver * @return mixed * @throws UserRegistrationException * @throws SocialDriverNotConfigured */ public function socialRegister($socialDriver) { $this->checkRegistrationAllowed(); session()->put('social-callback', 'register'); return $this->socialAuthService->startRegister($socialDriver); } /** * The callback for social login services. * @param Request $request * @param string $socialDriver * @return RedirectResponse|Redirector * @throws SocialSignInException * @throws UserRegistrationException * @throws SocialDriverNotConfigured */ public function socialCallback(Request $request, string $socialDriver) { if (!session()->has('social-callback')) { throw new SocialSignInException(trans('errors.social_no_action_defined'), '/login'); } // Check request for error information if ($request->has('error') && $request->has('error_description')) { throw new SocialSignInException(trans('errors.social_login_bad_response', [ 'socialAccount' => $socialDriver, 'error' => $request->get('error_description'), ]), '/login'); } $action = session()->pull('social-callback'); // Attempt login or fall-back to register if allowed. $socialUser = $this->socialAuthService->getSocialUser($socialDriver); if ($action == 'login') { try { return $this->socialAuthService->handleLoginCallback($socialDriver, $socialUser); } catch (SocialSignInAccountNotUsed $exception) { if ($this->socialAuthService->driverAutoRegisterEnabled($socialDriver)) { return $this->socialRegisterCallback($socialDriver, $socialUser); } throw $exception; } } if ($action == 'register') { return $this->socialRegisterCallback($socialDriver, $socialUser); } return redirect()->back(); } /** * Detach a social account from a user. * @param $socialDriver * @return RedirectResponse|Redirector */ public function detachSocialAccount($socialDriver) { return $this->socialAuthService->detachSocialAccount($socialDriver); } /** * Register a new user after a registration callback. * @param string $socialDriver * @param SocialUser $socialUser * @return RedirectResponse|Redirector * @throws UserRegistrationException */ protected function socialRegisterCallback(string $socialDriver, SocialUser $socialUser) { $socialUser = $this->socialAuthService->handleRegistrationCallback($socialDriver, $socialUser); $socialAccount = $this->socialAuthService->fillSocialAccount($socialDriver, $socialUser); $emailVerified = $this->socialAuthService->driverAutoConfirmEmailEnabled($socialDriver); // Create an array of the user data to create a new user instance $userData = [ 'name' => $socialUser->getName(), 'email' => $socialUser->getEmail(), 'password' => Str::random(30) ]; return $this->registerUser($userData, $socialAccount, $emailVerified); } }