storeUtmParameters($request); return Socialite::driver('github') ->scopes(['read:user', 'user:email']) ->redirect(); } public function callback(): RedirectResponse { try { $githubUser = Socialite::driver('github')->user(); } catch (\Exception) { return redirect()->route('login'); } if (Auth::check()) { return $this->connectToCurrentUser(Auth::user(), (string) $githubUser->getId()); } $user = User::where('github_id', (string) $githubUser->getId()) ->when($githubUser->getEmail(), fn ($query, $email) => $query->orWhere('email', $email)) ->first(); if ($user) { return $this->loginExistingUser($user, (string) $githubUser->getId()); } if (! $githubUser->getEmail()) { return redirect()->route('login')->withErrors([ 'email' => __('auth.github_email_unavailable'), ]); } return $this->registerNewUser($githubUser); } private function connectToCurrentUser(User $user, string $githubId): RedirectResponse { $existing = User::where('github_id', $githubId) ->where('id', '!=', $user->id) ->first(); if ($existing) { return redirect()->route('app.authentication.edit') ->with('flash.error', __('settings.authentication.providers.flash_already_linked', ['provider' => 'GitHub'])); } if ($user->github_id !== $githubId) { $user->update(['github_id' => $githubId]); } return redirect()->route('app.authentication.edit') ->with('flash.success', __('settings.authentication.providers.flash_connected', ['provider' => 'GitHub'])); } private function loginExistingUser(User $user, string $githubId): RedirectResponse { if (! $user->github_id) { $user->update(['github_id' => $githubId]); } if (! $user->hasVerifiedEmail()) { $user->markEmailAsVerified(); } Auth::login($user, remember: true); $this->retrieveUtmParameters(); return redirect()->route('app.home'); } private function registerNewUser(\Laravel\Socialite\Contracts\User $githubUser): RedirectResponse { $utmParameters = $this->retrieveUtmParameters(); $user = CreateUser::execute([ 'name' => $githubUser->getName() ?? $githubUser->getNickname() ?? explode('@', $githubUser->getEmail())[0], 'email' => $githubUser->getEmail(), 'github_id' => (string) $githubUser->getId(), 'email_verified_at' => now(), 'registration_ip' => request()->ip(), ], $utmParameters); event(new Registered($user)); Auth::login($user, remember: true); session()->flash('auth_provider', 'github'); return redirect()->route('register.success', $utmParameters); } }