forked from TFMM/silent-auction
69 lines
2.1 KiB
PHP
69 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Auth;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Laravel\Socialite\Facades\Socialite;
|
|
use Illuminate\Support\Str;
|
|
|
|
class SocialiteController extends Controller
|
|
{
|
|
public function redirectToProvider($provider)
|
|
{
|
|
return Socialite::driver($provider)->redirect();
|
|
}
|
|
|
|
public function handleProviderCallback($provider)
|
|
{
|
|
try {
|
|
$socialUser = Socialite::driver($provider)->user();
|
|
} catch (\Exception $e) {
|
|
return redirect('/login')->with('error', 'Authentication failed.');
|
|
}
|
|
|
|
if (Auth::check()) {
|
|
$user = Auth::user();
|
|
$user->update([
|
|
'provider_name' => $provider,
|
|
'provider_id' => $socialUser->getId(),
|
|
]);
|
|
|
|
return redirect()->intended('/admin')->with('status', 'Account linked successfully!');
|
|
}
|
|
|
|
// Find user by provider_id
|
|
$user = User::where('provider_name', $provider)
|
|
->where('provider_id', $socialUser->getId())
|
|
->first();
|
|
|
|
if (!$user) {
|
|
// Find user by email to link
|
|
$user = User::where('email', $socialUser->getEmail())->first();
|
|
|
|
if ($user) {
|
|
// Link the account
|
|
$user->update([
|
|
'provider_name' => $provider,
|
|
'provider_id' => $socialUser->getId(),
|
|
]);
|
|
} else {
|
|
// Optionally create a new user
|
|
$user = User::create([
|
|
'name' => $socialUser->getName() ?? $socialUser->getNickname() ?? $socialUser->getEmail(),
|
|
'email' => $socialUser->getEmail(),
|
|
'provider_name' => $provider,
|
|
'provider_id' => $socialUser->getId(),
|
|
'password' => bcrypt(Str::random(24)),
|
|
]);
|
|
}
|
|
}
|
|
|
|
Auth::login($user);
|
|
|
|
return redirect()->intended('/admin'); // Redirect to filament admin or home
|
|
}
|
|
}
|