mirror of
https://github.com/nihonbuzz/nihonbuzz-academy.git
synced 2026-01-26 05:25:37 +07:00
90 lines
2.7 KiB
PHP
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;
|
|
}
|
|
}
|