redirect(); } /** * Obtain the user information from the provider. */ public function handleProviderCallback($provider) { try { $socialUser = Socialite::driver($provider)->user(); } catch (Exception $e) { return redirect()->route('login')->with('error', 'Authentication failed.'); } $user = $this->findOrCreateUser($socialUser, $provider); Auth::login($user, true); return redirect()->intended(route('dashboard')); } /** * Find or create a user based on social account information. */ protected function findOrCreateUser($socialUser, $provider) { $account = SocialAccount::where('provider', $provider) ->where('provider_id', $socialUser->getId()) ->first(); if ($account) { // Update tokens $account->update([ 'token' => $socialUser->token, 'refresh_token' => $socialUser->refreshToken, 'expires_at' => $socialUser->expiresIn ? now()->addSeconds($socialUser->expiresIn) : null, ]); return $account->user; } // Check if user with same email exists $user = User::where('email', $socialUser->getEmail())->first(); if (!$user) { // Create a new user $user = User::create([ 'name' => $socialUser->getName() ?? $socialUser->getNickname() ?? 'User', 'email' => $socialUser->getEmail(), 'avatar_url' => $socialUser->getAvatar(), 'password' => null, // Social users don't need a local password initially ]); // Assign default role $user->assignRole('student'); } // Link social account SocialAccount::create([ 'user_id' => $user->id, 'provider' => $provider, 'provider_id' => $socialUser->getId(), 'token' => $socialUser->token, 'refresh_token' => $socialUser->refreshToken, 'expires_at' => $socialUser->expiresIn ? now()->addSeconds($socialUser->expiresIn) : null, ]); return $user; } }