@toa.io/extensions.exposition 1.0.0-alpha.4 → 1.0.0-alpha.41
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.
- package/components/context.toa.yaml +2 -2
- package/components/identity.bans/manifest.toa.yaml +15 -7
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +22 -9
- package/components/identity.basic/operations/authenticate.d.ts +5 -1
- package/components/identity.basic/operations/authenticate.js +5 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/incept.d.ts +12 -0
- package/components/identity.basic/operations/incept.js +26 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +4 -4
- package/components/identity.basic/operations/transit.js +5 -3
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/types.d.ts +8 -4
- package/components/identity.basic/source/authenticate.ts +16 -5
- package/components/identity.basic/source/incept.ts +38 -0
- package/components/identity.basic/source/transit.ts +8 -6
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +28 -22
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +3 -10
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/incept.d.ts +11 -0
- package/components/identity.federation/operations/{create.js → incept.js} +6 -7
- package/components/identity.federation/operations/incept.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +4 -5
- package/components/identity.federation/operations/lib/jwt.js +3 -3
- package/components/identity.federation/operations/lib/jwt.js.map +1 -1
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/configuration.d.ts +14 -0
- package/components/identity.federation/operations/types/configuration.js +3 -0
- package/components/identity.federation/operations/types/configuration.js.map +1 -0
- package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +13 -6
- package/components/identity.federation/operations/types/context.js +3 -0
- package/components/identity.federation/operations/types/context.js.map +1 -0
- package/components/identity.federation/operations/types/entity.d.ts +6 -0
- package/components/identity.federation/operations/{types.js → types/entity.js} +1 -1
- package/components/identity.federation/operations/types/entity.js.map +1 -0
- package/components/identity.federation/operations/types/index.d.ts +3 -0
- package/components/identity.federation/operations/types/index.js +20 -0
- package/components/identity.federation/operations/types/index.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +5 -18
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/jwt.test.ts +2 -2
- package/components/identity.federation/source/lib/jwt.ts +7 -8
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +15 -5
- package/components/identity.federation/source/types/entity.ts +6 -0
- package/components/identity.federation/source/types/index.ts +3 -0
- package/components/identity.federation/tsconfig.json +2 -2
- package/components/identity.roles/manifest.toa.yaml +18 -6
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +32 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +19 -5
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +10 -4
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js +1 -0
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.js +5 -1
- package/components/identity.tokens/operations/encrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/operations/types.d.ts +8 -2
- package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
- package/components/identity.tokens/source/authenticate.test.ts +11 -4
- package/components/identity.tokens/source/authenticate.ts +12 -5
- package/components/identity.tokens/source/decrypt.test.ts +5 -3
- package/components/identity.tokens/source/decrypt.ts +9 -8
- package/components/identity.tokens/source/encrypt.test.ts +26 -2
- package/components/identity.tokens/source/encrypt.ts +5 -1
- package/components/identity.tokens/source/types.ts +9 -2
- package/components/octets.storage/manifest.toa.yaml +0 -7
- package/documentation/access.md +27 -16
- package/documentation/authorities.md +53 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +47 -22
- package/documentation/identity.md +17 -22
- package/documentation/io.md +56 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +17 -11
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +14 -14
- package/features/access.feature +89 -47
- package/features/annotation.feature +2 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +99 -0
- package/features/authorities.tokens.feature +118 -0
- package/features/body.feature +4 -0
- package/features/cache.feature +112 -5
- package/features/cors.feature +7 -2
- package/features/debug.feature +34 -0
- package/features/directives.feature +5 -0
- package/features/dynamic.feature +18 -7
- package/features/errors.feature +18 -4
- package/features/etag.feature +18 -1
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +142 -19
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +67 -14
- package/features/identity.roles.feature +220 -4
- package/features/identity.tokens.feature +57 -4
- package/features/io.feature +205 -0
- package/features/octets.entries.feature +10 -0
- package/features/octets.feature +60 -64
- package/features/octets.meta.feature +7 -3
- package/features/octets.workflows.feature +14 -0
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +50 -3
- package/features/require.feature +67 -0
- package/features/response.feature +12 -3
- package/features/routes.feature +25 -12
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +28 -23
- package/features/steps/components/echo/manifest.toa.yaml +5 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +2 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/streams.feature +1 -0
- package/features/timing.feature +27 -1
- package/features/vary.feature +105 -3
- package/package.json +12 -11
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/source/Annotation.ts +3 -3
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +4 -4
- package/source/Directive.ts +11 -38
- package/source/Endpoint.ts +43 -8
- package/source/Factory.ts +11 -7
- package/source/Gateway.ts +16 -44
- package/source/HTTP/Context.ts +24 -2
- package/source/HTTP/Server.ts +56 -43
- package/source/HTTP/exceptions.ts +7 -1
- package/source/HTTP/messages.test.ts +38 -2
- package/source/HTTP/messages.ts +7 -3
- package/source/Mapping.ts +6 -1
- package/source/Query.test.ts +1 -1
- package/source/Query.ts +35 -24
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +17 -16
- package/source/RTD/factory.ts +3 -6
- package/source/Tenant.ts +0 -8
- package/source/deployment.ts +32 -22
- package/source/directives/auth/Authorization.ts +38 -19
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Incept.ts +3 -2
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +15 -8
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +13 -7
- package/source/directives/dev/Development.ts +4 -4
- package/source/directives/index.ts +6 -4
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +4 -3
- package/source/directives/octets/Delete.ts +4 -2
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +4 -3
- package/source/directives/octets/List.ts +4 -2
- package/source/directives/octets/Octets.ts +6 -8
- package/source/directives/octets/Store.ts +12 -4
- package/source/directives/octets/Workflow.ts +10 -3
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/require/Directive.ts +5 -0
- package/source/directives/require/Headers.ts +20 -0
- package/source/directives/require/Require.ts +28 -0
- package/source/directives/require/index.ts +3 -0
- package/source/directives/vary/Directive.ts +2 -1
- package/source/directives/vary/Embed.ts +14 -8
- package/source/directives/vary/Vary.ts +7 -5
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Header.ts +8 -6
- package/source/directives/vary/embeddings/Language.ts +1 -1
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +22 -11
- package/source/root.ts +5 -0
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +4 -17
- package/transpiled/Directive.js +4 -7
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +5 -3
- package/transpiled/Endpoint.js +30 -5
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +9 -4
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +1 -4
- package/transpiled/Gateway.js +10 -26
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +8 -1
- package/transpiled/HTTP/Context.js +15 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +41 -35
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +4 -1
- package/transpiled/HTTP/exceptions.js +7 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +1 -0
- package/transpiled/HTTP/messages.js +9 -3
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Mapping.js +4 -1
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +1 -0
- package/transpiled/Query.js +21 -20
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +4 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/Tenant.d.ts +0 -1
- package/transpiled/Tenant.js +0 -6
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/deployment.js +28 -20
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Authorization.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +26 -12
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +10 -0
- package/transpiled/directives/auth/Delegate.js +34 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.js +3 -2
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +20 -14
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +5 -5
- package/transpiled/directives/cache/Cache.js +10 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -1
- package/transpiled/directives/cache/Control.js +29 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +13 -7
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.d.ts +3 -3
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/index.d.ts +2 -2
- package/transpiled/directives/index.js +5 -3
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -26
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +3 -3
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +3 -2
- package/transpiled/directives/octets/Delete.js +3 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +3 -2
- package/transpiled/directives/octets/Fetch.js +3 -1
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +3 -2
- package/transpiled/directives/octets/List.js +3 -1
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +2 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +3 -2
- package/transpiled/directives/octets/Store.js +10 -3
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +3 -2
- package/transpiled/directives/octets/Workflow.js +9 -2
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +2 -1
- package/transpiled/directives/vary/Embed.d.ts +2 -1
- package/transpiled/directives/vary/Embed.js +8 -6
- package/transpiled/directives/vary/Embed.js.map +1 -1
- package/transpiled/directives/vary/Vary.d.ts +3 -3
- package/transpiled/directives/vary/Vary.js +3 -3
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Authority.js +10 -0
- package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/Header.js +8 -6
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +1 -1
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
- package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
- package/transpiled/directives/vary/embeddings/index.js +8 -4
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +13 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +1 -1
- package/transpiled/schemas.js +2 -2
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/create.d.ts +0 -10
- package/components/identity.basic/operations/create.js +0 -10
- package/components/identity.basic/operations/create.js.map +0 -1
- package/components/identity.basic/source/create.ts +0 -18
- package/components/identity.federation/operations/create.d.ts +0 -10
- package/components/identity.federation/operations/create.js.map +0 -1
- package/components/identity.federation/operations/schemas.d.ts +0 -59
- package/components/identity.federation/operations/schemas.js +0 -9
- package/components/identity.federation/operations/schemas.js.map +0 -1
- package/components/identity.federation/operations/types.js.map +0 -1
- package/components/identity.federation/source/schemas.ts +0 -61
- package/components/octets.storage/operations/permute.js +0 -7
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Permute.ts +0 -43
- package/transpiled/directives/octets/Permute.d.ts +0 -10
- package/transpiled/directives/octets/Permute.js.map +0 -1
package/documentation/access.md
CHANGED
|
@@ -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
|
|
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-
|
|
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
|
-
###
|
|
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.
|
package/documentation/cache.md
CHANGED
|
@@ -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 `
|
|
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
|
-
|
|
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
|
|
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`
|
|
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
|
|
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
|
-
-
|
|
112
|
-
|
|
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
|
|
@@ -153,19 +164,16 @@ 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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
-
|
|
176
|
+
convenience.
|
|
169
177
|
|
|
170
178
|
```yaml
|
|
171
179
|
# context.toa.yaml
|
|
@@ -249,13 +257,26 @@ configuration:
|
|
|
249
257
|
key1: $TOKEN_ENCRYPTION_KEY_2023Q3
|
|
250
258
|
```
|
|
251
259
|
|
|
252
|
-
|
|
260
|
+
### Token resources
|
|
253
261
|
|
|
254
|
-
|
|
262
|
+
`/identity/tokens/`
|
|
255
263
|
|
|
256
|
-
|
|
264
|
+
`POST` Issue a new token for the Identity. Request body is as follows:
|
|
257
265
|
|
|
258
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
8
|
-
|
|
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
|
|
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](
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
81
|
-
|
|
75
|
+
- iss: https://accounts.google.com
|
|
76
|
+
aud:
|
|
82
77
|
- <GOOGLE_CLIENT_ID>
|
|
83
78
|
|
|
84
|
-
-
|
|
79
|
+
- iss: https://appleid.apple.com
|
|
85
80
|
|
|
86
|
-
-
|
|
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.
|
|
@@ -72,6 +72,9 @@ The following request headers are allowed:
|
|
|
72
72
|
- `accept`
|
|
73
73
|
- `authorization`
|
|
74
74
|
- `content-type`
|
|
75
|
+
- `etag`
|
|
76
|
+
- `if-match`
|
|
77
|
+
- `if-none-match`
|
|
75
78
|
- headers used by the [`vary:embed` directive](vary.md#embeddings)
|
|
76
79
|
|
|
77
80
|
The following response headers are exposed:
|
package/documentation/query.md
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
id?: string
|
|
7
7
|
criteria?: string
|
|
8
8
|
sort?: string
|
|
9
|
-
omit?:
|
|
10
|
-
limit?:
|
|
9
|
+
omit?: integer
|
|
10
|
+
limit?: integer
|
|
11
11
|
selectors?: string[]
|
|
12
|
-
projection?: [
|
|
12
|
+
projection?: string[]
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```yaml
|
|
@@ -77,8 +77,12 @@ query:
|
|
|
77
77
|
|
|
78
78
|
### Path variables
|
|
79
79
|
|
|
80
|
-
Path variables are prepended to the `criteria` request query parameter
|
|
81
|
-
|
|
80
|
+
Path variables are prepended to the `criteria` request query parameter except for
|
|
81
|
+
the [`POST` method](#post-method).
|
|
82
|
+
|
|
83
|
+
If query criteria starts with logical operator (`,` or `;`), then path variables are prepended
|
|
84
|
+
accordingly.
|
|
85
|
+
`AND` logical operator is used by default.
|
|
82
86
|
|
|
83
87
|
Given the following declaration:
|
|
84
88
|
|
|
@@ -92,7 +96,7 @@ exposition:
|
|
|
92
96
|
GET:
|
|
93
97
|
endpoint: observe
|
|
94
98
|
query:
|
|
95
|
-
criteria: state==hot; # open criteria
|
|
99
|
+
criteria: ,state==hot; # open criteria
|
|
96
100
|
```
|
|
97
101
|
|
|
98
102
|
and the following request:
|
|
@@ -104,7 +108,7 @@ GET /dummies/cool/?criteria=rank==5
|
|
|
104
108
|
Operation call will have the following query criteria:
|
|
105
109
|
|
|
106
110
|
```yaml
|
|
107
|
-
criteria: state==hot;
|
|
111
|
+
criteria: (type==cool,state==hot);(rank=5)
|
|
108
112
|
```
|
|
109
113
|
|
|
110
114
|
#### POST method
|
|
@@ -251,9 +255,9 @@ PUT /dummies/5e82ed5e/ HTTP/1.1
|
|
|
251
255
|
if-match: "1"
|
|
252
256
|
|
|
253
257
|
foo: baz
|
|
258
|
+
```
|
|
254
259
|
|
|
255
|
-
|
|
256
|
-
|
|
260
|
+
```http
|
|
257
261
|
200 OK
|
|
258
262
|
```
|
|
259
263
|
|
|
@@ -262,8 +266,10 @@ PUT /dummies/5e82ed5e/ HTTP/1.1
|
|
|
262
266
|
if-match: "never"
|
|
263
267
|
|
|
264
268
|
foo: baz
|
|
269
|
+
```
|
|
265
270
|
|
|
266
|
-
|
|
267
|
-
|
|
271
|
+
```http
|
|
268
272
|
412 Precondition Failed
|
|
269
273
|
```
|
|
274
|
+
|
|
275
|
+
The value within the quotes is mapped to the `version` property of operation call query.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Directive family Require
|
|
2
|
+
|
|
3
|
+
The `require` directive family provides the ability to specify HTTP request requirements to be met.
|
|
4
|
+
|
|
5
|
+
## Headers
|
|
6
|
+
|
|
7
|
+
`require:header` requires a specific header to be present in the request, and `require:headers`
|
|
8
|
+
requires a set of headers to be present.
|
|
9
|
+
|
|
10
|
+
```yaml
|
|
11
|
+
exposition:
|
|
12
|
+
/:id:
|
|
13
|
+
require:header: if-match # enforce concurrency control
|
|
14
|
+
PUT: transit
|
|
15
|
+
```
|
package/documentation/tree.md
CHANGED
|
@@ -102,7 +102,7 @@ HTTP methods can only be mapped to operations of the corresponding types.
|
|
|
102
102
|
| `GET` | **Observation**<br/>**Computation** |
|
|
103
103
|
| `PATCH` | **Assignment**<br/>**Effect** |
|
|
104
104
|
|
|
105
|
-
As method mapping is unambiguous for Observation,
|
|
105
|
+
As method mapping is unambiguous for Observation, Assignment, and Computation, a concise syntax is
|
|
106
106
|
available:
|
|
107
107
|
|
|
108
108
|
```yaml
|
|
@@ -110,7 +110,23 @@ available:
|
|
|
110
110
|
/items/:id: [observe, assign]
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
###
|
|
113
|
+
### Projections
|
|
114
|
+
|
|
115
|
+
A Method can have a `projection` key that specifies the fields of the operation result to be
|
|
116
|
+
included in the response.
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
/teapots:
|
|
120
|
+
GET:
|
|
121
|
+
endpoint: select
|
|
122
|
+
projection:
|
|
123
|
+
- name
|
|
124
|
+
- state
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> `id` is always included in the projection.
|
|
128
|
+
|
|
129
|
+
## Intermediate Nodes
|
|
114
130
|
|
|
115
131
|
An RTD Node that has a Route with a key `/` is an _intermediate_ Node.
|
|
116
132
|
Intermediate Nodes must not have Methods as they are unreachable.
|
|
@@ -124,8 +140,10 @@ Intermediate Nodes must not have Methods as they are unreachable.
|
|
|
124
140
|
|
|
125
141
|
## Directives
|
|
126
142
|
|
|
127
|
-
RTD Directives are declared using RTD node or Method keys following the `{family}:{directive}`
|
|
128
|
-
|
|
143
|
+
RTD Directives are declared using RTD node or Method keys following the `{family}:{directive}`
|
|
144
|
+
pattern and can be used
|
|
145
|
+
to add or modify the behavior of request processing. Directive declarations are applied to the RTD
|
|
146
|
+
node where they are
|
|
129
147
|
declared and to all nested nodes.
|
|
130
148
|
|
|
131
149
|
```yaml
|
package/documentation/vary.md
CHANGED
|
@@ -7,16 +7,15 @@ operation call.
|
|
|
7
7
|
|
|
8
8
|
```yaml
|
|
9
9
|
exposition:
|
|
10
|
-
|
|
11
|
-
toa: the.toa.io
|
|
12
|
-
/:
|
|
10
|
+
/:group:
|
|
13
11
|
vary:languages: [en, fr]
|
|
14
12
|
GET:
|
|
15
13
|
vary:embed:
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
app: authority # predefined embeddings
|
|
15
|
+
lang: language
|
|
18
16
|
token: :x-access-token # raw header value
|
|
19
|
-
|
|
17
|
+
group: /:group # route parameter
|
|
18
|
+
endpoint: observe
|
|
20
19
|
```
|
|
21
20
|
|
|
22
21
|
## Embeddings
|
|
@@ -30,13 +29,9 @@ If the value is an array, the first non-empty embedding function's result is use
|
|
|
30
29
|
> If a property is already present in the input, the embedded value will overwrite its current
|
|
31
30
|
> value.
|
|
32
31
|
|
|
33
|
-
###
|
|
32
|
+
### Authority
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
The list of domains is defined by the `vary:realms` directive,
|
|
37
|
-
which is a map of realm names to their domain names.
|
|
38
|
-
|
|
39
|
-
The `realm` embedding substitutes the realm identified based on the `host` request header.
|
|
34
|
+
The `authority` embedding substitutes request [authority identifier](authorities.md).
|
|
40
35
|
|
|
41
36
|
### Language
|
|
42
37
|
|
|
@@ -47,8 +42,8 @@ If neither of the supported languages matches, the first supported language is u
|
|
|
47
42
|
|
|
48
43
|
### Raw header values
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
values to be embedded into an operation call.
|
|
45
|
+
Values in the embedding map starting with a semicolon (:) are the names of HTTP request headers
|
|
46
|
+
whose values to be embedded into an operation call.
|
|
52
47
|
The names of these headers are then included in the `vary` HTTP response header
|
|
53
48
|
and [Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
|
|
54
49
|
of the [CORS](protocol.md#cors).
|
|
@@ -56,6 +51,11 @@ of the [CORS](protocol.md#cors).
|
|
|
56
51
|
[Multiple header fields](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) are embedded
|
|
57
52
|
as a comma-separated list.
|
|
58
53
|
|
|
54
|
+
### Route parameters
|
|
55
|
+
|
|
56
|
+
Values in the embedding map starting with `/:` are the names of route parameters whose values
|
|
57
|
+
to be embedded into an operation call.
|
|
58
|
+
|
|
59
59
|
### Fallbacks
|
|
60
60
|
|
|
61
61
|
If the embedding function is an array, the first non-empty resolved value is used.
|