diff --git a/app/Extensions/OAuth/OAuthProvider.php b/app/Extensions/OAuth/OAuthProvider.php index 9ecb4aa9b..589d211d9 100644 --- a/app/Extensions/OAuth/OAuthProvider.php +++ b/app/Extensions/OAuth/OAuthProvider.php @@ -10,10 +10,10 @@ class OAuthProvider /** @var OAuthSchemaInterface[] */ private array $providers = []; - /** @return OAuthSchemaInterface[] */ - public function get(): array + /** @return OAuthSchemaInterface[] | OAuthSchemaInterface */ + public function get(?string $id = null): array|OAuthSchemaInterface { - return $this->providers; + return $id ? $this->providers[$id] : $this->providers; } /** @return OAuthSchemaInterface[] */ @@ -32,8 +32,8 @@ class OAuthProvider config()->set('services.' . $provider->getId(), array_merge($provider->getServiceConfig(), ['redirect' => '/auth/oauth/callback/' . $provider->getId()])); - if ($provider->getProviderClass()) { - Event::listen(fn (SocialiteWasCalled $event) => $event->extendSocialite($provider->getId(), $provider->getProviderClass())); + if ($provider->getSocialiteProvider()) { + Event::listen(fn (SocialiteWasCalled $event) => $event->extendSocialite($provider->getId(), $provider->getSocialiteProvider())); } $this->providers[$provider->getId()] = $provider; diff --git a/app/Extensions/OAuth/OAuthSchemaInterface.php b/app/Extensions/OAuth/OAuthSchemaInterface.php index 6fd568e27..6c5e0ebd0 100644 --- a/app/Extensions/OAuth/OAuthSchemaInterface.php +++ b/app/Extensions/OAuth/OAuthSchemaInterface.php @@ -10,7 +10,7 @@ interface OAuthSchemaInterface public function getId(): string; /** @return ?class-string */ - public function getProviderClass(): ?string; + public function getSocialiteProvider(): ?string; /** * @return array diff --git a/app/Extensions/OAuth/Schemas/AuthentikSchema.php b/app/Extensions/OAuth/Schemas/AuthentikSchema.php index 93e7f8ad8..10e9be348 100644 --- a/app/Extensions/OAuth/Schemas/AuthentikSchema.php +++ b/app/Extensions/OAuth/Schemas/AuthentikSchema.php @@ -13,7 +13,7 @@ final class AuthentikSchema extends OAuthSchema return 'authentik'; } - public function getProviderClass(): string + public function getSocialiteProvider(): string { return Provider::class; } diff --git a/app/Extensions/OAuth/Schemas/CommonSchema.php b/app/Extensions/OAuth/Schemas/CommonSchema.php index b3fd5bdd1..cdc1764b4 100644 --- a/app/Extensions/OAuth/Schemas/CommonSchema.php +++ b/app/Extensions/OAuth/Schemas/CommonSchema.php @@ -4,21 +4,17 @@ namespace App\Extensions\OAuth\Schemas; final class CommonSchema extends OAuthSchema { - public function __construct(private string $id, private ?string $providerClass, private ?string $icon, private ?string $hexColor) - { - parent::__construct(); - } + public function __construct( + private readonly string $id, + private readonly ?string $icon, + private readonly ?string $hexColor + ) {} public function getId(): string { return $this->id; } - public function getProviderClass(): ?string - { - return $this->providerClass; - } - public function getIcon(): ?string { return $this->icon; diff --git a/app/Extensions/OAuth/Schemas/DiscordSchema.php b/app/Extensions/OAuth/Schemas/DiscordSchema.php index 7217eff04..39bb33bd9 100644 --- a/app/Extensions/OAuth/Schemas/DiscordSchema.php +++ b/app/Extensions/OAuth/Schemas/DiscordSchema.php @@ -17,7 +17,7 @@ final class DiscordSchema extends OAuthSchema return 'discord'; } - public function getProviderClass(): string + public function getSocialiteProvider(): string { return Provider::class; } diff --git a/app/Extensions/OAuth/Schemas/OAuthSchema.php b/app/Extensions/OAuth/Schemas/OAuthSchema.php index 850152abf..5ed1a1596 100644 --- a/app/Extensions/OAuth/Schemas/OAuthSchema.php +++ b/app/Extensions/OAuth/Schemas/OAuthSchema.php @@ -6,37 +6,13 @@ use App\Extensions\OAuth\OAuthSchemaInterface; use Filament\Forms\Components\Component; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Wizard\Step; -use Illuminate\Support\Facades\Event; use Illuminate\Support\Str; -use SocialiteProviders\Manager\SocialiteWasCalled; abstract class OAuthSchema implements OAuthSchemaInterface { - /** - * @var array - */ - protected static array $providers = []; - - /** - * @return self|static[] - */ - public static function get(?string $id = null): array|self - { - return $id ? static::$providers[$id] : static::$providers; - } - - public function __construct() - { - if ($this->getProviderClass()) { - Event::listen(function (SocialiteWasCalled $event) { - $event->extendSocialite($this->getId(), $this->getProviderClass()); - }); - } - } - abstract public function getId(): string; - public function getProviderClass(): ?string + public function getSocialiteProvider(): ?string { return null; } diff --git a/app/Extensions/OAuth/Schemas/SteamSchema.php b/app/Extensions/OAuth/Schemas/SteamSchema.php index 5ace4db7a..1c29f01f6 100644 --- a/app/Extensions/OAuth/Schemas/SteamSchema.php +++ b/app/Extensions/OAuth/Schemas/SteamSchema.php @@ -16,7 +16,7 @@ final class SteamSchema extends OAuthSchema return 'steam'; } - public function getProviderClass(): string + public function getSocialiteProvider(): string { return Provider::class; } diff --git a/app/Http/Controllers/Auth/OAuthController.php b/app/Http/Controllers/Auth/OAuthController.php index 80a10978c..5b39663b9 100644 --- a/app/Http/Controllers/Auth/OAuthController.php +++ b/app/Http/Controllers/Auth/OAuthController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\Auth; -use App\Extensions\OAuth\Schemas\OAuthSchema; +use App\Extensions\OAuth\OAuthProvider; use App\Filament\Pages\Auth\EditProfile; use App\Http\Controllers\Controller; use App\Models\User; @@ -18,7 +18,8 @@ class OAuthController extends Controller { public function __construct( private readonly AuthManager $auth, - private readonly UserUpdateService $updateService + private readonly UserUpdateService $updateService, + private readonly OAuthProvider $oauthProvider ) {} /** @@ -27,7 +28,7 @@ class OAuthController extends Controller public function redirect(string $driver): RedirectResponse { // Driver is disabled - redirect to normal login - if (!OAuthSchema::get($driver)->isEnabled()) { + if (!$this->oauthProvider->get($driver)->isEnabled()) { return redirect()->route('auth.login'); } @@ -40,7 +41,7 @@ class OAuthController extends Controller public function callback(Request $request, string $driver): RedirectResponse { // Driver is disabled - redirect to normal login - if (!OAuthSchema::get($driver)->isEnabled()) { + if (!$this->oauthProvider->get($driver)->isEnabled()) { return redirect()->route('auth.login'); } diff --git a/app/Providers/Extensions/OAuthServiceProvider.php b/app/Providers/Extensions/OAuthServiceProvider.php index bc53194c2..6f2262607 100644 --- a/app/Providers/Extensions/OAuthServiceProvider.php +++ b/app/Providers/Extensions/OAuthServiceProvider.php @@ -18,14 +18,14 @@ class OAuthServiceProvider extends ServiceProvider $this->app->singleton(OAuthProvider::class, function ($app) { $provider = new OAuthProvider(); // Default OAuth providers included with Socialite - $provider->register(new CommonSchema('facebook', null, 'tabler-brand-facebook-f', '#1877f2')); - $provider->register(new CommonSchema('x', null, 'tabler-brand-x-f', '#1da1f2')); - $provider->register(new CommonSchema('linkedin', null, 'tabler-brand-linkedin-f', '#0a66c2')); - $provider->register(new CommonSchema('google', null, 'tabler-brand-google-f', '#4285f4')); + $provider->register(new CommonSchema('facebook', 'tabler-brand-facebook-f', '#1877f2')); + $provider->register(new CommonSchema('x', 'tabler-brand-x-f', '#1da1f2')); + $provider->register(new CommonSchema('linkedin', 'tabler-brand-linkedin-f', '#0a66c2')); + $provider->register(new CommonSchema('google', 'tabler-brand-google-f', '#4285f4')); $provider->register(new GithubSchema()); $provider->register(new GitlabSchema()); - $provider->register(new CommonSchema('bitbucket', null, 'tabler-brand-bitbucket-f', '#205081')); - $provider->register(new CommonSchema('slack', null, 'tabler-brand-slack', '#6ecadc')); + $provider->register(new CommonSchema('bitbucket', 'tabler-brand-bitbucket-f', '#205081')); + $provider->register(new CommonSchema('slack', 'tabler-brand-slack', '#6ecadc')); // Additional OAuth providers from socialiteproviders.com $provider->register(new AuthentikSchema());