Files
nihonbuzz-academy/app/Http/Controllers/Auth/SocialAuthController.php
2026-01-23 17:28:21 +07:00

90 lines
2.7 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\SocialAccount;
use Exception;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
use Illuminate\Support\Str;
class SocialAuthController extends Controller
{
/**
* Redirect to the provider's authentication page.
*/
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->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;
}
}