@toa.io/extensions.exposition 1.0.0-alpha.3 → 1.0.0-alpha.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -8
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +5 -2
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +20 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +3 -3
  17. package/components/identity.basic/operations/transit.js +5 -3
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +2 -0
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +32 -0
  23. package/components/identity.basic/source/transit.ts +7 -5
  24. package/components/identity.basic/source/types.ts +2 -0
  25. package/components/identity.federation/manifest.toa.yaml +28 -17
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +6 -5
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/incept.d.ts +11 -0
  30. package/components/identity.federation/operations/{create.js → incept.js} +6 -7
  31. package/components/identity.federation/operations/incept.js.map +1 -0
  32. package/components/identity.federation/operations/lib/jwt.d.ts +4 -5
  33. package/components/identity.federation/operations/lib/jwt.js +3 -3
  34. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  36. package/components/identity.federation/operations/types/configuration.d.ts +15 -0
  37. package/components/identity.federation/operations/types/configuration.js +3 -0
  38. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  39. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +8 -3
  40. package/components/identity.federation/operations/types/context.js +3 -0
  41. package/components/identity.federation/operations/types/context.js.map +1 -0
  42. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  43. package/components/identity.federation/operations/{types.js → types/entity.js} +1 -1
  44. package/components/identity.federation/operations/types/entity.js.map +1 -0
  45. package/components/identity.federation/operations/types/index.d.ts +3 -0
  46. package/components/identity.federation/operations/types/index.js +20 -0
  47. package/components/identity.federation/operations/types/index.js.map +1 -0
  48. package/components/identity.federation/source/authenticate.ts +10 -9
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +2 -2
  51. package/components/identity.federation/source/lib/jwt.ts +7 -8
  52. package/components/identity.federation/source/types/configuration.ts +16 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +9 -4
  54. package/components/identity.federation/source/types/entity.ts +6 -0
  55. package/components/identity.federation/source/types/index.ts +3 -0
  56. package/components/identity.federation/tsconfig.json +2 -2
  57. package/components/identity.roles/manifest.toa.yaml +18 -5
  58. package/components/identity.roles/operations/grant.d.ts +10 -0
  59. package/components/identity.roles/operations/grant.js +21 -0
  60. package/components/identity.roles/operations/grant.js.map +1 -0
  61. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  62. package/components/identity.roles/operations/lib/Entity.js +3 -0
  63. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  64. package/components/identity.roles/operations/list.d.ts +1 -4
  65. package/components/identity.roles/operations/list.js.map +1 -1
  66. package/components/identity.roles/operations/principal.d.ts +4 -6
  67. package/components/identity.roles/operations/principal.js +6 -1
  68. package/components/identity.roles/operations/principal.js.map +1 -1
  69. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  70. package/components/identity.roles/source/grant.ts +32 -0
  71. package/components/identity.roles/source/lib/Entity.ts +5 -0
  72. package/components/identity.roles/source/list.ts +2 -4
  73. package/components/identity.roles/source/principal.ts +10 -8
  74. package/components/identity.tokens/manifest.toa.yaml +19 -4
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +10 -4
  77. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  78. package/components/identity.tokens/operations/decrypt.js +1 -0
  79. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  80. package/components/identity.tokens/operations/encrypt.js +5 -1
  81. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  82. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  83. package/components/identity.tokens/operations/types.d.ts +8 -2
  84. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  85. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  86. package/components/identity.tokens/source/authenticate.ts +12 -5
  87. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  88. package/components/identity.tokens/source/decrypt.ts +9 -8
  89. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  90. package/components/identity.tokens/source/encrypt.ts +5 -1
  91. package/components/identity.tokens/source/types.ts +9 -2
  92. package/components/octets.storage/manifest.toa.yaml +0 -6
  93. package/components/octets.storage/operations/store.js +1 -1
  94. package/documentation/access.md +27 -16
  95. package/documentation/authorities.md +53 -0
  96. package/documentation/cache.md +8 -1
  97. package/documentation/components.md +52 -27
  98. package/documentation/identity.md +17 -22
  99. package/documentation/io.md +56 -0
  100. package/documentation/protocol.md +3 -0
  101. package/documentation/query.md +57 -8
  102. package/documentation/require.md +15 -0
  103. package/documentation/tree.md +22 -4
  104. package/documentation/vary.md +14 -14
  105. package/entity.json +0 -0
  106. package/features/access.feature +83 -56
  107. package/features/annotation.feature +2 -0
  108. package/features/authorities.basic.feature +141 -0
  109. package/features/authorities.feature +32 -0
  110. package/features/authorities.federation.feature +99 -0
  111. package/features/authorities.tokens.feature +118 -0
  112. package/features/body.feature +5 -1
  113. package/features/cache.feature +78 -5
  114. package/features/cors.feature +6 -2
  115. package/features/debug.feature +34 -0
  116. package/features/directives.feature +5 -0
  117. package/features/dynamic.feature +18 -7
  118. package/features/errors.feature +19 -5
  119. package/features/etag.feature +103 -0
  120. package/features/identity.bans.feature +137 -0
  121. package/features/identity.basic.feature +137 -14
  122. package/features/identity.feature +7 -2
  123. package/features/identity.federation.feature +61 -8
  124. package/features/identity.roles.feature +220 -4
  125. package/features/identity.tokens.feature +114 -4
  126. package/features/io.feature +205 -0
  127. package/features/octets.entries.feature +11 -1
  128. package/features/octets.feature +60 -64
  129. package/features/octets.meta.feature +7 -3
  130. package/features/octets.workflows.feature +14 -0
  131. package/features/probes.feature +14 -0
  132. package/features/{queries.feature → query.feature} +50 -3
  133. package/features/require.feature +67 -0
  134. package/features/response.feature +12 -3
  135. package/features/routes.feature +25 -12
  136. package/features/steps/Database.ts +17 -10
  137. package/features/steps/Gateway.ts +24 -4
  138. package/features/steps/IdP.ts +28 -23
  139. package/features/steps/components/echo/manifest.toa.yaml +5 -0
  140. package/features/steps/components/echo/operations/identity.js +7 -0
  141. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  142. package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
  143. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  144. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  145. package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
  146. package/features/streams.feature +1 -0
  147. package/features/timing.feature +69 -0
  148. package/features/vary.feature +105 -3
  149. package/package.json +12 -14
  150. package/readme.md +19 -13
  151. package/schemas/annotation.cos.yaml +2 -1
  152. package/schemas/io/input.cos.yaml +3 -0
  153. package/schemas/io/message.cos.yaml +5 -0
  154. package/schemas/io/output.cos.yaml +5 -0
  155. package/schemas/querystring.cos.yaml +1 -0
  156. package/source/Annotation.ts +3 -2
  157. package/source/Context.ts +6 -4
  158. package/source/Directive.test.ts +7 -7
  159. package/source/Directive.ts +19 -46
  160. package/source/Endpoint.ts +55 -6
  161. package/source/Factory.ts +17 -9
  162. package/source/Gateway.ts +38 -53
  163. package/source/HTTP/Context.ts +89 -0
  164. package/source/HTTP/Server.ts +99 -121
  165. package/source/HTTP/Timing.ts +40 -0
  166. package/source/HTTP/exceptions.ts +7 -1
  167. package/source/HTTP/index.ts +1 -0
  168. package/source/HTTP/messages.test.ts +27 -8
  169. package/source/HTTP/messages.ts +32 -48
  170. package/source/Mapping.ts +12 -8
  171. package/source/Query.test.ts +1 -1
  172. package/source/Query.ts +35 -24
  173. package/source/RTD/Context.ts +7 -10
  174. package/source/RTD/Directives.ts +28 -4
  175. package/source/RTD/Endpoint.ts +6 -4
  176. package/source/RTD/Match.ts +2 -7
  177. package/source/RTD/Method.ts +7 -13
  178. package/source/RTD/Node.ts +13 -14
  179. package/source/RTD/Tree.ts +17 -16
  180. package/source/RTD/factory.ts +3 -6
  181. package/source/Tenant.ts +0 -8
  182. package/source/deployment.ts +33 -17
  183. package/source/directives/auth/Anonymous.ts +3 -2
  184. package/source/directives/auth/Authorization.ts +34 -21
  185. package/source/directives/auth/Delegate.ts +35 -0
  186. package/source/directives/auth/Incept.ts +13 -7
  187. package/source/directives/auth/Role.test.ts +53 -6
  188. package/source/directives/auth/Role.ts +27 -17
  189. package/source/directives/auth/Scheme.ts +2 -2
  190. package/source/directives/auth/types.ts +1 -1
  191. package/source/directives/cache/Cache.ts +5 -5
  192. package/source/directives/cache/Control.ts +48 -22
  193. package/source/directives/cache/types.ts +1 -1
  194. package/source/directives/cors/CORS.ts +18 -10
  195. package/source/directives/dev/Development.ts +4 -4
  196. package/source/directives/index.ts +6 -4
  197. package/source/directives/io/Directive.ts +11 -0
  198. package/source/directives/io/IO.ts +43 -0
  199. package/source/directives/io/Input.ts +50 -0
  200. package/source/directives/io/Message.ts +1 -0
  201. package/source/directives/io/Output.ts +69 -0
  202. package/source/directives/io/index.ts +3 -0
  203. package/source/directives/io/schemas.ts +12 -0
  204. package/source/directives/octets/Context.ts +5 -4
  205. package/source/directives/octets/Delete.ts +23 -11
  206. package/source/directives/octets/Directive.ts +10 -0
  207. package/source/directives/octets/Fetch.ts +33 -17
  208. package/source/directives/octets/List.ts +18 -8
  209. package/source/directives/octets/Octets.ts +9 -9
  210. package/source/directives/octets/Store.ts +29 -19
  211. package/source/directives/octets/Workflow.ts +12 -5
  212. package/source/directives/octets/types.ts +0 -7
  213. package/source/directives/octets/workflows/Workflow.ts +2 -2
  214. package/source/directives/require/Directive.ts +5 -0
  215. package/source/directives/require/Headers.ts +20 -0
  216. package/source/directives/require/Require.ts +28 -0
  217. package/source/directives/require/index.ts +3 -0
  218. package/source/directives/vary/Directive.ts +2 -1
  219. package/source/directives/vary/Embed.ts +14 -8
  220. package/source/directives/vary/Vary.ts +8 -6
  221. package/source/directives/vary/embeddings/Authority.ts +8 -0
  222. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  223. package/source/directives/vary/embeddings/Header.ts +9 -7
  224. package/source/directives/vary/embeddings/Language.ts +2 -2
  225. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  226. package/source/directives/vary/embeddings/index.ts +6 -4
  227. package/source/exceptions.ts +22 -11
  228. package/source/io.ts +2 -2
  229. package/source/root.ts +5 -0
  230. package/source/schemas.ts +1 -1
  231. package/transpiled/Annotation.d.ts +3 -2
  232. package/transpiled/Context.d.ts +6 -4
  233. package/transpiled/Directive.d.ts +8 -21
  234. package/transpiled/Directive.js +11 -14
  235. package/transpiled/Directive.js.map +1 -1
  236. package/transpiled/Endpoint.d.ts +7 -5
  237. package/transpiled/Endpoint.js +60 -2
  238. package/transpiled/Endpoint.js.map +1 -1
  239. package/transpiled/Factory.js +11 -4
  240. package/transpiled/Factory.js.map +1 -1
  241. package/transpiled/Gateway.d.ts +4 -8
  242. package/transpiled/Gateway.js +25 -35
  243. package/transpiled/Gateway.js.map +1 -1
  244. package/transpiled/HTTP/Context.d.ts +31 -0
  245. package/transpiled/HTTP/Context.js +60 -0
  246. package/transpiled/HTTP/Context.js.map +1 -0
  247. package/transpiled/HTTP/Server.d.ts +21 -9
  248. package/transpiled/HTTP/Server.js +98 -100
  249. package/transpiled/HTTP/Server.js.map +1 -1
  250. package/transpiled/HTTP/Timing.d.ts +10 -0
  251. package/transpiled/HTTP/Timing.js +29 -0
  252. package/transpiled/HTTP/Timing.js.map +1 -0
  253. package/transpiled/HTTP/exceptions.d.ts +4 -1
  254. package/transpiled/HTTP/exceptions.js +7 -1
  255. package/transpiled/HTTP/exceptions.js.map +1 -1
  256. package/transpiled/HTTP/index.d.ts +1 -0
  257. package/transpiled/HTTP/index.js +1 -0
  258. package/transpiled/HTTP/index.js.map +1 -1
  259. package/transpiled/HTTP/messages.d.ts +7 -21
  260. package/transpiled/HTTP/messages.js +24 -26
  261. package/transpiled/HTTP/messages.js.map +1 -1
  262. package/transpiled/Mapping.js +11 -8
  263. package/transpiled/Mapping.js.map +1 -1
  264. package/transpiled/Query.d.ts +1 -0
  265. package/transpiled/Query.js +21 -20
  266. package/transpiled/Query.js.map +1 -1
  267. package/transpiled/RTD/Context.d.ts +7 -6
  268. package/transpiled/RTD/Directives.d.ts +19 -4
  269. package/transpiled/RTD/Endpoint.d.ts +6 -4
  270. package/transpiled/RTD/Match.d.ts +2 -4
  271. package/transpiled/RTD/Method.d.ts +7 -7
  272. package/transpiled/RTD/Method.js.map +1 -1
  273. package/transpiled/RTD/Node.d.ts +4 -6
  274. package/transpiled/RTD/Node.js +2 -1
  275. package/transpiled/RTD/Node.js.map +1 -1
  276. package/transpiled/RTD/Tree.d.ts +6 -6
  277. package/transpiled/RTD/Tree.js +4 -1
  278. package/transpiled/RTD/Tree.js.map +1 -1
  279. package/transpiled/RTD/factory.d.ts +2 -4
  280. package/transpiled/RTD/factory.js +1 -1
  281. package/transpiled/RTD/factory.js.map +1 -1
  282. package/transpiled/Tenant.d.ts +0 -1
  283. package/transpiled/Tenant.js +0 -6
  284. package/transpiled/Tenant.js.map +1 -1
  285. package/transpiled/deployment.d.ts +1 -1
  286. package/transpiled/deployment.js +28 -15
  287. package/transpiled/deployment.js.map +1 -1
  288. package/transpiled/directives/auth/Anonymous.js +3 -4
  289. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  290. package/transpiled/directives/auth/Authorization.d.ts +2 -3
  291. package/transpiled/directives/auth/Authorization.js +18 -11
  292. package/transpiled/directives/auth/Authorization.js.map +1 -1
  293. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  294. package/transpiled/directives/auth/Delegate.js +29 -0
  295. package/transpiled/directives/auth/Delegate.js.map +1 -0
  296. package/transpiled/directives/auth/Incept.d.ts +1 -1
  297. package/transpiled/directives/auth/Incept.js +13 -7
  298. package/transpiled/directives/auth/Incept.js.map +1 -1
  299. package/transpiled/directives/auth/Role.d.ts +4 -1
  300. package/transpiled/directives/auth/Role.js +25 -17
  301. package/transpiled/directives/auth/Role.js.map +1 -1
  302. package/transpiled/directives/auth/Scheme.js +2 -2
  303. package/transpiled/directives/auth/Scheme.js.map +1 -1
  304. package/transpiled/directives/cache/Cache.d.ts +3 -3
  305. package/transpiled/directives/cache/Cache.js +3 -3
  306. package/transpiled/directives/cache/Cache.js.map +1 -1
  307. package/transpiled/directives/cache/Control.d.ts +5 -4
  308. package/transpiled/directives/cache/Control.js +32 -15
  309. package/transpiled/directives/cache/Control.js.map +1 -1
  310. package/transpiled/directives/cache/types.d.ts +1 -1
  311. package/transpiled/directives/cors/CORS.d.ts +2 -3
  312. package/transpiled/directives/cors/CORS.js +17 -10
  313. package/transpiled/directives/cors/CORS.js.map +1 -1
  314. package/transpiled/directives/dev/Development.d.ts +3 -3
  315. package/transpiled/directives/dev/Development.js +1 -1
  316. package/transpiled/directives/dev/Development.js.map +1 -1
  317. package/transpiled/directives/index.d.ts +2 -2
  318. package/transpiled/directives/index.js +5 -3
  319. package/transpiled/directives/index.js.map +1 -1
  320. package/transpiled/directives/io/Directive.d.ts +8 -0
  321. package/transpiled/directives/io/Directive.js +3 -0
  322. package/transpiled/directives/io/Directive.js.map +1 -0
  323. package/transpiled/directives/io/IO.d.ts +9 -0
  324. package/transpiled/directives/io/IO.js +33 -0
  325. package/transpiled/directives/io/IO.js.map +1 -0
  326. package/transpiled/directives/io/Input.d.ts +11 -0
  327. package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -21
  328. package/transpiled/directives/io/Input.js.map +1 -0
  329. package/transpiled/directives/io/Message.d.ts +1 -0
  330. package/transpiled/directives/io/Message.js +3 -0
  331. package/transpiled/directives/io/Message.js.map +1 -0
  332. package/transpiled/directives/io/Output.d.ts +13 -0
  333. package/transpiled/directives/io/Output.js +76 -0
  334. package/transpiled/directives/io/Output.js.map +1 -0
  335. package/transpiled/directives/io/index.d.ts +2 -0
  336. package/transpiled/directives/io/index.js +6 -0
  337. package/transpiled/directives/io/index.js.map +1 -0
  338. package/transpiled/directives/io/schemas.d.ts +7 -0
  339. package/transpiled/directives/io/schemas.js +14 -0
  340. package/transpiled/directives/io/schemas.js.map +1 -0
  341. package/transpiled/directives/octets/Context.d.ts +4 -4
  342. package/transpiled/directives/octets/Context.js +4 -2
  343. package/transpiled/directives/octets/Context.js.map +1 -1
  344. package/transpiled/directives/octets/Delete.d.ts +4 -3
  345. package/transpiled/directives/octets/Delete.js +22 -10
  346. package/transpiled/directives/octets/Delete.js.map +1 -1
  347. package/transpiled/directives/octets/Directive.d.ts +8 -0
  348. package/transpiled/directives/octets/Directive.js +8 -0
  349. package/transpiled/directives/octets/Directive.js.map +1 -0
  350. package/transpiled/directives/octets/Fetch.d.ts +4 -3
  351. package/transpiled/directives/octets/Fetch.js +31 -15
  352. package/transpiled/directives/octets/Fetch.js.map +1 -1
  353. package/transpiled/directives/octets/List.d.ts +4 -3
  354. package/transpiled/directives/octets/List.js +16 -7
  355. package/transpiled/directives/octets/List.js.map +1 -1
  356. package/transpiled/directives/octets/Octets.d.ts +4 -4
  357. package/transpiled/directives/octets/Octets.js +5 -5
  358. package/transpiled/directives/octets/Octets.js.map +1 -1
  359. package/transpiled/directives/octets/Store.d.ts +4 -3
  360. package/transpiled/directives/octets/Store.js +20 -13
  361. package/transpiled/directives/octets/Store.js.map +1 -1
  362. package/transpiled/directives/octets/Workflow.d.ts +4 -3
  363. package/transpiled/directives/octets/Workflow.js +11 -4
  364. package/transpiled/directives/octets/Workflow.js.map +1 -1
  365. package/transpiled/directives/octets/types.d.ts +0 -5
  366. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  367. package/transpiled/directives/octets/workflows/Workflow.js +2 -2
  368. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  369. package/transpiled/directives/require/Directive.d.ts +4 -0
  370. package/transpiled/directives/require/Directive.js +3 -0
  371. package/transpiled/directives/require/Directive.js.map +1 -0
  372. package/transpiled/directives/require/Headers.d.ts +7 -0
  373. package/transpiled/directives/require/Headers.js +19 -0
  374. package/transpiled/directives/require/Headers.js.map +1 -0
  375. package/transpiled/directives/require/Require.d.ts +9 -0
  376. package/transpiled/directives/require/Require.js +27 -0
  377. package/transpiled/directives/require/Require.js.map +1 -0
  378. package/transpiled/directives/require/index.d.ts +2 -0
  379. package/transpiled/directives/require/index.js +6 -0
  380. package/transpiled/directives/require/index.js.map +1 -0
  381. package/transpiled/directives/vary/Directive.d.ts +2 -1
  382. package/transpiled/directives/vary/Embed.d.ts +2 -1
  383. package/transpiled/directives/vary/Embed.js +8 -6
  384. package/transpiled/directives/vary/Embed.js.map +1 -1
  385. package/transpiled/directives/vary/Vary.d.ts +3 -3
  386. package/transpiled/directives/vary/Vary.js +4 -4
  387. package/transpiled/directives/vary/Vary.js.map +1 -1
  388. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  389. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  390. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  391. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  392. package/transpiled/directives/vary/embeddings/Header.js +9 -7
  393. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  394. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  395. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  396. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  397. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  398. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  399. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  400. package/transpiled/directives/vary/embeddings/index.js +8 -4
  401. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  402. package/transpiled/exceptions.d.ts +3 -2
  403. package/transpiled/exceptions.js +13 -7
  404. package/transpiled/exceptions.js.map +1 -1
  405. package/transpiled/io.d.ts +2 -2
  406. package/transpiled/root.js +5 -0
  407. package/transpiled/root.js.map +1 -1
  408. package/transpiled/schemas.d.ts +1 -1
  409. package/transpiled/schemas.js +2 -2
  410. package/transpiled/schemas.js.map +1 -1
  411. package/transpiled/tsconfig.tsbuildinfo +1 -1
  412. package/components/identity.basic/operations/create.d.ts +0 -10
  413. package/components/identity.basic/operations/create.js +0 -10
  414. package/components/identity.basic/operations/create.js.map +0 -1
  415. package/components/identity.basic/source/create.ts +0 -18
  416. package/components/identity.federation/operations/create.d.ts +0 -10
  417. package/components/identity.federation/operations/create.js.map +0 -1
  418. package/components/identity.federation/operations/schemas.d.ts +0 -59
  419. package/components/identity.federation/operations/schemas.js +0 -9
  420. package/components/identity.federation/operations/schemas.js.map +0 -1
  421. package/components/identity.federation/operations/types.js.map +0 -1
  422. package/components/identity.federation/source/schemas.ts +0 -61
  423. package/components/octets.storage/operations/permute.js +0 -7
  424. package/source/HTTP/Server.fixtures.ts +0 -40
  425. package/source/HTTP/Server.test.ts +0 -126
  426. package/source/directives/octets/Permute.ts +0 -37
  427. package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
  428. package/transpiled/HTTP/Server.fixtures.js +0 -31
  429. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  430. package/transpiled/directives/octets/Permute.d.ts +0 -10
  431. package/transpiled/directives/octets/Permute.js.map +0 -1
