oidcService = $oidcService; $this->configResolver = $configResolver; $this->connectedAppService = $connectedAppService; $this->logoUploader = $logoUploader; } public function requiresPkce(Client $client): bool { return $this->configResolver->requiresPkce($client); } public function mount(int $id): void { $this->authorize(AppPermissionEnum::Read->value); $this->appId = $id; $this->loadAppData(); } public function loadAppData(): void { $this->app = ConnectedApp::with(['protocol', 'status', 'roles'])->findOrFail($this->appId); $this->passportClient = $this->oidcService->getPassportClient($this->app); $this->signOutUris = $this->oidcService->getSignOutUris($this->app); } public function generateNewSecret(): void { $this->authorize(AppPermissionEnum::Update->value); if (!$this->passportClient) { $this->error('No corresponding Passport Client found to update.'); return; } $this->attempt( action: function () { $plainSecret = $this->oidcService->generateNewSecret($this->passportClient); $this->newSecretPlain = $plainSecret; $this->success('A new client secret has been generated! Make sure to copy it now.'); $this->loadAppData(); }, successMessage: 'New client secret generated successfully!', showSuccess: false ); } public function changeStatus(string $statusName): void { $this->authorize(AppPermissionEnum::Update->value); $this->attempt( action: function () use ($statusName) { $statusId = ConnectionStatus::where('name', $statusName)->firstOrFail()->id; $request = new ConnectAppRequest( name: $this->app->name, connectionProtocolId: $this->app->connection_protocol_id, connectionProviderId: $this->app->connection_provider_id, slug: $this->app->slug, connectionStatusId: $statusId, settings: $this->app->settings, logo: $this->app->logo, ); $this->connectedAppService->update($this->app->id, $request); $this->loadAppData(); }, successMessage: 'Application status updated successfully!' ); } public function goBack(): void { $this->redirectRoute('apps.index', navigate: true); } public function openEditGeneralModal(): void { $this->editName = $this->app->name; $this->editLogo = null; $this->editGeneralModal = true; } public function saveGeneralInfo(): void { $this->authorize(AppPermissionEnum::Update->value); $this->validate([ 'editName' => 'required|string|max:255', 'editLogo' => 'nullable|image|max:2048', ]); $this->attempt( action: function () { $logoPath = $this->editLogo ? $this->logoUploader->store($this->editLogo) : $this->app->logo; $request = new ConnectAppRequest( name: $this->editName, connectionProtocolId: $this->app->connection_protocol_id, connectionProviderId: $this->app->connection_provider_id, slug: \Illuminate\Support\Str::slug($this->editName), connectionStatusId: $this->app->connection_status_id, settings: $this->app->settings, logo: $logoPath, ); $this->connectedAppService->update($this->app->id, $request); if ($this->passportClient && $this->passportClient->name !== $this->editName) { $this->passportClient->name = $this->editName; $this->passportClient->save(); } $this->editGeneralModal = false; $this->success('Application updated successfully!'); $this->loadAppData(); } ); } public function startEditRedirects(): void { $clientUris = $this->passportClient->redirect_uris ?? []; $this->editSignOutUris = $this->signOutUris; $this->editSignInUris = array_values(array_filter( $clientUris, fn($uri) => !in_array($uri, $this->editSignOutUris, true) )); $this->editRedirectsMode = true; } public function cancelEditRedirects(): void { $this->editRedirectsMode = false; } public function saveRedirectUris(): void { $this->authorize(AppPermissionEnum::Update->value); if (!$this->passportClient) { $this->error('No corresponding Passport Client found to update.'); return; } $signInUris = array_values(array_filter(array_map('trim', $this->editSignInUris))); $signOutUris = array_values(array_filter(array_map('trim', $this->editSignOutUris))); $this->attempt( action: function () use ($signInUris, $signOutUris) { $this->oidcService->updateRedirectUris($this->app, $this->passportClient, $signInUris, $signOutUris); $this->editRedirectsMode = false; $this->success('Redirect URIs updated successfully!'); $this->loadAppData(); } ); } }; ?>

{{ $app->name }}

Protocol: {{ strtoupper($app->protocol->name) }}

@if($newSecretPlain)
@endif @if(!$passportClient) @endif
Client ID
@if($passportClient) @endif
Public identifier for the client that is required for all OAuth flows.
Client Authentication
Proof Key for Code Exchange (PKCE)
@if($passportClient) @endif
@if($passportClient) @else @endif
Creation date Secret Status
{{ $passportClient->updated_at?->format('M j, Y H:i:s') ?? 'N/A' }} •••••••••••••••••••••••••••••••••••••••• {{ !$passportClient->revoked ? 'Active' : 'Revoked' }}
No secrets available
@if($editRedirectsMode)
@else @endif
@if($editRedirectsMode) @else @php $onlySignInUris = array_values(array_filter( $passportClient?->redirect_uris ?? [], fn($uri) => !in_array($uri, $signOutUris, true) )); @endphp @if(!empty($onlySignInUris)) @foreach($onlySignInUris as $uri)
{{ $uri }}
@endforeach @else No Sign In Redirect URIs configured @endif @endif
@if($editRedirectsMode) @else @if(!empty($signOutUris)) @foreach($signOutUris as $uri)
{{ $uri }}
@endforeach @else No Sign Out Redirect URIs configured @endif @endif
@forelse($app->roles as $role) @empty @endforelse
Role Name Priority Access Type
{{ $role->name }} {{ $role->priority }} SSO Access
No specific roles assigned. Accessible by everyone depending on user access setting.
openid

Allows the application to fetch ID tokens for authenticating users.

profile

Allows reading default profile fields like name, picture, and locale.

email

Grants access to the user's primary email address.

offline_access

Allows requesting refresh tokens to maintain access offline.