Безпека

← Безпека

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/rest-bundle/security.md новий файл +40 −0

1 + # Безпека
2 +
3 + Бандл використовує безпеку JsonRpcBundle (`ufo_json_rpc.security`, див. [Налаштування бандлу](/docs/api/json-rpc-bundle/config)); окремої REST-конфігурації немає.
4 +
5 + ```yaml
6 + # config/packages/ufo_json_rpc.yaml
7 + ufo_json_rpc:
8 + security:
9 + protected_api: true # за замовчуванням: виклики потребують токена
10 + protected_doc: false # за замовчуванням: документація відкрита
11 + token_name: 'Ufo-RPC-Token'
12 + clients_tokens:
13 + - '%env(resolve:UFO_API_TOKEN)%'
14 + providers:
15 + partners:
16 + api_groups: [partners]
17 + clients_tokens: ['%env(PARTNERS_TOKEN)%']
18 + internal:
19 + api_groups: [internal]
20 + service: App\Security\InternalTokenValidator # реалізує ITokenValidator
21 + ```
22 +
23 + | Запит | Перевірка | Помилка |
24 + | --- | --- | --- |
25 + | REST-виклик | `protected_api`: токен із заголовка `token_name` перевіряє провайдер групи API входу, а для груп без провайдера — `clients_tokens` | `401` |
26 + | OpenAPI / Postman | `protected_doc`: та сама перевірка для групи документа | `401` |
27 +
28 + ```bash
29 + curl https://example.com/internal/catalog/list -H 'Ufo-RPC-Token: internal-secret'
30 + ```
31 +
32 + * Групу визначає маршрут (`defaults.api_group` імпорту), тож токен однієї групи не відкриває вхід іншої. Параметр `api_group` у запиті групу не змінює.
33 + * Провайдер задає або `clients_tokens`, або `service`, що реалізує `Ufo\JsonRpcBundle\Security\Interfaces\ITokenValidator` ([Провайдери для груп API](/docs/api/json-rpc-bundle/config)).
34 + * JSON-RPC повертає `403` для недійсного токена; REST повертає `401` і для відсутнього, і для недійсного.
35 + * `protected_doc` не захищає виклики, а `protected_api` — документацію: це два незалежні прапорці.
36 + * Firewall-и Symfony Security діють на REST-шляхи так само, як на будь-які інші маршрути.
37 +
38 + :::warning
39 + CORS preflight (`OPTIONS`) REST-маршрути не обробляють: якщо `OPTIONS` немає в `methods` атрибута `#[Route]`, відповідь — `405`. Налаштуйте CORS на рівні вебсервера або окремого бандла.
40 + :::