Files

134 lines
4.1 KiB
PHP
Raw Permalink Normal View History

2024-10-19 23:11:04 -05:00
<?php
2025-01-28 17:33:54 -06:00
declare(strict_types=1);
2024-10-19 23:11:04 -05:00
namespace App\Http\Controllers;
use App\Models\ConnectedAccount;
2025-01-28 17:14:49 -06:00
use App\Models\User;
use App\Notifications\VerifyConnectedAccountNotification;
use Exception;
2024-10-19 23:11:04 -05:00
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Blade;
2025-01-28 17:14:49 -06:00
use Illuminate\Support\MessageBag;
2024-10-19 23:11:04 -05:00
use Laravel\Socialite\Facades\Socialite;
2024-10-19 23:14:15 -05:00
class ConnectedAccountController extends Controller
2024-10-19 23:11:04 -05:00
{
/**
* Redirect the user to the GitHub authentication page.
*/
public function redirectToProvider(string $provider)
{
$this->validateProvider($provider);
return Socialite::driver($provider)->redirect();
}
/**
* Obtain the user information from GitHub.
*/
public function handleProviderCallback(string $provider)
{
$this->validateProvider($provider);
2024-10-20 14:04:26 -05:00
try {
2024-10-20 14:06:07 -05:00
2024-10-20 14:04:26 -05:00
$providerUser = Socialite::driver($provider)->user();
} catch (Exception $e) {
return redirect(route('login'))
->with('errors', new MessageBag([__('Could not login using :provider. Try again later.', ['provider' => config("services.$provider.name")])]));
2024-10-20 14:04:26 -05:00
}
2024-10-19 23:11:04 -05:00
// check if this account is already linked
2025-01-28 17:14:49 -06:00
$connected_account = ConnectedAccount::firstOrNew([
2024-10-19 23:11:04 -05:00
'provider' => $provider,
2025-01-28 17:14:49 -06:00
'provider_id' => $providerUser->id,
2024-10-19 23:11:04 -05:00
], [
'token' => $providerUser->token,
'secret' => $providerUser->tokenSecret,
'refresh_token' => $providerUser->refreshToken,
'expires_at' => $providerUser->expiresIn,
2025-01-28 17:14:49 -06:00
'verified_at' => false,
2024-10-19 23:11:04 -05:00
]);
// already linked and verified, let's go login!
if (
2025-01-28 17:14:49 -06:00
$connected_account->exists
&& ! is_null($connected_account->verified_at)
) {
2024-10-20 13:21:29 -05:00
Auth::login($connected_account->user, true);
2024-10-19 23:11:04 -05:00
return redirect(route('dashboard'));
}
// new user, let's create one
2025-01-28 17:14:49 -06:00
if (! $user = User::where('email', $providerUser->email)->first()) {
2024-10-19 23:11:04 -05:00
$user = User::create([
'name' => $providerUser->name,
'email' => $providerUser->email,
2025-01-28 17:14:49 -06:00
'email_verified_at' => now(),
2024-10-19 23:11:04 -05:00
]);
2025-01-28 17:14:49 -06:00
2024-10-19 23:11:04 -05:00
$connected_account->user_id = $user->id;
$connected_account->verified_at = now();
2024-10-19 23:11:04 -05:00
$connected_account->save();
2025-01-28 17:14:49 -06:00
2024-10-20 13:21:29 -05:00
Auth::login($user, true);
2025-01-28 17:14:49 -06:00
2024-10-19 23:11:04 -05:00
return redirect(route('dashboard'));
}
// email exists already, send verification link
$connected_account->user_id = $user->id;
$connected_account->save();
2024-10-19 23:11:04 -05:00
$user->notify(new VerifyConnectedAccountNotification($connected_account->id));
2024-10-19 23:11:04 -05:00
return redirect(route('login'))
2025-01-28 17:14:49 -06:00
->with('status', __(
'Account already exists. Check your email to connect your :provider account.',
['provider' => config("services.$provider.name")]
));
2024-10-19 23:11:04 -05:00
}
protected function validateProvider($provider): void
{
2025-01-28 17:14:49 -06:00
if (! in_array($provider, explode(',', config('services.enabled_login_providers')))) {
2024-10-19 23:11:04 -05:00
throw new Exception('Please provide a valid social provider.');
}
}
2024-10-20 09:41:25 -05:00
public function verify(ConnectedAccount $connected_account)
2024-10-20 09:41:25 -05:00
{
2025-01-28 17:14:49 -06:00
if (! $connected_account->verified_at) {
2024-10-20 09:41:25 -05:00
// mark request as verified
$connected_account->verified_at = now();
$connected_account->save();
2024-10-20 09:41:25 -05:00
// mark user as verified
$connected_account->user->email_verified_at = now();
$connected_account->user->save();
2024-10-20 09:41:25 -05:00
Auth::login($connected_account->user, true);
2024-10-20 09:41:25 -05:00
}
return redirect(route('dashboard'))->with('toast', json_encode([
'toast' => [
'title' => __('Your :provider account has been connected.', ['provider' => config("services.{$connected_account->provider}.name")]),
'description' => null,
'css' => 'alert-success',
'icon' => Blade::render("<x-ui.icon class='w-7 h-7' name='o-check-circle' />"),
'position' => 'toast-top toast-end',
2025-01-28 17:14:49 -06:00
'timeout' => '5000',
],
]));
2024-10-20 09:41:25 -05:00
}
2024-10-19 23:11:04 -05:00
}