@@ -7,6 +7,8 @@ let configuration: Configuration
7
7
  let context: Context
8
8
  let encrypt: Encrypt
9
9
 
10
+ const authority = generate()
11
+
10
12
  beforeEach(() => {
11
13
  configuration = {
12
14
  key0: 'k3.local.m28p8SrbS467t-2IUjQuSOqmjvi24TbXhyjAW_dOrog',
@@ -25,14 +27,14 @@ it('should decrypt', async () => {
25
27
  const identity: Identity = { id: generate() }
26
28
  const lifetime = 100
27
29
 
28
- const reply = await encrypt.execute({ identity, lifetime })
30
+ const reply = await encrypt.execute({ authority, identity, lifetime })
29
31
 
30
32
  if (reply === undefined)
31
33
  throw new Error('?')
32
34
 
33
35
  const decrypted = await decrypt(reply, context)
34
36
 
35
- expect(decrypted).toMatchObject({ identity, refresh: false })
37
+ expect(decrypted).toMatchObject({ authority, identity, refresh: false })
36
38
  })
37
39
 
38
40
  it('should decrypt with key1', async () => {
@@ -48,7 +50,7 @@ it('should decrypt with key1', async () => {
48
50
  const identity: Identity = { id: generate() }
49
51
  const lifetime = 100
50
52
 
51
- const encrypted = await encrypt.execute({ identity, lifetime })
53
+ const encrypted = await encrypt.execute({ authority, identity, lifetime })
52
54
 
53
55
  if (encrypted === undefined)
54
56
  throw new Error('?')
@@ -2,8 +2,7 @@ import { V3 } from 'paseto'
2
2
  import { type Maybe } from '@toa.io/types'
3
3
  import { type Context, type Claim, type DecryptOutput } from './types'
4
4
 
5
- export async function computation (token: string, context: Context):
6
- Promise<Maybe<DecryptOutput>> {
5
+ export async function computation (token: string, context: Context): Promise<Maybe<DecryptOutput>> {
7
6
  let refresh = false
8
7
  let claim = await decrypt(token, context.configuration.key0)
9
8
 
@@ -14,12 +13,14 @@ Promise<Maybe<DecryptOutput>> {
14
13
 
15
14
  if (claim === null)
16
15
  return ERR_INVALID_TOKEN
17
- else return {
18
- identity: claim.identity,
19
- iat: claim.iat,
20
- exp: claim.exp,
21
- refresh
22
- }
16
+ else
17
+ return {
18
+ authority: claim.aud,
19
+ identity: claim.identity,
20
+ iat: claim.iat,
21
+ exp: claim.exp,
22
+ refresh
23
+ }
23
24
  }
24
25
 
25
26
  async function decrypt (token: string, key: string): Promise<Claim | null> {
@@ -1,3 +1,4 @@
1
+ import assert from 'node:assert'
1
2
  import { generate } from 'randomstring'
2
3
  import { timeout } from '@toa.io/generic'
3
4
  import { Effect as Encrypt } from './encrypt'
@@ -7,6 +8,7 @@ import { type Context, type Identity } from './types'
7
8
  let encrypt: Encrypt
8
9
 
9
10
  const context: Context = {} as unknown as Context
11
+ const authority = generate()
10
12
 
11
13
  beforeEach(() => {
12
14
  context.configuration = {
@@ -22,14 +24,36 @@ beforeEach(() => {
22
24
  it('should encrypt with given lifetime', async () => {
23
25
  const identity: Identity = { id: generate() }
24
26
  const lifetime = 0.1
25
- const encrypted = await encrypt.execute({ identity, lifetime })
27
+
28
+ const encrypted = await encrypt.execute({
29
+ authority,
30
+ identity,
31
+ lifetime
32
+ })
26
33
 
27
34
  if (encrypted === undefined)
28
35
  throw new Error('?')
29
36
 
30
- await expect(decrypt(encrypted, context)).resolves.toMatchObject({ identity })
37
+ await expect(decrypt(encrypted, context)).resolves.toMatchObject({ authority, identity })
31
38
 
32
39
  await timeout(lifetime * 1000)
33
40
 
34
41
  await expect(decrypt(encrypted, context)).resolves.toMatchObject({ message: 'INVALID_TOKEN' })
35
42
  })
43
+
44
+ it('should encrypt without lifetime INSECURE', async () => {
45
+ const identity: Identity = { id: generate() }
46
+ const lifetime = 0
47
+
48
+ const encrypted = await encrypt.execute({
49
+ authority,
50
+ identity,
51
+ lifetime
52
+ })
53
+
54
+ const decrypted = await decrypt(encrypted, context)
55
+
56
+ assert.ok(!(decrypted instanceof Error))
57
+
58
+ expect(decrypted.identity).toMatchObject(identity)
59
+ })
@@ -18,7 +18,11 @@ export class Effect implements Operation {
18
18
  ? undefined
19
19
  : new Date(Date.now() + lifetime).toISOString()
20
20
 
21
- const payload: Partial<Claim> = { identity: input.identity, exp }
21
+ const payload: Partial<Claim> = {
22
+ identity: input.identity,
23
+ aud: input.authority,
24
+ exp
25
+ }
22
26
 
23
27
  return await V3.encrypt(payload, this.key)
24
28
  }
@@ -16,25 +16,31 @@ export interface Configuration {
16
16
  }
17
17
 
18
18
  export interface Entity {
19
- identity: string
20
- revokedAt: number
19
+ revokedAt?: number
21
20
  }
22
21
 
23
22
  export interface Identity extends Record<string, any> {
24
23
  id: string
25
24
  }
26
25
 
26
+ export interface AuthenticateInput {
27
+ authority: string
28
+ credentials: string
29
+ }
30
+
27
31
  export interface AuthenticateOutput {
28
32
  identity: Identity
29
33
  refresh: boolean
30
34
  }
31
35
 
32
36
  export interface EncryptInput {
37
+ authority: string
33
38
  identity: Identity
34
39
  lifetime?: number
35
40
  }
36
41
 
37
42
  export interface DecryptOutput {
43
+ authority: string
38
44
  identity: Identity
39
45
  iat: string
40
46
  exp?: string
@@ -43,6 +49,7 @@ export interface DecryptOutput {
43
49
 
44
50
  export interface Claim {
45
51
  identity: Identity
52
+ aud: string
46
53
  iat: string
47
54
  exp?: string
48
55
  }
@@ -19,9 +19,3 @@ operations:
19
19
  get: *simple
20
20
  list: *simple
21
21
  delete: *simple
22
- permute:
23
- bindings: ~
24
- input:
25
- storage*: string
26
- path*: string
27
- list*: [string]
@@ -2,7 +2,7 @@
2
2
 
3
3
  function store (input, context) {
4
4
  const { storage, request, accept, meta } = input
5
- const path = request.path
5
+ const path = request.url
6
6
  const claim = request.headers['content-type']
7
7
 
8
8
  return context.storages[storage].put(path, request, { claim, accept, meta })
@@ -14,8 +14,8 @@
14
14
  The Authorization is implemented as a set of [RTD Directives](tree.md#directives).
15
15
 
16
16
  Directives are executed in a predetermined order until one of them grants access to a resource.
17
- If none of the directives grants access, then the Authorization interrupts request processing and responds with an
18
- authorization error.
17
+ If none of the directives grants access, then the Authorization interrupts request processing and
18
+ responds with an authorization error.
19
19
 
20
20
  > The Authorization directive provider is named `authorization`,
21
21
  > so the full names of the directives are `authorization:{directive}`.
@@ -25,7 +25,7 @@ authorization error.
25
25
  Grants access if its value is `true` and no credentials were provided[^1].
26
26
 
27
27
  [^1]: Credentials in the request make the
28
- response [non-chachable](https://datatracker.ietf.org/doc/html/rfc7234#section-3).
28
+ response [non-cachable](https://datatracker.ietf.org/doc/html/rfc7234#section-3).
29
29
 
30
30
  ### `id`
31
31
 
@@ -56,8 +56,6 @@ is `87480f2bd88048518c529d7957475ecd`.
56
56
 
57
57
  Grants access if resolved Identity has a role matching the directive's value or one of its values.
58
58
 
59
- #### Example
60
-
61
59
  ```yaml
62
60
  # context.toa.yaml
63
61
 
@@ -70,11 +68,22 @@ Access will be granted if the resolved Identity has a role that matches `develop
70
68
 
71
69
  Read [Roles](#roles) section for more details.
72
70
 
71
+ #### Dynamic roles
72
+
73
+ The `role` directive can be used with a placeholder in the route.
74
+
75
+ ```yaml
76
+ # context.toa.yaml
77
+
78
+ exposition:
79
+ /:org-id:
80
+ role: app:{org-id}:moderator
81
+ ```
82
+
73
83
  ### `rule`
74
84
 
75
85
  The Rule is a collection of authorization directives. It allows access only if all the specified
76
- directives grant
77
- access. The value of the `rule` directive can be a single Rule or a list of Rules.
86
+ directives grant access. The value of the `rule` directive can be a single Rule or a list of Rules.
78
87
 
79
88
  #### Example
80
89
 
@@ -90,12 +99,22 @@ exposition:
90
99
 
91
100
  Access will be granted if an Identity matches a `user-id` placeholder and has a Role of `developer`.
92
101
 
102
+ ### `delegate`
103
+
104
+ Embeds the value of the current Identity into the request body as a property named after the value
105
+ of the directive value, and grants access.
106
+ The request body must be an object.
107
+
108
+ > :warning:<br/>
109
+ > The intended use case for this directive is audit.
110
+ > **Using it to pass Identity to the application logic is strongly discouraged.**
111
+
93
112
  ## Roles
94
113
 
95
114
  Role values are strings that can be assigned to an Identity and used for matching with values of
96
115
  the [`role` directive](#role).
97
116
 
98
- ### Hierarchy
117
+ ### Hierarchies
99
118
 
100
119
  Role values are alphanumeric tokens separated by a colon (`:`).
101
120
  Each token defines a Role Scope, forming a hierarchy.
@@ -124,18 +143,10 @@ In other words, the Identity must have a specified or more general Role.
124
143
  </picture>
125
144
  </a>
126
145
 
127
-
128
146
  > The root-level Role Scope `system` is preserved and cannot be used with the `role` directives.
129
147
 
130
148
  See also [role management resources](components.md#roles).
131
149
 
132
- #### Authorization Directives
133
-
134
- ```yaml
135
- /identity/roles/:id:
136
- role: system:roles
137
- ````
138
-
139
150
  ## Policies
140
151
 
141
152
  Component Resource branches cannot have authorization directives.
@@ -0,0 +1,53 @@
1
+ # Authorities
2
+
3
+ Authorities are a mechanism that allows serving multiple domains from a single instance of the
4
+ application.
5
+
6
+ ## Definition
7
+
8
+ The `authorities` definition is a map of authority identifiers to the `:authority` pseudo-header
9
+ values.
10
+
11
+ ```yaml
12
+ # context.toa.yaml
13
+
14
+ exposition:
15
+ authorities:
16
+ one: the.one.com
17
+ two: the.two.com
18
+ ```
19
+
20
+ ## Ingress
21
+
22
+ Each host in the authority definition is used to create a Kubernetes Ingress resource.
23
+
24
+ > If the application is accessed with the `:authority` that does not match the authority definition,
25
+ > the response with `404` status code is returned.
26
+
27
+ ## Embedding
28
+
29
+ To pass the requested authority to the operation call, [`vary:embed` directive](vary.md#embeddings)
30
+ can be used.
31
+
32
+ ```yaml
33
+ # manifest.toa.yaml
34
+
35
+ exposition:
36
+ /:
37
+ GET:
38
+ vary:embed:
39
+ app: authority
40
+ endpoint: observe
41
+ ```
42
+
43
+ ## Identity
44
+
45
+ Credentials stored or issued by the [authentication system](identity.md) are associated with an
46
+ authority.
47
+ Credentials in one authority are not valid in another,
48
+ or may be associated with a different Identity; in other words, Identity exists in the context of an
49
+ authority.
50
+
51
+ > :warning:<br/>
52
+ > Changing the authority identifier will break compatibility with existing stored or issued
53
+ > credentials.
@@ -17,7 +17,7 @@ to [safe HTTP methods](https://developer.mozilla.org/en-US/docs/Glossary/Safe/HT
17
17
 
18
18
  ### Implicit modifications
19
19
 
20
- In terms of security, the following implicit modifications are made to the `Cache-Control` header:
20
+ In terms of security, the following implicit modifications are made to the `cache-control` header:
21
21
 
22
22
  - If it contains the `public` directive without `no-cache` and the request is authenticated,
23
23
  the `no-cache` directive is added.
@@ -25,6 +25,13 @@ In terms of security, the following implicit modifications are made to the `Cach
25
25
  - If it does not contain the `private` directive and the request is authenticated, the `private`
26
26
  directive is added.
27
27
  This is to prevent the storage of private data in shared caches.
28
+ - If it contains `private` directive and the request is authenticated, then `vary: authorization` is
29
+ added.
30
+ This is to prevent the reuse of private data when authenticated as another identity.[^1]
31
+
32
+ [^1]: This also will invalidate the cache each time a new token is used for the same identity, thus
33
+ limiting the `max-age` value to the token's `refresh` time.
34
+ See [Issuing tokens](components.md#issuing-tokens).
28
35
 
29
36
  ## `cache:exact`
30
37
 
@@ -20,7 +20,7 @@ and pepper.
20
20
  configuration:
21
21
  identity.basic:
22
22
  rounds: 10 # salt rounds
23
- peper: '' # hashing pepper
23
+ pepper: '' # hashing pepper
24
24
  ```
25
25
 
26
26
  ### Credentials constraints
@@ -96,11 +96,14 @@ The `identity.federation` component manages OpenID Connect federated identities.
96
96
  Both implicit identities creation and forced [identity inception](./identity.md) are supported
97
97
  as in case with basic credentials. `principal` is also working in the same way.
98
98
 
99
- The configuration schema alongside default values is described in the [component manifest](../components/identity.federation/manifest.toa.yaml).
99
+ The configuration schema alongside default values is described in
100
+ the [component manifest](../components/identity.federation/manifest.toa.yaml).
100
101
 
101
- No federated tokens are accepted by default until at least one entry is added to the `trust` configuration.
102
+ No federated tokens are accepted by default until at least one entry is added to the `trust`
103
+ configuration.
102
104
 
103
- Toa supports either asymmetric RS256 or symmetric HS256 / HS384 / HS512 tokens with pre-shared secrets.
105
+ Toa supports either asymmetric RS256 or symmetric HS256 / HS384 / HS512 tokens with pre-shared
106
+ secrets.
104
107
 
105
108
  ```yaml
106
109
  # context.toa.yaml
@@ -108,8 +111,8 @@ Toa supports either asymmetric RS256 or symmetric HS256 / HS384 / HS512 tokens w
108
111
  configuration:
109
112
  identity.federation:
110
113
  trust:
111
- - issuer: https://token.actions.githubusercontent.com
112
- audience:
114
+ - iss: https://token.actions.githubusercontent.com
115
+ aud:
113
116
  - https://github.com/tinovyatkin
114
117
  - https://github.com/temich
115
118
 
@@ -132,6 +135,14 @@ The new token is issued each time the request is made:
132
135
  1. Using authentication scheme other than `Token`.
133
136
  2. Using `Token` authentication scheme with an [obsolete token](#token-rotation).
134
137
 
138
+ When the token is issued it is sent in the `authorization` response header and the `cache-control`
139
+ is set to `no-store`.
140
+
141
+ ```http
142
+ authorization: Token ...
143
+ cache-control: no-store
144
+ ```
145
+
135
146
  ### Token encryption
136
147
 
137
148
  Issued tokens are encrypted
@@ -142,7 +153,7 @@ using the `key0` configuration value as a secret.
142
153
  # context.toa.yaml
143
154
 
144
155
  configuration:
145
- identity.basic:
156
+ identity.tokens:
146
157
  key0: $TOKEN_ENCRYPTION_KEY
147
158
  ```
148
159
 
@@ -153,25 +164,22 @@ The `key0` configuration value is required.
153
164
  ### Token rotation
154
165
 
155
166
  Issued tokens are valid for a `lifetime` period defined in the configuration. After the `refresh`
156
- period, the token is
157
- considered obsolete (yet still valid), and a new token is [issued](#issuing-tokens) unless the
158
- provided one has
159
- been [revoked](#token-revocation).
167
+ period, the token is considered obsolete (yet still valid), and a new token
168
+ is [issued](#issuing-tokens) unless the provided one has been [revoked](#token-revocation).
160
169
 
161
170
  This essentially means that if the client uses the token at least once every `lifetime` period, it
162
- will always have a
163
- valid token to authenticate with. Also, token revocation or changing roles of an Identity will take
164
- effect once
165
- the `refresh` period of the currently issued tokens has expired.
171
+ will always have a valid token to authenticate with.
172
+ Also, token revocation or changing roles of an Identity will take effect once the `refresh` period
173
+ of the currently issued tokens has expired.
166
174
 
167
175
  Adjusting these two values is a delicate trade-off between security, performance and client
168
- convinience.
176
+ convenience.
169
177
 
170
178
  ```yaml
171
179
  # context.toa.yaml
172
180
 
173
181
  configuration:
174
- identity.basic:
182
+ identity.tokens:
175
183
  lifetime: 2592000 # seconds, 30 days
176
184
  refresh: 600 # seconds, 10 minutes
177
185
  ```
@@ -199,7 +207,7 @@ the `key0` and `key1` values in order.
199
207
  # context.toa.yaml
200
208
 
201
209
  configuration:
202
- identity.basic:
210
+ identity.tokens:
203
211
  key0: $TOKEN_ENCRYPTION_KEY_2023Q3
204
212
  key1: $TOKEN_ENCRYPTION_KEY_2023Q2
205
213
  ```
@@ -231,7 +239,7 @@ The secret rotation is a 2-step process:
231
239
  # context.toa.yaml
232
240
 
233
241
  configuration:
234
- identity.basic:
242
+ identity.tokens:
235
243
  key0: $TOKEN_ENCRYPTION_KEY_2023Q3
236
244
  key1: $TOKEN_ENCRYPTION_KEY_2023Q4
237
245
  ```
@@ -244,18 +252,31 @@ configuration:
244
252
  # context.toa.yaml
245
253
 
246
254
  configuration:
247
- identity.basic:
255
+ identity.tokens:
248
256
  key0: $TOKEN_ENCRYPTION_KEY_2023Q4
249
257
  key1: $TOKEN_ENCRYPTION_KEY_2023Q3
250
258
  ```
251
259
 
252
- ## Roles
260
+ ### Token resources
253
261
 
254
- The `identity.roles` component manages roles of an Identity used by [access authorization](access.md#role).
262
+ `/identity/tokens/`
255
263
 
256
- ### Role resources
264
+ `POST` Issue a new token for the Identity. Request body is as follows:
257
265
 
258
- #### `/identity/roles/:id/`
266
+ ```yaml
267
+ lifetime?: number # seconds
268
+ ```
269
+
270
+ Providing a value of `0` will result in the token being issued with no expiration.
271
+ However, it will still become invalid once the encryption key used is out
272
+ of [rotation](#secret-rotation).
273
+
274
+ ## Roles
275
+
276
+ The `identity.roles` component manages roles of an Identity used
277
+ by [access authorization](access.md#role).
278
+
279
+ ### `/identity/roles/:id/`
259
280
 
260
281
  `GET` Get roles of an Identity.
261
282
 
@@ -267,13 +288,16 @@ Access requires credentials of the Identity or `system:identity:roles` role.
267
288
  role: string
268
289
  ```
269
290
 
270
- Access requires `system:identity:roles` role.
291
+ To assign arbitrary roles, the `system:identity:roles` role is required.
292
+
293
+ An Identity having `system:identity:roles:delegation` role can delegate roles within its own
294
+ Role Scopes (see [Role Hierarchies](access.md#hierarchies)).
271
295
 
272
296
  ## Banned Identities
273
297
 
274
298
  The `identity.bans` component manages banned identities.
275
- A banned identity will fail to authenticate with any associated credentials (except [tokens](#stateless-tokens) within
276
- the `refresh` period).
299
+ A banned identity will fail to authenticate with any associated credentials
300
+ (except [tokens](#stateless-tokens) within the `refresh` period).
277
301
 
278
302
  ```http
279
303
  PUT /identity/bans/:id/
@@ -281,6 +305,7 @@ authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
281
305
  content-type: application/yaml
282
306
 
283
307
  banned: true
308
+ comment: Bye bye
284
309
  ```
285
310
 
286
311
  Access requires `system:identity:bans` role.
@@ -1,36 +1,30 @@
1
1
  # Identity
2
2
 
3
3
  Identity is the fundamental entity within an authentication system that represents the **unique
4
- identifier** of an
5
- individual, organization, application or device.
4
+ identifier** of an individual, organization, application or device.
6
5
 
7
- In order to prove its Identity, the request originator must provide a valid _credentials_ that are
8
- associated with that
9
- Identity.
6
+ To prove its Identity, the request originator must provide a valid _credentials_ that are associated
7
+ with that Identity.
10
8
 
11
9
  Identity is intrinsically linked to credentials, as an Identity is established only when the first
12
- set of credentials
13
- for that Identity is created.
10
+ set of credentials for that Identity is created.
14
11
  In other words, the creation of credentials marks the inception of an Identity.
15
12
  Once the last credentials are removed from the Identity, it ceases to exist.
16
13
  Without credentials, there is no basis for defining or asserting an Identity.
17
14
 
18
15
  ## Authentication
19
16
 
20
- The Authenticaiton system resolves provided credentials to an Identity using one of the supported
21
- authentication
22
- schemes.
17
+ The Authentication system resolves provided credentials to an Identity using one of the supported
18
+ authentication schemes.
23
19
 
24
20
  The Authentication is request-agnostic, meaning it does not depend on the specific URL being
25
- requested or the content of
26
- the request body.
21
+ requested or the content of the request body.
27
22
  The only information it handles is the value of the `Authorization` header.
28
23
 
29
- > Except for its own [management resources](#persistent-credentials).
24
+ > Except for its own [management resources](components.md).
30
25
 
31
26
  If the provided credentials are not valid or not associated with an Identity, then Authentication
32
- interrupts request
33
- processing and responds with an authentication error.
27
+ interrupts request processing and responds with an authentication error.
34
28
 
35
29
  ### Basic scheme
36
30
 
@@ -52,8 +46,8 @@ Authrization: Token v4.local.eyJzdWIiOiJqb2hu...
52
46
 
53
47
  The `Token` is the **primary** authentication scheme.
54
48
  If request originators use an alternative authentication scheme, they will receive a response
55
- containing `Token`
56
- credentials and will be required to switch to the `Token` scheme for any subsequent requests.
49
+ containing `Token`credentials and will be required to switch to the `Token` scheme for any
50
+ subsequent requests.
57
51
  Continued use of other authentication schemes will result in temporary blocking of requests.
58
52
 
59
53
  See [`identity.tokens` component](components.md#stateless-tokens).
@@ -69,7 +63,8 @@ to [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.ht
69
63
  Authorization: Bearer eyJhbGciOiJIUzI1...
70
64
  ```
71
65
 
72
- Trusted providers are specified using the `identity.federation` property within the configuration annotation.
66
+ Trusted providers are specified using the `identity.federation` property within the configuration
67
+ annotation.
73
68
 
74
69
  ```yaml
75
70
  # context.toa.yaml
@@ -77,13 +72,13 @@ Trusted providers are specified using the `identity.federation` property within
77
72
  configuration:
78
73
  identity.federation:
79
74
  trust:
80
- - issuer: https://accounts.google.com
81
- audience:
75
+ - iss: https://accounts.google.com
76
+ aud:
82
77
  - <GOOGLE_CLIENT_ID>
83
78
 
84
- - issuer: https://appleid.apple.com
79
+ - iss: https://appleid.apple.com
85
80
 
86
- - issuer: private.entity
81
+ - iss: private.entity
87
82
  secrets:
88
83
  HS384:
89
84
  key0: <THE-SECRET-STRING-FOR-HS384>
@@ -0,0 +1,56 @@
1
+ # I/O restrictions
2
+
3
+ The Exposition comes with `io` directives to control access to the operation's input and output
4
+ properties.
5
+
6
+ ## `io:input`
7
+
8
+ The `io:input` optional directive contains a list of properties that are allowed to be specified in
9
+ the request body.
10
+
11
+ ```yaml
12
+ POST:
13
+ endpoint: create
14
+ io:input: [name, location]
15
+ ```
16
+
17
+ The list must be a valid subset of the operation's input properties.
18
+
19
+ If `io:input` is specified and the request body is not an object, or contains properties that are
20
+ not in the list, the request will be rejected with a `400` status code.
21
+
22
+ > Therefore, `io:input` is only applicable to operations which input is an object or an
23
+ > array of objects.
24
+
25
+ ## `io:output`
26
+
27
+ The `io:output` mandatory directive contains a list of properties that are allowed to be included in
28
+ the response body.
29
+
30
+ ```yaml
31
+ GET:
32
+ endpoint: observe
33
+ io:output: [name, location]
34
+ ```
35
+
36
+ When an operation does not return an object (e.g., a primitive or a stream), or an object is dynamic
37
+ and its properties are not known in advance, `io:output` may have a value of `true` to disable
38
+ output restrictions.
39
+
40
+ ```yaml
41
+ GET:
42
+ endpoint: proxy
43
+ io:output: true
44
+ ```
45
+
46
+ If a method declaration lacks `io:output` directive, it will trigger a warning, and its
47
+ response will consistently be empty.
48
+ If this behavior is intended, a `false` value can be employed to suppress warnings.
49
+
50
+ ```yaml
51
+ GET:
52
+ endpoint: conceal
53
+ io:output: false
54
+ ```
55
+
56
+ Output restrictions are not applied to stream responses and errors.