@toa.io/extensions.exposition 1.0.0-alpha.2 → 1.0.0-alpha.21
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/identity.bans/manifest.toa.yaml +15 -6
- 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 +5 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/manifest.toa.yaml +13 -7
- package/components/identity.federation/operations/authenticate.js +4 -4
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/create.js +4 -4
- package/components/identity.federation/operations/create.js.map +1 -1
- package/components/identity.federation/operations/{assertions-as-values.cjs → lib/assertions-as-values.js} +1 -1
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/{jwt.d.cts → lib/jwt.d.ts} +5 -4
- package/components/identity.federation/operations/{jwt.cjs → lib/jwt.js} +35 -11
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +16 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types.d.ts +1 -1
- package/components/identity.federation/source/authenticate.ts +2 -2
- package/components/identity.federation/source/create.ts +2 -2
- package/components/identity.federation/source/{assertions-as-values.cts → lib/assertions-as-values.ts} +1 -2
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/{jwt.cts → lib/jwt.ts} +57 -29
- package/components/identity.federation/source/schemas.ts +16 -0
- package/components/identity.federation/source/types.ts +1 -1
- package/components/identity.federation/tsconfig.json +2 -2
- package/components/identity.roles/manifest.toa.yaml +18 -5
- 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 +12 -3
- package/components/identity.tokens/operations/authenticate.js +5 -2
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.js +4 -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 +1 -2
- package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
- package/components/identity.tokens/source/authenticate.ts +5 -2
- package/components/identity.tokens/source/encrypt.test.ts +22 -1
- package/components/identity.tokens/source/encrypt.ts +4 -1
- package/components/identity.tokens/source/types.ts +1 -2
- package/components/octets.storage/operations/store.js +1 -1
- package/documentation/access.md +27 -16
- package/documentation/cache.md +8 -1
- package/documentation/components.md +55 -23
- package/documentation/identity.md +7 -0
- package/documentation/io.md +56 -0
- package/documentation/octets.md +12 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +50 -5
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +9 -3
- package/features/access.feature +28 -49
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +39 -0
- package/features/cors.feature +2 -2
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +7 -4
- package/features/etag.feature +97 -0
- package/features/identity.bans.feature +128 -0
- package/features/identity.basic.feature +68 -3
- package/features/identity.federation.feature +78 -5
- package/features/identity.roles.feature +205 -1
- package/features/identity.tokens.feature +98 -0
- package/features/io.feature +196 -0
- package/features/octets.entries.feature +3 -1
- package/features/octets.feature +32 -10
- package/features/octets.meta.feature +4 -3
- package/features/octets.workflows.feature +39 -0
- package/features/queries.feature +9 -1
- package/features/require.feature +64 -0
- package/features/response.feature +7 -1
- package/features/routes.feature +17 -10
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +3 -0
- package/features/steps/IdP.ts +55 -21
- package/features/steps/components/echo/manifest.toa.yaml +5 -0
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +56 -3
- package/package.json +13 -14
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- 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/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +7 -7
- package/source/Directive.ts +19 -46
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +17 -7
- package/source/Gateway.ts +40 -51
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +1 -1
- package/source/HTTP/Server.ts +61 -96
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/exceptions.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +32 -48
- package/source/Mapping.ts +7 -8
- 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 +6 -0
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/Authorization.ts +17 -14
- package/source/directives/auth/Delegate.ts +35 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +27 -17
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +5 -5
- package/source/directives/cache/Control.ts +48 -22
- package/source/directives/cache/types.ts +1 -1
- package/source/directives/cors/CORS.ts +18 -10
- 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 +5 -4
- package/source/directives/octets/Delete.ts +25 -13
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +33 -17
- package/source/directives/octets/List.ts +18 -8
- package/source/directives/octets/Octets.ts +12 -8
- package/source/directives/octets/Permute.ts +16 -9
- package/source/directives/octets/Store.ts +43 -19
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +2 -0
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/octets/{workflow → workflows}/Execution.ts +0 -2
- package/source/directives/octets/{workflow → workflows}/Workflow.ts +2 -2
- 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 +8 -6
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Header.ts +9 -7
- package/source/directives/vary/embeddings/Language.ts +2 -2
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +3 -3
- package/source/exceptions.ts +22 -11
- package/source/io.ts +2 -2
- package/source/root.ts +5 -0
- package/transpiled/Annotation.d.ts +1 -0
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +8 -21
- package/transpiled/Directive.js +11 -14
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +58 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +8 -2
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +4 -8
- package/transpiled/Gateway.js +23 -33
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +8 -7
- package/transpiled/HTTP/Server.js +69 -77
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/exceptions.d.ts +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/index.d.ts +1 -0
- package/transpiled/HTTP/index.js +1 -0
- package/transpiled/HTTP/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +7 -21
- package/transpiled/HTTP/messages.js +24 -26
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Mapping.js +7 -7
- package/transpiled/Mapping.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.js +5 -0
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +3 -4
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Authorization.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +10 -8
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +29 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +11 -6
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +25 -17
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +3 -3
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +5 -4
- package/transpiled/directives/cache/Control.js +32 -15
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +1 -1
- package/transpiled/directives/cors/CORS.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +17 -10
- 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/io/Input.js +63 -0
- 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 +4 -4
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +5 -4
- package/transpiled/directives/octets/Delete.js +24 -12
- 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 +4 -3
- package/transpiled/directives/octets/Fetch.js +31 -15
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +4 -3
- package/transpiled/directives/octets/List.js +16 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +8 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Permute.d.ts +4 -3
- package/transpiled/directives/octets/Permute.js +14 -7
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +6 -4
- package/transpiled/directives/octets/Store.js +28 -13
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +2 -0
- package/transpiled/directives/octets/schemas.js +2 -1
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/octets/{workflow → workflows}/Execution.js +0 -1
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/{workflow → workflows}/Workflow.d.ts +1 -1
- package/transpiled/directives/octets/{workflow → workflows}/Workflow.js +2 -2
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- 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 +4 -4
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/Header.js +9 -7
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +2 -2
- 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 +5 -3
- 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/io.d.ts +2 -2
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/assertions-as-values.cjs.map +0 -1
- package/components/identity.federation/operations/jwt.cjs.map +0 -1
- package/source/HTTP/Server.fixtures.ts +0 -40
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
- package/transpiled/HTTP/Server.fixtures.js +0 -31
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/octets/workflow/Execution.js.map +0 -1
- package/transpiled/directives/octets/workflow/Workflow.js.map +0 -1
- package/transpiled/directives/octets/workflow/index.js.map +0 -1
- /package/components/identity.federation/operations/{assertions-as-values.d.cts → lib/assertions-as-values.d.ts} +0 -0
- /package/source/directives/octets/{workflow → workflows}/index.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/Execution.d.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/index.d.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/index.js +0 -0
|
@@ -96,9 +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.
|
|
104
|
+
|
|
105
|
+
Toa supports either asymmetric RS256 or symmetric HS256 / HS384 / HS512 tokens with pre-shared
|
|
106
|
+
secrets.
|
|
102
107
|
|
|
103
108
|
```yaml
|
|
104
109
|
# context.toa.yaml
|
|
@@ -110,6 +115,11 @@ configuration:
|
|
|
110
115
|
audience:
|
|
111
116
|
- https://github.com/tinovyatkin
|
|
112
117
|
- https://github.com/temich
|
|
118
|
+
|
|
119
|
+
- issuer: some.private.issuer
|
|
120
|
+
secrets:
|
|
121
|
+
HS256:
|
|
122
|
+
k1: <secret-to-be-used-for-hs256>
|
|
113
123
|
```
|
|
114
124
|
|
|
115
125
|
## Stateless tokens
|
|
@@ -125,6 +135,14 @@ The new token is issued each time the request is made:
|
|
|
125
135
|
1. Using authentication scheme other than `Token`.
|
|
126
136
|
2. Using `Token` authentication scheme with an [obsolete token](#token-rotation).
|
|
127
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
|
+
|
|
128
146
|
### Token encryption
|
|
129
147
|
|
|
130
148
|
Issued tokens are encrypted
|
|
@@ -135,7 +153,7 @@ using the `key0` configuration value as a secret.
|
|
|
135
153
|
# context.toa.yaml
|
|
136
154
|
|
|
137
155
|
configuration:
|
|
138
|
-
identity.
|
|
156
|
+
identity.tokens:
|
|
139
157
|
key0: $TOKEN_ENCRYPTION_KEY
|
|
140
158
|
```
|
|
141
159
|
|
|
@@ -146,25 +164,22 @@ The `key0` configuration value is required.
|
|
|
146
164
|
### Token rotation
|
|
147
165
|
|
|
148
166
|
Issued tokens are valid for a `lifetime` period defined in the configuration. After the `refresh`
|
|
149
|
-
period, the token is
|
|
150
|
-
|
|
151
|
-
provided one has
|
|
152
|
-
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).
|
|
153
169
|
|
|
154
170
|
This essentially means that if the client uses the token at least once every `lifetime` period, it
|
|
155
|
-
will always have a
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
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.
|
|
159
174
|
|
|
160
175
|
Adjusting these two values is a delicate trade-off between security, performance and client
|
|
161
|
-
|
|
176
|
+
convenience.
|
|
162
177
|
|
|
163
178
|
```yaml
|
|
164
179
|
# context.toa.yaml
|
|
165
180
|
|
|
166
181
|
configuration:
|
|
167
|
-
identity.
|
|
182
|
+
identity.tokens:
|
|
168
183
|
lifetime: 2592000 # seconds, 30 days
|
|
169
184
|
refresh: 600 # seconds, 10 minutes
|
|
170
185
|
```
|
|
@@ -192,7 +207,7 @@ the `key0` and `key1` values in order.
|
|
|
192
207
|
# context.toa.yaml
|
|
193
208
|
|
|
194
209
|
configuration:
|
|
195
|
-
identity.
|
|
210
|
+
identity.tokens:
|
|
196
211
|
key0: $TOKEN_ENCRYPTION_KEY_2023Q3
|
|
197
212
|
key1: $TOKEN_ENCRYPTION_KEY_2023Q2
|
|
198
213
|
```
|
|
@@ -224,7 +239,7 @@ The secret rotation is a 2-step process:
|
|
|
224
239
|
# context.toa.yaml
|
|
225
240
|
|
|
226
241
|
configuration:
|
|
227
|
-
identity.
|
|
242
|
+
identity.tokens:
|
|
228
243
|
key0: $TOKEN_ENCRYPTION_KEY_2023Q3
|
|
229
244
|
key1: $TOKEN_ENCRYPTION_KEY_2023Q4
|
|
230
245
|
```
|
|
@@ -237,18 +252,31 @@ configuration:
|
|
|
237
252
|
# context.toa.yaml
|
|
238
253
|
|
|
239
254
|
configuration:
|
|
240
|
-
identity.
|
|
255
|
+
identity.tokens:
|
|
241
256
|
key0: $TOKEN_ENCRYPTION_KEY_2023Q4
|
|
242
257
|
key1: $TOKEN_ENCRYPTION_KEY_2023Q3
|
|
243
258
|
```
|
|
244
259
|
|
|
245
|
-
|
|
260
|
+
### Token resources
|
|
261
|
+
|
|
262
|
+
`/identity/tokens/`
|
|
263
|
+
|
|
264
|
+
`POST` Issue a new token for the Identity. Request body is as follows:
|
|
265
|
+
|
|
266
|
+
```yaml
|
|
267
|
+
lifetime?: number # seconds
|
|
268
|
+
```
|
|
246
269
|
|
|
247
|
-
|
|
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).
|
|
248
273
|
|
|
249
|
-
|
|
274
|
+
## Roles
|
|
250
275
|
|
|
251
|
-
|
|
276
|
+
The `identity.roles` component manages roles of an Identity used
|
|
277
|
+
by [access authorization](access.md#role).
|
|
278
|
+
|
|
279
|
+
### `/identity/roles/:id/`
|
|
252
280
|
|
|
253
281
|
`GET` Get roles of an Identity.
|
|
254
282
|
|
|
@@ -260,13 +288,16 @@ Access requires credentials of the Identity or `system:identity:roles` role.
|
|
|
260
288
|
role: string
|
|
261
289
|
```
|
|
262
290
|
|
|
263
|
-
|
|
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)).
|
|
264
295
|
|
|
265
296
|
## Banned Identities
|
|
266
297
|
|
|
267
298
|
The `identity.bans` component manages banned identities.
|
|
268
|
-
A banned identity will fail to authenticate with any associated credentials
|
|
269
|
-
the `refresh` period).
|
|
299
|
+
A banned identity will fail to authenticate with any associated credentials
|
|
300
|
+
(except [tokens](#stateless-tokens) within the `refresh` period).
|
|
270
301
|
|
|
271
302
|
```http
|
|
272
303
|
PUT /identity/bans/:id/
|
|
@@ -274,6 +305,7 @@ authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
|
|
|
274
305
|
content-type: application/yaml
|
|
275
306
|
|
|
276
307
|
banned: true
|
|
308
|
+
comment: Bye bye
|
|
277
309
|
```
|
|
278
310
|
|
|
279
311
|
Access requires `system:identity:bans` role.
|
|
@@ -80,7 +80,14 @@ configuration:
|
|
|
80
80
|
- issuer: https://accounts.google.com
|
|
81
81
|
audience:
|
|
82
82
|
- <GOOGLE_CLIENT_ID>
|
|
83
|
+
|
|
83
84
|
- issuer: https://appleid.apple.com
|
|
85
|
+
|
|
86
|
+
- issuer: private.entity
|
|
87
|
+
secrets:
|
|
88
|
+
HS384:
|
|
89
|
+
key0: <THE-SECRET-STRING-FOR-HS384>
|
|
90
|
+
key1: <THE-SECRET-STRING-FOR-HS384> # selected by `kid` in the JWT header
|
|
84
91
|
```
|
|
85
92
|
|
|
86
93
|
## Identity inception
|
|
@@ -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.
|
package/documentation/octets.md
CHANGED
|
@@ -209,6 +209,18 @@ under the request path.
|
|
|
209
209
|
|
|
210
210
|
The request body must be a list of entry identifiers.
|
|
211
211
|
|
|
212
|
+
## `octets:workflow`
|
|
213
|
+
|
|
214
|
+
Execute a [workflow](#workflows) on the entry under the request path.
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
/images:
|
|
218
|
+
/*:
|
|
219
|
+
DELETE:
|
|
220
|
+
octets:workflow:
|
|
221
|
+
archive: images.archive
|
|
222
|
+
```
|
|
223
|
+
|
|
212
224
|
## Workflows
|
|
213
225
|
|
|
214
226
|
A workflow is a list of endpoints to be called.
|
|
@@ -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
|
|
@@ -45,7 +45,7 @@ Undefined `query` denies any query arguments in requests.
|
|
|
45
45
|
|
|
46
46
|
## Criteria
|
|
47
47
|
|
|
48
|
-
Search
|
|
48
|
+
Search criteria in [RSQL](https://github.com/jirutka/rsql-parser) format.
|
|
49
49
|
|
|
50
50
|
The `criteria` property is considered as *open* when it ends with a `;`, allowing the combination of
|
|
51
51
|
request query criteria using `and` logic.
|
|
@@ -77,7 +77,7 @@ query:
|
|
|
77
77
|
|
|
78
78
|
### Path variables
|
|
79
79
|
|
|
80
|
-
Path variables are prepended to the `criteria` request query parameter using
|
|
80
|
+
Path variables are prepended to the `criteria` request query parameter using logical AND,
|
|
81
81
|
except for the [`POST` method](#post-method).
|
|
82
82
|
|
|
83
83
|
Given the following declaration:
|
|
@@ -224,3 +224,48 @@ A list of Entity properties to be included in the Observation result.
|
|
|
224
224
|
```yaml
|
|
225
225
|
projection: [id, title, timestamp]
|
|
226
226
|
```
|
|
227
|
+
|
|
228
|
+
## Optimistic concurrency control
|
|
229
|
+
|
|
230
|
+
If an operation returns an object with `_version` property,
|
|
231
|
+
then its value is passed as the value of
|
|
232
|
+
the [`etag` header](https://datatracker.ietf.org/doc/html/rfc7232#section-2.3) in the response
|
|
233
|
+
(and removed from the object).
|
|
234
|
+
|
|
235
|
+
Client can use the `if-match` request header to perform an operation only if the corresponding
|
|
236
|
+
object has not been modified since the last retrieval.
|
|
237
|
+
|
|
238
|
+
```http
|
|
239
|
+
GET /dummies/5e82ed5e/ HTTP/1.1
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
HTTP/1.1 200 OK
|
|
244
|
+
etag: "1"
|
|
245
|
+
|
|
246
|
+
foo: bar
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```http request
|
|
250
|
+
PUT /dummies/5e82ed5e/ HTTP/1.1
|
|
251
|
+
if-match: "1"
|
|
252
|
+
|
|
253
|
+
foo: baz
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
```http
|
|
257
|
+
200 OK
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```http request
|
|
261
|
+
PUT /dummies/5e82ed5e/ HTTP/1.1
|
|
262
|
+
if-match: "never"
|
|
263
|
+
|
|
264
|
+
foo: baz
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
```http
|
|
268
|
+
412 Precondition Failed
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
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
|
@@ -9,13 +9,14 @@ operation call.
|
|
|
9
9
|
exposition:
|
|
10
10
|
realms:
|
|
11
11
|
toa: the.toa.io
|
|
12
|
-
/:
|
|
12
|
+
/:group:
|
|
13
13
|
vary:languages: [en, fr]
|
|
14
14
|
GET:
|
|
15
15
|
vary:embed:
|
|
16
16
|
lang: language # predefined embeddings
|
|
17
17
|
realm: realm
|
|
18
18
|
token: :x-access-token # raw header value
|
|
19
|
+
group: /:group # route parameter
|
|
19
20
|
endpoint: dummies.get
|
|
20
21
|
```
|
|
21
22
|
|
|
@@ -47,8 +48,8 @@ If neither of the supported languages matches, the first supported language is u
|
|
|
47
48
|
|
|
48
49
|
### Raw header values
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
values to be embedded into an operation call.
|
|
51
|
+
Values in the embedding map starting with a semicolon (:) are the names of HTTP request headers
|
|
52
|
+
whose values to be embedded into an operation call.
|
|
52
53
|
The names of these headers are then included in the `vary` HTTP response header
|
|
53
54
|
and [Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
|
|
54
55
|
of the [CORS](protocol.md#cors).
|
|
@@ -56,6 +57,11 @@ of the [CORS](protocol.md#cors).
|
|
|
56
57
|
[Multiple header fields](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) are embedded
|
|
57
58
|
as a comma-separated list.
|
|
58
59
|
|
|
60
|
+
### Route parameters
|
|
61
|
+
|
|
62
|
+
Values in the embedding map starting with `/:` are the names of route parameters whose values
|
|
63
|
+
to be embedded into an operation call.
|
|
64
|
+
|
|
59
65
|
### Fallbacks
|
|
60
66
|
|
|
61
67
|
If the embedding function is an array, the first non-empty resolved value is used.
|
package/features/access.feature
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@security
|
|
1
2
|
Feature: Access authorization
|
|
2
3
|
|
|
3
4
|
Background:
|
|
@@ -30,6 +31,7 @@ Feature: Access authorization
|
|
|
30
31
|
Given the annotation:
|
|
31
32
|
"""yaml
|
|
32
33
|
/:
|
|
34
|
+
io:output: true
|
|
33
35
|
auth:anonymous: true
|
|
34
36
|
GET:
|
|
35
37
|
dev:stub:
|
|
@@ -71,6 +73,7 @@ Feature: Access authorization
|
|
|
71
73
|
Given the annotation:
|
|
72
74
|
"""yaml
|
|
73
75
|
/:
|
|
76
|
+
io:output: true
|
|
74
77
|
/:id:
|
|
75
78
|
auth:id: id
|
|
76
79
|
GET:
|
|
@@ -109,6 +112,7 @@ Feature: Access authorization
|
|
|
109
112
|
And the annotation:
|
|
110
113
|
"""yaml
|
|
111
114
|
/:
|
|
115
|
+
io:output: true
|
|
112
116
|
auth:role: developer
|
|
113
117
|
GET:
|
|
114
118
|
dev:stub:
|
|
@@ -146,6 +150,7 @@ Feature: Access authorization
|
|
|
146
150
|
And the annotation:
|
|
147
151
|
"""yaml
|
|
148
152
|
/:
|
|
153
|
+
io:output: true
|
|
149
154
|
/:
|
|
150
155
|
auth:role: developer:rust:junior # role scope matches
|
|
151
156
|
/nested:
|
|
@@ -190,6 +195,7 @@ Feature: Access authorization
|
|
|
190
195
|
- developer
|
|
191
196
|
- admin
|
|
192
197
|
GET:
|
|
198
|
+
io:output: true
|
|
193
199
|
dev:stub:
|
|
194
200
|
access: granted!
|
|
195
201
|
"""
|
|
@@ -215,6 +221,7 @@ Feature: Access authorization
|
|
|
215
221
|
And the annotation:
|
|
216
222
|
"""yaml
|
|
217
223
|
/:
|
|
224
|
+
io:output: true
|
|
218
225
|
/rust/:id:
|
|
219
226
|
auth:rule:
|
|
220
227
|
id: id
|
|
@@ -257,6 +264,7 @@ Feature: Access authorization
|
|
|
257
264
|
Given the annotation:
|
|
258
265
|
"""yaml
|
|
259
266
|
/:
|
|
267
|
+
io:output: true
|
|
260
268
|
/:id:
|
|
261
269
|
auth:id: id
|
|
262
270
|
GET:
|
|
@@ -295,6 +303,7 @@ Feature: Access authorization
|
|
|
295
303
|
Given the annotation:
|
|
296
304
|
"""yaml
|
|
297
305
|
/:
|
|
306
|
+
io:output: true
|
|
298
307
|
auth:role: developer
|
|
299
308
|
GET:
|
|
300
309
|
dev:stub:
|
|
@@ -335,6 +344,7 @@ Feature: Access authorization
|
|
|
335
344
|
Given the annotation:
|
|
336
345
|
"""yaml
|
|
337
346
|
/:
|
|
347
|
+
io:output: true
|
|
338
348
|
/:id:
|
|
339
349
|
auth:scheme: basic
|
|
340
350
|
auth:id: id
|
|
@@ -374,7 +384,8 @@ Feature: Access authorization
|
|
|
374
384
|
|
|
375
385
|
Given the annotation:
|
|
376
386
|
"""yaml
|
|
377
|
-
|
|
387
|
+
/:
|
|
388
|
+
anonymous: true
|
|
378
389
|
"""
|
|
379
390
|
When the following request is received:
|
|
380
391
|
"""
|
|
@@ -388,62 +399,30 @@ Feature: Access authorization
|
|
|
388
399
|
401 Unauthorized
|
|
389
400
|
"""
|
|
390
401
|
|
|
391
|
-
Scenario:
|
|
402
|
+
Scenario: Authorization delegation
|
|
392
403
|
Given the `identity.roles` database contains:
|
|
393
|
-
| _id | identity | role
|
|
394
|
-
| 775a648d054e4ce1a65f8f17e5b51803 | efe3a65ebbee47ed95a73edd911ea328 |
|
|
395
|
-
And the
|
|
396
|
-
"""yaml
|
|
397
|
-
/:
|
|
398
|
-
/:id:
|
|
399
|
-
auth:id: id
|
|
400
|
-
GET:
|
|
401
|
-
dev:stub:
|
|
402
|
-
access: granted!
|
|
403
|
-
"""
|
|
404
|
-
And the `identity.tokens` configuration:
|
|
404
|
+
| _id | identity | role |
|
|
405
|
+
| 775a648d054e4ce1a65f8f17e5b51803 | efe3a65ebbee47ed95a73edd911ea328 | developer |
|
|
406
|
+
And the `echo` is running with the following manifest:
|
|
405
407
|
"""yaml
|
|
406
|
-
|
|
408
|
+
exposition:
|
|
409
|
+
/:
|
|
410
|
+
io:output: true
|
|
411
|
+
auth:delegate: identity
|
|
412
|
+
GET: identity
|
|
407
413
|
"""
|
|
408
414
|
When the following request is received:
|
|
409
415
|
"""
|
|
410
|
-
GET /
|
|
411
|
-
authorization: Basic
|
|
416
|
+
GET /echo/ HTTP/1.1
|
|
417
|
+
authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
|
|
418
|
+
accept: application/yaml
|
|
412
419
|
"""
|
|
413
420
|
Then the following reply is sent:
|
|
414
421
|
"""
|
|
415
422
|
200 OK
|
|
416
|
-
authorization: Token ${{ token }}
|
|
417
|
-
"""
|
|
418
|
-
When the following request is received:
|
|
419
|
-
"""
|
|
420
|
-
PUT /identity/bans/e8e4f9c2a68d419b861403d71fabc915/ HTTP/1.1
|
|
421
|
-
authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
|
|
422
|
-
content-type: application/yaml
|
|
423
423
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
204 No Content
|
|
429
|
-
"""
|
|
430
|
-
# accessing a resource with a banned Identity
|
|
431
|
-
When the following request is received:
|
|
432
|
-
"""
|
|
433
|
-
GET /e8e4f9c2a68d419b861403d71fabc915/ HTTP/1.1
|
|
434
|
-
authorization: Basic dXNlcjoxMjM0NQ==
|
|
435
|
-
"""
|
|
436
|
-
Then the following reply is sent:
|
|
437
|
-
"""
|
|
438
|
-
401 Unauthorized
|
|
439
|
-
"""
|
|
440
|
-
Then after 1 second
|
|
441
|
-
When the following request is received:
|
|
442
|
-
"""
|
|
443
|
-
GET /e8e4f9c2a68d419b861403d71fabc915/ HTTP/1.1
|
|
444
|
-
authorization: Token ${{ token }}
|
|
445
|
-
"""
|
|
446
|
-
Then the following reply is sent:
|
|
447
|
-
"""
|
|
448
|
-
401 Unauthorized
|
|
424
|
+
identity:
|
|
425
|
+
id: efe3a65ebbee47ed95a73edd911ea328
|
|
426
|
+
roles:
|
|
427
|
+
- developer
|
|
449
428
|
"""
|
package/features/body.feature
CHANGED
|
@@ -5,7 +5,8 @@ Feature: Request body
|
|
|
5
5
|
"""yaml
|
|
6
6
|
exposition:
|
|
7
7
|
/:
|
|
8
|
-
|
|
8
|
+
io:output: true
|
|
9
|
+
POST: create
|
|
9
10
|
"""
|
|
10
11
|
When the following request is received:
|
|
11
12
|
"""
|
|
@@ -25,6 +26,7 @@ Feature: Request body
|
|
|
25
26
|
"""yaml
|
|
26
27
|
exposition:
|
|
27
28
|
/:name:
|
|
29
|
+
io:output: true
|
|
28
30
|
GET: <operation>
|
|
29
31
|
"""
|
|
30
32
|
When the following request is received:
|