Зміни в документі 2. Налаштування бандла

Остання зміна 2024/07/11 11:49 автором Ashterix

Від версії 4.1
редаговано Ashterix
дата 2024/07/11 11:41
Змінити коментар: Немає коментарів для цієї версії
До версії 2.2
редаговано Ashterix
дата 2024/07/11 10:05
Змінити коментар: Немає коментарів для цієї версії

Підсумок

Подробиці

Властивості сторінки
Вміст
... ... @@ -16,28 +16,37 @@
16 16  
17 17  Наразі єдиним механізмом захисту доступу до вашого API є встановлення перевірки ключа доступу (api_token).
18 18  
19 -== Параметри {{code language="none"}}protected_api{{/code}} та {{code language="none"}}protected_doc{{/code}} (boolean) ==
19 +== Параметр {{code language="none"}}protected_methods{{/code}} ==
20 20  
21 21  (% class="wikigeneratedid" %)
22 і параметри вказує чи мають бути захищені API методи та документація, відповідно.
22 ей параметр приймає масив назв http методів, які мають бути захищені.
23 23  
24 24  (% class="wikigeneratedid" %)
25 -За замовченням апі методи захищені, а документація відкрита.
25 +За замовченням ввімкнут захист лише для методу POST. Ви можете:
26 26  
27 +* вказати пустий масив {{code language="none"}}[]{{/code}} щоб зробити API повністю відкритим
28 +
27 27  {{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
28 28  ufo_json_rpc:
29 29   security:
30 - protected_api: true # Protection API requests
31 - protected_doc: false # Protection API documentation
32 + protected_methods: []
32 32  {{/code}}
33 33  
34 -(% id="cke_bm_164641S" style="display:none" %) (%%)Якщо ви захищаєте ваш API через {{code language="none"}}protected_api{{/code}}, вам необхідно налаштувати токени, по яким буде відкритий доступ.
35 +* вказати додатково захист для методу GET, що зробить запит документації недоступним без токену в заголовках запиту
35 35  
37 +{{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
38 +ufo_json_rpc:
39 + security:
40 + protected_methods: ['GET', 'POST']
41 +{{/code}}
42 +
43 +(% id="cke_bm_164641S" style="display:none" %) (%%)Якщо ви захищаєте ваш API через {{code language="none"}}protected_methods{{/code}}, вам необхідно налаштувати токени, по яким буде відкритий доступ.
44 +
36 36  Перш за все, треба визначитися з назвою токену.
37 37  
38 -== Параметр {{code language="none"}}token_name{{/code}} ==
47 +== Параметр {{code language="none"}}token_key_in_header{{/code}} ==
39 39  
40 -Компонент {{code language="none"}}RpcSecurity{{/code}} буде шукати в заголовках запиту специфічний ключ, який ви можете встановити в налаштуваннях пакету, значення за замовченням {{code language="none"}}token_name: 'Ufo-RPC-Token'{{/code}}, ви можете встановити будь-яке інше значення яке відповідає наступним вимогам.
49 +Компонент {{code language="none"}}RpcSecurity{{/code}} буде шукати в заголовках запиту специфічний ключ, який ви можете встановити в налаштуваннях пакету, значення за замовченням {{code language="none"}}token_key_in_header: 'Ufo-RPC-Token'{{/code}}, ви можете встановити будь-яке інше значення яке відповідає наступним вимогам.
41 41  
42 42  {{spoiler title=" Вимоги до формування заголовків протоколу HTTP"}}
43 43  Вимоги до назв заголовків HTTP не є строго регульованими щодо капіталізації, оскільки HTTP заголовки нечутливі до регістру. Однак, існують деякі загальні практики і стандарти, які зазвичай дотримуються для кращої читабельності та узгодженості:
... ... @@ -57,17 +57,8 @@
57 57  
58 58  
59 59  
69 +== Параметр {{code language="none"}}clients_tokens{{/code}} ==
60 60  
61 -
62 -
63 -
64 -
65 -
66 -
67 -
68 -
69 -Параметр {{code language="none"}}clients_tokens{{/code}}
70 -
71 71  Тепер слід вказати масив клієнтськіх токенів, які будуть мати доступ до API.
72 72  
73 73  Тут є певна варіативність.
... ... @@ -87,7 +87,8 @@
87 87  {{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
88 88  ufo_json_rpc:
89 89   security:
90 - token_name: 'Ufo-RPC-Token'
90 + protected_methods: ['GET', 'POST']
91 + token_key_in_header: 'Ufo-RPC-Token'
91 91   clients_tokens:
92 92   - 'ClientTokenExample' # hardcoded token example. Importantly!!! Replace or delete it!
93 93  
... ... @@ -108,6 +108,7 @@
108 108  {{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
109 109  ufo_json_rpc:
110 110   security:
112 + protected_methods: ['GET', 'POST']
111 111   token_key_in_header: 'Ufo-RPC-Token'
112 112   clients_tokens:
113 113   - '%env(resolve:TOKEN_FOR_APP_1)%' # token example from .env.local
... ... @@ -190,34 +190,76 @@
190 190  
191 191  = Блок {{code language="none"}}docs{{/code}} =
192 192  
193 -Цей блок налаштовує деякі параметри генерації документації коли ви робите GET запит на RPC Server.
195 +Це блок який налаштовує генерацію документації коли ви робите GET запит на RPC Server
194 194  
195 -(% class="box infomessage" %)
196 -(((
197 -Починаючи з версії 7, JsonRpcBundle генерує API документацію, що відповідає специфікації [[OpenRpc>>https://spec.open-rpc.org/]]
198 -)))
197 +== Секція {{code language="none"}}response{{/code}} ==
199 199  
200 -* {{code language="none"}}project_name{{/code}}: Назва проєкту, що буде відображена в документації
201 -* {{code language="none"}}project_description{{/code}}: Опис проєкту
202 -* {{code language="none"}}project_version{{/code}}: Поточна версія вашого API
203 -* {{code language="none"}}async_dsn_info{{/code}}: Відповідає за відображення в документації інформації про асинхронний транспорт
204 -* (% id="cke_bm_826282S" style="display:none" %){{code language="none"}}validations.symfony_asserts{{/code}}(%%): <bool> Відповідає за відображення рядку очікувань валідації для параметра (якщо ви використовуєте [[валідацію>>doc:docs.JsonRpcBundle.add_rpc_service.assertions.WebHome]])
199 +Містить налаштування, що відповідають за вміст відповіді.
205 205  
201 +=== Параметр {{code language="none"}}key_for_methods{{/code}} ===
202 +
203 +Цей параметр дозволяє вказати назву ключа у відповіді в якій буде віддаватися масив доступних сервісів.
204 +
205 +Значення за замовченням {{code language="none"}}methods{{/code}}. Може мати будь-яке значення типу рядок.
206 +
206 206  {{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
207 207  ufo_json_rpc:
208 208   docs:
209 - project_name: 'My Project'
210 - project_description: 'My project description'
211 - project_version: '1.0'
212 - # Optional response details
213 - async_dsn_info: false # Provide information about API that work asynchronously
214 - validations:
215 - symfony_asserts: false # Indicates if an array of Symfony validation constraints is used
210 + key_for_methods: methods
211 +{{/code}}
216 216  
213 +{{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
214 +ufo_json_rpc:
215 + docs:
216 + key_for_methods: services
217 217  {{/code}}
218 218  
219 +{{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
220 +ufo_json_rpc:
221 + docs:
222 + key_for_methods: some_custom_key
223 +{{/code}}
224 +
225 +=== Параметр {{code language="none"}}async_dsn_info{{/code}} ===
226 +
227 +Відповідає за відображення в документації інформації про асинхронний транспорт.
228 +
229 +{{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
230 +ufo_json_rpc:
231 + async_dsn_info: true # or false
232 +{{/code}}
233 +
234 +==== **Приклад документації ** ====
235 +
236 +{{code language="json" layout="LINENUMBERS" title="GET: /api"}}
237 +{
238 + "envelope": "JSON-RPC-2.0/UFO-RPC-6",
239 + "contentType": "application/json",
240 + "description": "",
241 + "transport": {
242 + "sync": {
243 + "scheme": "http",
244 + "host": "example.com",
245 + "path": "/api",
246 + "method": "POST"
247 + },
248 + "async": {
249 + "scheme": "amqp",
250 + "user": "{user}",
251 + "pass": "{pass}",
252 + "host": "async_rabbit",
253 + "port": 5672,
254 + "path": "/%2f/json-rpc"
255 + }
256 + },
257 + "methods": {
258 + ...
259 + }
260 +}
261 +{{/code}}
262 +
219 219  {{info}}
220 -Не переймайтеся щодо безпеки ваших авторизаційних даних, що містяться в DSN.
264 +Не переймайтеся щодо безпеки ваших авторизаційних даних. що містяться в DSN.
221 221  
222 222  Документатор побудований таким чином, що перед виводом інформації про DSN він видаляє дані про користувача і його пароль, а також інші секретні дані, як то токени, секретні ключі, тощо.
223 223  
... ... @@ -237,82 +237,159 @@
237 237  {{/code}}
238 238  {{/info}}
239 239  
240 -=== Приклад документації ===
284 +=== Параметр {{code language="none"}}validations{{/code}} ===
241 241  
286 +Відповідає за відображення в документації методів додаткових блоків, що вказують на вимоги до валідації даних.
287 +
288 +Наразі цей блок має два можливих налаштування:
289 +
290 +* {{code language="none"}}json_schema: <bool>{{/code}}
291 +* {{code language="none"}}symfony_asserts: <bool>{{/code}}
292 +
293 +У всіх опцій в цьому параметрі значення за замовченням {{code language="none"}}false{{/code}}, тобто ці блоки не будуть відображатися в документації.
294 +Якщо ви потребуєте якийсь з цих блоків інформації при запиті документації, то встановіть значення в {{code language="none"}}true{{/code}}.
295 +
296 +{{code language="yaml" layout="LINENUMBERS" title="config/packages/ufo_json_rpc.yaml"}}
297 +ufo_json_rpc:
298 + docs:
299 + json_schema: true
300 + symfony_asserts: true
301 +{{/code}}
302 +
303 +==== **Приклад документації ** ====
304 +
305 +(% class="box infomessage" %)
306 +(((
307 +В цьому прикладі я видалив вміст обʼєктів symfony_assertions для спрощення прикладу.
308 +Детальніше про валідацію методів дивись сторінку **[[Валідація процедур>>doc:docs.JsonRpcBundle.add_rpc_service.assertions.WebHome]]**
309 +)))
310 +
242 242  {{code language="json" layout="LINENUMBERS" title="GET: /api"}}
243 243  {
244 - "openrpc":"1.2.6",
245 - "info":{
246 - "title":"My Project",
247 - "description":"My project description",
248 - "contact":{
249 - "name":"ufo-tech/json-rpc-bundle",
250 - "url":"https://docs.ufo-tech.space/bin/view/docs/JsonRpcBundle/?language=en"
251 - },
252 - "license":{
253 - "name":"MIT"
254 - },
255 - "version":"1.0"
256 - },
257 - "servers":[
258 - {
259 - "url":"https://mysite.com/api",
260 - "description":"Json-RPC api server from UFO Tec\n\nUFO Tech, or Universal Flexible Open Technologies, is an initiative aimed at providing PHP developers with tools to create complex yet user-friendly solutions for modern web applications and service-oriented architectures.",
261 - "name":"UFO Json-RPC Server v.7.0.0",
262 - "x-method":"POST",
263 - "x-ufo":{
264 - "envelop":"JSON-RPC-2.0/UFO-RPC-7.0.0",
265 - "transport":{
266 - "sync":{
267 - "scheme":"https",
268 - "host":"mysite.com",
269 - "path":"/api",
270 - "method":"POST"
271 - },
272 - "async":{
273 - "scheme":"amqp",
274 - "user":"{user}",
275 - "pass":"{pass}",
276 - "host":"mysite.com",
277 - "port":5672,
278 - "path":"/%2f/json-rpc"
279 - }
313 + "envelope": "JSON-RPC-2.0/UFO-RPC-6",
314 + "contentType": "application/json",
315 + "description": "",
316 + "transport": {
317 + "sync": {
318 + "scheme": "https",
319 + "host": "example.com",
320 + "path": "/api",
321 + "method": "POST"
322 + }
323 + },
324 + "methods": {
325 + "getUserNameByUuid": {
326 + "name": "getUserNameByUuid",
327 + "description": "Get username by id",
328 + "parameters": {
329 + "userId": {
330 + "type": "string",
331 + "name": "userId",
332 + "description": "User id in uuid format",
333 + "optional": false
334 + }
280 280   },
281 - "documentation":{
282 - "json-rpc":"https://www.jsonrpc.org/specification",
283 - "ufo-tech/json-rpc-bundle":"https://docs.ufo-tech.space/bin/view/docs/JsonRpcBundle/?language=en"
336 + "returns": "string",
337 + "responseFormat": "string",
338 + "json_schema": {
339 + "$schema": "http://json-schema.org/draft-07/schema#",
340 + "type": "object",
341 + "properties": {
342 + "userId": {
343 + "type": "string"
344 + }
345 + },
346 + "required": [
347 + "userId"
348 + ]
349 + },
350 + "symfony_assertions": {
351 + "userId": [
352 + {
353 + "class": "Symfony\\Component\\Validator\\Constraints\\Uuid",
354 + "context": {}
355 + }
356 + ]
284 284   }
285 - }
286 - }
287 - ],
288 - "methods":[
289 - {
290 - "name":"getUserNameByUuid",
291 - "tags":[
292 - {
293 - "name":"App\\Api\\UserApiService"
358 + },
359 + "sendEmail": {
360 + "name": "sendEmail",
361 + "description": "Send mail",
362 + "parameters": {
363 + "email": {
364 + "type": "string",
365 + "name": "email",
366 + "description": "",
367 + "optional": false
368 + },
369 + "subject": {
370 + "type": "string",
371 + "name": "subject",
372 + "description": "",
373 + "optional": false
374 + },
375 + "text": {
376 + "type": "string",
377 + "name": "text",
378 + "description": "",
379 + "optional": false
380 + }
381 + },
382 + "returns": "boolean",
383 + "responseFormat": "boolean",
384 + "json_schema": {
385 + "$schema": "http://json-schema.org/draft-07/schema#",
386 + "type": "object",
387 + "properties": {
388 + "email": {
389 + "type": "string",
390 + "format": "email"
391 + },
392 + "subject": {
393 + "type": "string",
394 + "minLength": 1,
395 + "maxLength": 100
396 + },
397 + "text": {
398 + "type": "string",
399 + "minLength": 10
400 + }
401 + },
402 + "required": [
403 + "email",
404 + "subject",
405 + "text"
406 + ]
407 + },
408 + "symfony_assertions": {
409 + "email": [
410 + {
411 + "class": "Symfony\\Component\\Validator\\Constraints\\Email",
412 + "context": {}
413 + }
414 + ],
415 + "subject": [
416 + {
417 + "class": "Symfony\\Component\\Validator\\Constraints\\NotBlank",
418 + "context": {}
419 + },
420 + {
421 + "class": "Symfony\\Component\\Validator\\Constraints\\Length",
422 + "context": {}
423 + }
424 + ],
425 + "text": [
426 + {
427 + "class": "Symfony\\Component\\Validator\\Constraints\\NotBlank",
428 + "context": {}
429 + },
430 + {
431 + "class": "Symfony\\Component\\Validator\\Constraints\\Length",
432 + "context": {}
433 + }
434 + ]
294 294   }
295 - ],
296 - "summary":"Get username by id",
297 - "params":[
298 - {
299 - "name":"userId",
300 - "description":"User Id format uuid",
301 - "required":true,
302 - "schema":{
303 - "type":"string"
304 - },
305 - "x-ufo-assertions": "new Assert\\Uuid()"
306 - }
307 - ],
308 - "result":{
309 - "name":"string",
310 - "description":"User Name",
311 - "schema":{
312 - "type":"string"
313 - }
314 - }
315 - }
316 - ]
436 + }
437 + }
317 317  }
318 318  {{/code}}