mirror of
https://github.com/nihonbuzz/nihonbuzz-academy.git
synced 2026-01-26 05:25:37 +07:00
first commit
This commit is contained in:
89
app/Http/Controllers/Auth/SocialAuthController.php
Normal file
89
app/Http/Controllers/Auth/SocialAuthController.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user