diff --git a/app/Services/Applications/OIDC/OidcConfigResolver.php b/app/Services/Applications/OIDC/OidcConfigResolver.php new file mode 100644 index 0000000..d43ce81 --- /dev/null +++ b/app/Services/Applications/OIDC/OidcConfigResolver.php @@ -0,0 +1,24 @@ +applicationType = $applicationType; + + return $this; + } + + public function hasClientSecret(): bool + { + return ApplicationTypeEnum::SPA !== $this->applicationType; + } +} diff --git a/app/Services/Applications/OIDC/OidcService.php b/app/Services/Applications/OIDC/OidcService.php index 3e8d72e..fd4cead 100644 --- a/app/Services/Applications/OIDC/OidcService.php +++ b/app/Services/Applications/OIDC/OidcService.php @@ -11,6 +11,7 @@ use App\Services\{ApplicationLogoUploader, ConnectedAppService}; use App\Services\Applications\OIDC\Factory\ClientCreationFactory; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; use Throwable; @@ -27,6 +28,10 @@ public function __construct( */ public function createApp(StoreOIDCAppData $data): CreatedApplicationData { + Log::info('Creating OIDC app', [ + 'name' => $data->name, + 'type' => $data->type, + ]); try { DB::beginTransaction(); $logo = $this->logoUploader->store($data->logo); @@ -47,12 +52,23 @@ public function createApp(StoreOIDCAppData $data): CreatedApplicationData // remove sensitive data $appData->settings = null; + Log::info('OIDC app created', [ + 'name' => $data->name, + 'type' => $data->type, + 'clientId' => isset($clientData->clientId), + 'clientSecret' => isset($clientData->clientSecret), + ]); + return new CreatedApplicationData( application: $appData, clientCredentials: $clientData, ); } catch (Throwable $e) { DB::rollBack(); + Log::error('Failed to create OIDC app', [ + 'name' => $data->name, + 'type' => $data->type, + ]); throw $e; } } diff --git a/app/Services/ConnectedAppService.php b/app/Services/ConnectedAppService.php index febdc94..5e9cffb 100644 --- a/app/Services/ConnectedAppService.php +++ b/app/Services/ConnectedAppService.php @@ -34,6 +34,7 @@ function () use ($data): ConnectedAppData { $data->toArray() ); + // Create a permission for this app $this->permissionService->add(ConnectedAppData::from($connectedApp), ConnectedAppPermissonEnum::Use); return ConnectedAppData::from($connectedApp); diff --git a/public/images/app-icon-placeholder.png b/public/images/app-icon-placeholder.png new file mode 100644 index 0000000..dc17eca Binary files /dev/null and b/public/images/app-icon-placeholder.png differ diff --git a/resources/views/pages/apps/oidc/⚡create.blade.php b/resources/views/pages/apps/oidc/⚡create.blade.php index a52ceaf..0d3fa7e 100644 --- a/resources/views/pages/apps/oidc/⚡create.blade.php +++ b/resources/views/pages/apps/oidc/⚡create.blade.php @@ -7,8 +7,8 @@ use App\Livewire\Concerns\Choices\{ChoiceField, WithSearchableChoices}; use App\Livewire\Concerns\WithRepeaterFields; use App\Livewire\Forms\StoreOIDCAppForm; -use App\Services\{Applications\OIDC\OidcService, RoleService}; -use Livewire\Attributes\{Url}; +use App\Services\{Applications\OIDC\OidcConfigResolver, Applications\OIDC\OidcService, RoleService}; +use Livewire\Attributes\{Computed, Url}; use Livewire\Component; use Livewire\WithFileUploads; @@ -34,12 +34,14 @@ class extends Component { public ApplicationTypeEnum $applicationType; private RoleService $roleService; private OidcService $oidcService; + private OidcConfigResolver $configResolver; - public function boot(RoleService $roleService, OidcService $oidcService): void + public function boot(RoleService $roleService, OidcService $oidcService, OidcConfigResolver $configResolver): void { $this->roleService = $roleService; $this->oidcService = $oidcService; + $this->configResolver = $configResolver; } public function mount(): void @@ -60,6 +62,8 @@ public function save(bool $goBack = true): void function () { $data = StoreOIDCAppData::fromArray($this->applicationType, $this->form->pull()); $appdata = $this->oidcService->createApp($data); + + // Show the credentials $this->created = true; $this->clientId = $appdata->clientCredentials->clientId; $this->clientSecret = $appdata->clientCredentials->clientSecret; @@ -111,40 +115,43 @@ protected function choiceFields(): array ), ]; } + + #[Computed] + public function hasClientSecret(): bool + { + return $this->configResolver->for($this->applicationType)->hasClientSecret(); + } }; ?>