middleware('guest'); $this->socialAuthService = $socialAuthService; $this->emailConfirmationService = $emailConfirmationService; $this->userRepo = $userRepo; $this->redirectTo = baseUrl('/'); $this->redirectPath = baseUrl('/'); $this->username = config('auth.method') === 'standard' ? 'email' : 'username'; 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|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|min:6', ]); } /** * Check whether or not registrations are allowed in the app settings. * @throws UserRegistrationException */ protected function checkRegistrationAllowed() { if (!setting('registration-enabled')) { throw new UserRegistrationException('Registrations are currently disabled.', '/login'); } } /** * Show the application registration form. * @return Response */ public function getRegister() { $this->checkRegistrationAllowed(); $socialDrivers = $this->socialAuthService->getActiveDrivers(); return view('auth.register', ['socialDrivers' => $socialDrivers]); } /** * Handle a registration request for the application. * @param Request|\Illuminate\Http\Request $request * @return Response * @throws UserRegistrationException * @throws \Illuminate\Foundation\Validation\ValidationException */ public function postRegister(Request $request) { $this->checkRegistrationAllowed(); $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException( $request, $validator ); } $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' => bcrypt($data['password']), ]); } /** * The registrations flow for all users. * @param array $userData * @param bool|false|SocialAccount $socialAccount * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws UserRegistrationException * @throws ConfirmationEmailException */ protected function registerUser(array $userData, $socialAccount = false) { if (setting('registration-restrict')) { $restrictedEmailDomains = explode(',', str_replace(' ', '', setting('registration-restrict'))); $userEmailDomain = $domain = substr(strrchr($userData['email'], "@"), 1); if (!in_array($userEmailDomain, $restrictedEmailDomains)) { throw new UserRegistrationException('That email domain does not have access to this application', '/register'); } } $newUser = $this->userRepo->registerNew($userData); if ($socialAccount) { $newUser->socialAccounts()->save($socialAccount); } if (setting('registration-confirmation') || setting('registration-restrict')) { $newUser->save(); $this->emailConfirmationService->sendConfirmation($newUser); return redirect('/register/confirm'); } auth()->login($newUser); session()->flash('success', 'Thanks for signing up! You are now registered and signed in.'); return redirect($this->redirectPath()); } /** * Show the page to tell the user to check their email * and confirm their address. */ public function getRegisterConfirmation() { return view('auth/register-confirm'); } /** * Confirms an email via a token and logs the user into the system. * @param $token * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws UserRegistrationException */ public function confirmEmail($token) { $confirmation = $this->emailConfirmationService->getEmailConfirmationFromToken($token); $user = $confirmation->user; $user->email_confirmed = true; $user->save(); auth()->login($user); session()->flash('success', 'Your email has been confirmed!'); $this->emailConfirmationService->deleteConfirmationsByUser($user); return redirect($this->redirectPath); } /** * Shows a notice that a user's email address has not been confirmed, * Also has the option to re-send the confirmation email. * @return \Illuminate\View\View */ public function showAwaitingConfirmation() { return view('auth/user-unconfirmed'); } /** * Resend the confirmation email * @param Request $request * @return \Illuminate\View\View */ public function resendConfirmation(Request $request) { $this->validate($request, [ 'email' => 'required|email|exists:users,email' ]); $user = $this->userRepo->getByEmail($request->get('email')); $this->emailConfirmationService->sendConfirmation($user); session()->flash('success', 'Confirmation email resent, Please check your inbox.'); return redirect('/register/confirm'); } /** * Redirect to the social site for authentication intended to register. * @param $socialDriver * @return mixed */ public function socialRegister($socialDriver) { $this->checkRegistrationAllowed(); session()->put('social-callback', 'register'); return $this->socialAuthService->startRegister($socialDriver); } /** * The callback for social login services. * @param $socialDriver * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws SocialSignInException */ public function socialCallback($socialDriver) { if (session()->has('social-callback')) { $action = session()->pull('social-callback'); if ($action == 'login') { return $this->socialAuthService->handleLoginCallback($socialDriver); } elseif ($action == 'register') { return $this->socialRegisterCallback($socialDriver); } } else { throw new SocialSignInException('No action defined', '/login'); } return redirect()->back(); } /** * Detach a social account from a user. * @param $socialDriver * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function detachSocialAccount($socialDriver) { return $this->socialAuthService->detachSocialAccount($socialDriver); } /** * Register a new user after a registration callback. * @param $socialDriver * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws UserRegistrationException */ protected function socialRegisterCallback($socialDriver) { $socialUser = $this->socialAuthService->handleRegistrationCallback($socialDriver); $socialAccount = $this->socialAuthService->fillSocialAccount($socialDriver, $socialUser); // 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); } }