<?php namespace Knuckles\Scribe\Writing\OpenApiSpecGenerators; use Knuckles\Camel\Output\OutputEndpointData; class SecurityGenerator extends OpenApiGenerator { public function root(array $root, array $groupedEndpoints): array { $isApiAuthed = $this->config->get('auth.enabled', false); if (!$isApiAuthed) { return $root; } $location = $this->config->get('auth.in'); $parameterName = $this->config->get('auth.name'); $description = $this->config->get('auth.extra_info'); $scheme = match ($location) { 'query', 'header' => [ 'type' => 'apiKey', 'name' => $parameterName, 'in' => $location, 'description' => $description, ], 'bearer', 'basic' => [ 'type' => 'http', 'scheme' => $location, 'description' => $description, ], default => [], }; return array_merge_recursive($root, [ // All security schemes must be registered in `components.securitySchemes`... 'components' => [ 'securitySchemes' => [ // 'default' is an arbitrary name for the auth scheme. Can be anything, really. 'default' => $scheme, ], ], // ...and then can be applied in `security` 'security' => [ [ 'default' => [], ], ], ]); } public function pathItem(array $pathItem, array $groupedEndpoints, OutputEndpointData $endpoint): array { if (!$endpoint->metadata->authenticated) { // Make sure to exclude non-auth endpoints from auth $pathItem['security'] = []; } return $pathItem; } }