redirect() : redirect('/error?err=sso_disabled'); } /** * Register (if needed) the user and authenticate him * * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse */ public function callback(Request $request, string $driver) { try { $socialiteUser = Socialite::driver($driver)->user(); } catch (\Exception $e) { Log::error($e); return redirect('/error?err=sso_failed'); } $uniqueName = $socialiteUser->getId() . '@' . $driver; $socialiteEmail = $socialiteUser->getEmail() ?? $uniqueName; $socialiteName = ($socialiteUser->getNickname() ?? $socialiteUser->getName()) . ' (' . $uniqueName . ')'; /** @var User|null $user */ $user = User::firstOrNew([ 'oauth_id' => $socialiteUser->getId(), 'oauth_provider' => $driver, ]); if (! $user->exists) { if (User::where('email', $socialiteEmail)->exists()) { return redirect('/error?err=sso_email_already_used'); } elseif (User::count() === 0) { $user->promoteToAdministrator(); } elseif (Settings::get('disableRegistration') && ! Settings::get('keepSsoRegistrationEnabled')) { return redirect('/error?err=sso_no_register'); } $user->password = bcrypt(Str::random()); } $user->email = $socialiteEmail; $user->name = $socialiteName; $user->last_seen_at = Carbon::now()->format('Y-m-d H:i:s'); $user->save(); Auth::guard()->login($user); return redirect('/accounts'); } }