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
+
:::