@toa.io/extensions.exposition 1.0.0-alpha.9 → 1.0.0-alpha.91
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 +14 -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 +20 -10
- 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 +8 -6
- 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 +11 -9
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +32 -15
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +4 -11
- 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/assertions-as-values.js +4 -2
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
- package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
- package/components/identity.federation/operations/lib/jwt.js +25 -12
- 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} +15 -7
- 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/entity.js +3 -0
- 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 +6 -19
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
- package/components/identity.federation/source/lib/jwt.test.ts +123 -4
- package/components/identity.federation/source/lib/jwt.ts +36 -16
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
- 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 +5 -4
- package/components/identity.roles/manifest.toa.yaml +16 -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 -4
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +12 -5
- 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 +14 -6
- 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 +9 -11
- package/components/octets.storage/operations/get.js +3 -3
- package/components/octets.storage/operations/head.js +7 -0
- package/components/octets.storage/operations/put.js +121 -0
- package/documentation/access.md +75 -38
- package/documentation/authorities.md +49 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +61 -22
- package/documentation/flow.md +44 -0
- package/documentation/identity.md +17 -22
- package/documentation/introspection.md +82 -0
- package/documentation/octets.md +95 -67
- package/documentation/protocol.md +13 -3
- package/documentation/query.md +29 -4
- package/documentation/require.md +15 -0
- package/documentation/tree.md +13 -0
- package/documentation/vary.md +14 -14
- package/features/access.feature +77 -46
- package/features/annotation.feature +1 -0
- package/features/auth.claim.feature +170 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +100 -0
- package/features/authorities.tokens.feature +117 -0
- package/features/body.feature +2 -0
- package/features/cache.feature +109 -5
- package/features/cors.feature +6 -1
- package/features/debug.feature +34 -0
- package/features/directives.feature +3 -0
- package/features/dynamic.feature +48 -0
- package/features/errors.feature +32 -7
- package/features/etag.feature +108 -0
- package/features/flow.feature +96 -0
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +97 -26
- package/features/identity.feature +18 -6
- package/features/identity.federation.feature +66 -11
- package/features/identity.roles.feature +250 -7
- package/features/identity.tokens.feature +54 -4
- package/features/introspection.feature +153 -0
- package/features/io.feature +38 -1
- package/features/methods.feature +47 -0
- package/features/{octets.meta.feature → octets.attributes.feature} +16 -12
- package/features/octets.cloudinary.feature +68 -0
- package/features/octets.download.feature +189 -0
- package/features/octets.entries.feature +13 -55
- package/features/octets.feature +83 -107
- package/features/octets.workflows.feature +242 -58
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +77 -2
- package/features/realtime.feature +34 -0
- package/features/require.feature +67 -0
- package/features/response.feature +38 -3
- package/features/routes.feature +93 -2
- package/features/server.feature +21 -0
- package/features/steps/.env.example +3 -0
- package/features/steps/Database.ts +16 -9
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +30 -25
- package/features/steps/Parameters.ts +44 -1
- package/features/steps/Realtime.ts +151 -0
- package/features/steps/components/echo/manifest.toa.yaml +14 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/echo/operations/parameters.js +7 -0
- package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
- package/features/steps/components/echo.beacon/operations/hello.js +5 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +22 -2
- package/features/steps/components/octets.tester/operations/authority.js +7 -0
- package/features/steps/components/octets.tester/operations/bar.js +0 -1
- package/features/steps/components/octets.tester/operations/baz.js +0 -2
- package/features/steps/components/octets.tester/operations/foo.js +1 -2
- package/features/steps/components/octets.tester/operations/redirect.js +12 -0
- package/features/steps/components/octets.tester/operations/yex.js +16 -0
- package/features/steps/components/octets.tester/operations/yield.js +13 -0
- package/features/steps/components/pots/manifest.toa.yaml +14 -3
- package/features/steps/components/users/manifest.toa.yaml +0 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
- package/features/streams.feature +5 -0
- package/features/timing.feature +4 -1
- package/features/vary.feature +71 -0
- package/package.json +23 -14
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/method.cos.yaml +1 -1
- package/schemas/node.cos.yaml +2 -0
- package/schemas/octets/put.cos.yaml +25 -0
- package/schemas/query.cos.yaml +4 -10
- package/source/Annotation.ts +3 -3
- package/source/Branch.ts +1 -0
- package/source/Composition.ts +0 -6
- package/source/Context.ts +1 -0
- package/source/Directive.test.ts +1 -1
- package/source/Directive.ts +5 -6
- package/source/Endpoint.ts +59 -17
- package/source/Factory.ts +22 -13
- package/source/Gateway.ts +65 -18
- package/source/HTTP/Context.ts +26 -3
- package/source/HTTP/Server.ts +60 -46
- package/source/HTTP/exceptions.ts +13 -1
- package/source/HTTP/formats/index.ts +3 -3
- package/source/HTTP/messages.test.ts +45 -2
- package/source/HTTP/messages.ts +32 -8
- package/source/Introspection.ts +11 -0
- package/source/Mapping.ts +68 -21
- package/source/Query.test.ts +3 -3
- package/source/Query.ts +123 -33
- package/source/RTD/Context.ts +1 -1
- package/source/RTD/Endpoint.ts +3 -0
- package/source/RTD/Method.ts +16 -0
- package/source/RTD/Node.ts +29 -13
- package/source/RTD/Route.ts +5 -4
- package/source/RTD/Tree.ts +2 -2
- package/source/RTD/factory.ts +5 -2
- package/source/RTD/syntax/parse.test.ts +1 -1
- package/source/RTD/syntax/parse.ts +37 -24
- package/source/RTD/syntax/types.ts +6 -4
- package/source/Remotes.ts +7 -6
- package/source/Tenant.ts +6 -20
- package/source/deployment.ts +33 -23
- package/source/directives/auth/Authorization.ts +45 -22
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Echo.ts +19 -5
- package/source/directives/auth/Federation.ts +84 -0
- package/source/directives/auth/Incept.ts +4 -3
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/Scheme.ts +1 -1
- package/source/directives/auth/split.ts +1 -1
- package/source/directives/auth/types.ts +2 -2
- package/source/directives/cache/Cache.ts +13 -6
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +1 -1
- package/source/directives/dev/Development.ts +1 -1
- package/source/directives/flow/Compose.ts +68 -0
- package/source/directives/flow/Fetch.ts +86 -0
- package/source/directives/flow/Flow.ts +42 -0
- package/source/directives/flow/index.ts +3 -0
- package/source/directives/flow/types.ts +7 -0
- package/source/directives/index.ts +3 -1
- package/source/directives/io/IO.ts +1 -1
- package/source/directives/io/Input.ts +4 -4
- package/source/directives/io/Output.ts +5 -4
- package/source/directives/octets/Context.ts +3 -2
- package/source/directives/octets/Delete.ts +11 -11
- package/source/directives/octets/Get.ts +84 -0
- package/source/directives/octets/Octets.ts +8 -12
- package/source/directives/octets/{Store.ts → Put.ts} +36 -21
- package/source/directives/octets/Workflow.ts +1 -1
- package/source/directives/octets/bytes.test.ts +30 -0
- package/source/directives/octets/bytes.ts +18 -0
- package/source/directives/octets/schemas.ts +4 -8
- package/source/directives/octets/workflows/Execution.ts +60 -8
- package/source/directives/octets/workflows/Workflow.ts +4 -4
- 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 +6 -4
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- 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 +6 -4
- package/source/exceptions.ts +17 -11
- package/source/manifest.ts +10 -11
- package/source/root.ts +5 -5
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Branch.d.ts +1 -0
- package/transpiled/Composition.d.ts +0 -1
- package/transpiled/Composition.js +0 -4
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +1 -0
- package/transpiled/Directive.js +5 -5
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +6 -4
- package/transpiled/Endpoint.js +39 -9
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +3 -2
- package/transpiled/Factory.js +18 -10
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +3 -0
- package/transpiled/Gateway.js +49 -10
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +9 -2
- package/transpiled/HTTP/Context.js +16 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +46 -39
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +7 -1
- package/transpiled/HTTP/exceptions.js +13 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/index.js +3 -3
- package/transpiled/HTTP/formats/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +2 -1
- package/transpiled/HTTP/messages.js +30 -7
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Introspection.d.ts +9 -0
- package/transpiled/Introspection.js +3 -0
- package/transpiled/Introspection.js.map +1 -0
- package/transpiled/Mapping.d.ts +11 -2
- package/transpiled/Mapping.js +50 -19
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +10 -1
- package/transpiled/Query.js +87 -30
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +1 -1
- package/transpiled/RTD/Endpoint.d.ts +1 -0
- package/transpiled/RTD/Method.d.ts +4 -0
- package/transpiled/RTD/Method.js +11 -0
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -1
- package/transpiled/RTD/Node.js +23 -12
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.d.ts +1 -1
- package/transpiled/RTD/Route.js +0 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +5 -2
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +34 -22
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +5 -3
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.d.ts +4 -4
- package/transpiled/Remotes.js +6 -5
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +5 -5
- package/transpiled/Tenant.js +2 -13
- 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 +1 -1
- package/transpiled/directives/auth/Authorization.js +33 -19
- 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/Echo.d.ts +4 -3
- package/transpiled/directives/auth/Echo.js +13 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.d.ts +16 -0
- package/transpiled/directives/auth/Federation.js +57 -0
- package/transpiled/directives/auth/Federation.js.map +1 -0
- package/transpiled/directives/auth/Incept.js +4 -3
- 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/auth/Scheme.js +1 -1
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/split.js +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- 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.js +1 -1
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/flow/Compose.d.ts +8 -0
- package/transpiled/directives/flow/Compose.js +74 -0
- package/transpiled/directives/flow/Compose.js.map +1 -0
- package/transpiled/directives/flow/Fetch.d.ts +12 -0
- package/transpiled/directives/flow/Fetch.js +58 -0
- package/transpiled/directives/flow/Fetch.js.map +1 -0
- package/transpiled/directives/flow/Flow.d.ts +10 -0
- package/transpiled/directives/flow/Flow.js +33 -0
- package/transpiled/directives/flow/Flow.js.map +1 -0
- package/transpiled/directives/flow/index.d.ts +2 -0
- package/transpiled/directives/flow/index.js +6 -0
- package/transpiled/directives/flow/index.js.map +1 -0
- package/transpiled/directives/flow/types.d.ts +6 -0
- package/transpiled/directives/flow/types.js.map +1 -0
- package/transpiled/directives/index.js +3 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +2 -2
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +2 -2
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/octets/Context.js +4 -24
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js +8 -8
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
- package/transpiled/directives/octets/{Fetch.js → Get.js} +24 -29
- package/transpiled/directives/octets/Get.js.map +1 -0
- package/transpiled/directives/octets/Octets.js +8 -12
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +7 -2
- package/transpiled/directives/octets/{Store.js → Put.js} +26 -19
- package/transpiled/directives/octets/Put.js.map +1 -0
- package/transpiled/directives/octets/Workflow.js +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.d.ts +1 -0
- package/transpiled/directives/octets/bytes.js +21 -0
- package/transpiled/directives/octets/bytes.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +4 -8
- package/transpiled/directives/octets/schemas.js +3 -6
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
- package/transpiled/directives/octets/workflows/Execution.js +44 -9
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js +2 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- 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 +2 -2
- 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/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 +8 -4
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +10 -5
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/manifest.js +10 -11
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +5 -5
- 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/tsconfig.json +8 -2
- 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/fetch.js +0 -46
- package/components/octets.storage/operations/list.js +0 -7
- package/components/octets.storage/operations/permute.js +0 -7
- package/components/octets.storage/operations/store.js +0 -11
- package/features/steps/components/octets.tester/operations/diversify.js +0 -14
- package/schemas/octets/context.cos.yaml +0 -1
- package/schemas/octets/fetch.cos.yaml +0 -3
- package/schemas/octets/permute.cos.yaml +0 -1
- package/schemas/octets/store.cos.yaml +0 -3
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Fetch.ts +0 -100
- package/source/directives/octets/List.ts +0 -72
- package/source/directives/octets/Permute.ts +0 -44
- package/transpiled/directives/octets/Fetch.js.map +0 -1
- package/transpiled/directives/octets/List.d.ts +0 -16
- package/transpiled/directives/octets/List.js +0 -74
- package/transpiled/directives/octets/List.js.map +0 -1
- package/transpiled/directives/octets/Permute.d.ts +0 -11
- package/transpiled/directives/octets/Permute.js +0 -58
- package/transpiled/directives/octets/Permute.js.map +0 -1
- package/transpiled/directives/octets/Store.js.map +0 -1
- /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
- /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
|
@@ -4,24 +4,22 @@ name: storage
|
|
|
4
4
|
storages: ~
|
|
5
5
|
|
|
6
6
|
operations:
|
|
7
|
-
|
|
7
|
+
put:
|
|
8
8
|
bindings: ~
|
|
9
9
|
input:
|
|
10
10
|
storage*: string
|
|
11
11
|
request*: ~
|
|
12
12
|
accept: string
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
limit: number
|
|
14
|
+
trust: ~ # array of strings or regular expressions
|
|
15
|
+
errors:
|
|
16
|
+
- LOCATION_UNTRUSTED
|
|
17
|
+
- LOCATION_LENGTH
|
|
18
|
+
- LOCATION_UNAVAILABLE
|
|
19
|
+
get: &simple
|
|
15
20
|
bindings: ~
|
|
16
21
|
input:
|
|
17
22
|
storage*: string
|
|
18
23
|
path*: string
|
|
19
|
-
|
|
20
|
-
list: *simple
|
|
24
|
+
head: *simple
|
|
21
25
|
delete: *simple
|
|
22
|
-
permute:
|
|
23
|
-
bindings: ~
|
|
24
|
-
input:
|
|
25
|
-
storage*: string
|
|
26
|
-
path*: string
|
|
27
|
-
list*: [string]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
function get (input, context) {
|
|
4
|
-
return context.storages[input.storage].get(input.path)
|
|
3
|
+
async function get (input, context) {
|
|
4
|
+
return await context.storages[input.storage].get(input.path)
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
exports.
|
|
7
|
+
exports.effect = get
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { Readable } = require('node:stream')
|
|
4
|
+
const { Err } = require('error-value')
|
|
5
|
+
const { match } = require('matchacho')
|
|
6
|
+
|
|
7
|
+
async function put (input, context) {
|
|
8
|
+
const { storage, request, accept, limit, trust } = input
|
|
9
|
+
const path = request.url
|
|
10
|
+
const claim = request.headers['content-type']
|
|
11
|
+
const attributes = parseAttributes(request.headers['content-attributes'])
|
|
12
|
+
const location = request.headers['content-location']
|
|
13
|
+
|
|
14
|
+
/** @type {Readable} */
|
|
15
|
+
let body = request
|
|
16
|
+
|
|
17
|
+
const options = { claim, accept, attributes }
|
|
18
|
+
|
|
19
|
+
if (location !== undefined) {
|
|
20
|
+
const length = Number.parseInt(request.headers['content-length'])
|
|
21
|
+
|
|
22
|
+
if (length !== 0)
|
|
23
|
+
return ERR_LENGTH
|
|
24
|
+
|
|
25
|
+
if (!trusted(location, trust))
|
|
26
|
+
return ERR_UNTRUSTED
|
|
27
|
+
|
|
28
|
+
body = await download(location)
|
|
29
|
+
|
|
30
|
+
if (body instanceof Error)
|
|
31
|
+
return body
|
|
32
|
+
|
|
33
|
+
options.origin = location
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (limit !== undefined)
|
|
37
|
+
options.limit = limit
|
|
38
|
+
|
|
39
|
+
return context.storages[storage].put(path, body, options)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @param {string | string[] | undefined} values
|
|
44
|
+
* @returns {Record<string, string>}
|
|
45
|
+
*/
|
|
46
|
+
function parseAttributes (values) {
|
|
47
|
+
const attributes = {}
|
|
48
|
+
|
|
49
|
+
if (values === undefined)
|
|
50
|
+
return attributes
|
|
51
|
+
|
|
52
|
+
if (typeof values === 'string')
|
|
53
|
+
values = values.split(',')
|
|
54
|
+
|
|
55
|
+
for (const pair of values) {
|
|
56
|
+
const eq = pair.indexOf('=')
|
|
57
|
+
const key = (eq === -1 ? pair : pair.slice(0, eq)).trim()
|
|
58
|
+
|
|
59
|
+
attributes[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return attributes
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param {string} location
|
|
67
|
+
* @return {Readable | Error}
|
|
68
|
+
*/
|
|
69
|
+
async function download (location) {
|
|
70
|
+
const response = await fetch(location)
|
|
71
|
+
|
|
72
|
+
if (!response.ok)
|
|
73
|
+
return ERR_UNAVAILABLE
|
|
74
|
+
|
|
75
|
+
return response.body === null ? ERR_UNAVAILABLE : Readable.fromWeb(
|
|
76
|
+
/** @type {import('node:stream/web').ReadableStream} **/ response.body)
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param {string} location
|
|
82
|
+
* @param {Trust | undefined} trust
|
|
83
|
+
* @return {boolean}
|
|
84
|
+
*/
|
|
85
|
+
function trusted (location, trust) {
|
|
86
|
+
if (trust === undefined)
|
|
87
|
+
return false
|
|
88
|
+
|
|
89
|
+
const url = toURL(location)
|
|
90
|
+
|
|
91
|
+
if (url === null)
|
|
92
|
+
return false
|
|
93
|
+
|
|
94
|
+
for (const permission of trust) {
|
|
95
|
+
const ok = match(permission,
|
|
96
|
+
String, (origin) => url.origin === origin,
|
|
97
|
+
RegExp, (pattern) => pattern.test(url.origin))
|
|
98
|
+
|
|
99
|
+
if (ok)
|
|
100
|
+
return true
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return false
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function toURL (location) {
|
|
107
|
+
try {
|
|
108
|
+
return new URL(location)
|
|
109
|
+
} catch (error) {
|
|
110
|
+
return null
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const ERR_UNTRUSTED = Err('LOCATION_UNTRUSTED', 'Location is not trusted')
|
|
115
|
+
const ERR_LENGTH = Err('LOCATION_LENGTH', 'Content-Length must be 0 when Content-Location is used')
|
|
116
|
+
const ERR_UNAVAILABLE = Err('LOCATION_UNAVAILABLE', 'Location is not available')
|
|
117
|
+
|
|
118
|
+
exports.effect = put
|
|
119
|
+
|
|
120
|
+
/** @typedef {Array<string | RegExp>} Trust */
|
|
121
|
+
/** @typedef {import('node:stream').Readable} Readable */
|
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
|
|
|
@@ -37,11 +37,8 @@ the directive's value.
|
|
|
37
37
|
Given the Route declaration and corresponding HTTP request:
|
|
38
38
|
|
|
39
39
|
```yaml
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
exposition:
|
|
43
|
-
/users/:user-id:
|
|
44
|
-
id: "user-id"
|
|
40
|
+
/users/:user-id:
|
|
41
|
+
id: "user-id"
|
|
45
42
|
```
|
|
46
43
|
|
|
47
44
|
```http
|
|
@@ -56,46 +53,97 @@ is `87480f2bd88048518c529d7957475ecd`.
|
|
|
56
53
|
|
|
57
54
|
Grants access if resolved Identity has a role matching the directive's value or one of its values.
|
|
58
55
|
|
|
59
|
-
#### Example
|
|
60
|
-
|
|
61
56
|
```yaml
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
exposition:
|
|
65
|
-
/code:
|
|
66
|
-
role: [developer, reviewer]
|
|
57
|
+
/code:
|
|
58
|
+
role: [developer, reviewer]
|
|
67
59
|
```
|
|
68
60
|
|
|
69
61
|
Access will be granted if the resolved Identity has a role that matches `developer` or `reviewer`.
|
|
70
62
|
|
|
71
63
|
Read [Roles](#roles) section for more details.
|
|
72
64
|
|
|
65
|
+
#### Dynamic roles
|
|
66
|
+
|
|
67
|
+
The `role` directive can be used with a placeholder in the route.
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
/:org-id:
|
|
71
|
+
role: app:{org-id}:moderator
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### `claim`
|
|
75
|
+
|
|
76
|
+
Grants access if `Bearer` authentication scheme is used and the claim's property matches specified.
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
/:
|
|
80
|
+
auth:claim:
|
|
81
|
+
iss: https://id.example.com
|
|
82
|
+
sub: someone
|
|
83
|
+
aud: stars
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> If OIDC token claim contains `aud`
|
|
87
|
+
> as [an array](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation), the
|
|
88
|
+
> directive will match if at least one value.
|
|
89
|
+
|
|
90
|
+
At least one property is required.
|
|
91
|
+
|
|
92
|
+
Values may refer to the Route parameters, or a request authority:
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
/secrets/:org-id:
|
|
96
|
+
auth:claim:
|
|
97
|
+
iss: https://id.org.com
|
|
98
|
+
sub: /:org-id
|
|
99
|
+
aud: :authority
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
An expression `:domain` will match if the domain in the value of `iss` matches the request
|
|
103
|
+
authority, excluding the most specific subdomain.
|
|
104
|
+
|
|
105
|
+
Issuer `https://accounts.example.com` matches request authorities `images.example.com`
|
|
106
|
+
and `sub.images.example.com`, but not `images.another.com`.
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
/images/:user-id:
|
|
110
|
+
auth:claim:
|
|
111
|
+
iss: :domain
|
|
112
|
+
sub: /:org-id
|
|
113
|
+
```
|
|
114
|
+
|
|
73
115
|
### `rule`
|
|
74
116
|
|
|
75
117
|
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.
|
|
118
|
+
directives grant access. The value of the `rule` directive can be a single Rule or a list of Rules.
|
|
78
119
|
|
|
79
120
|
#### Example
|
|
80
121
|
|
|
81
122
|
```yaml
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
rule:
|
|
87
|
-
id: user-id
|
|
88
|
-
role: developer
|
|
123
|
+
/commits/:user-id:
|
|
124
|
+
rule:
|
|
125
|
+
id: user-id
|
|
126
|
+
role: developer
|
|
89
127
|
```
|
|
90
128
|
|
|
91
129
|
Access will be granted if an Identity matches a `user-id` placeholder and has a Role of `developer`.
|
|
92
130
|
|
|
131
|
+
### `delegate`
|
|
132
|
+
|
|
133
|
+
Embeds the value of the current Identity into the request body as a property named after the value
|
|
134
|
+
of the directive value, and grants access.
|
|
135
|
+
The request body must be an object.
|
|
136
|
+
|
|
137
|
+
> :warning:<br/>
|
|
138
|
+
> The intended use case for this directive is audit.
|
|
139
|
+
> **Using it to pass Identity to the application logic is strongly discouraged.**
|
|
140
|
+
|
|
93
141
|
## Roles
|
|
94
142
|
|
|
95
143
|
Role values are strings that can be assigned to an Identity and used for matching with values of
|
|
96
144
|
the [`role` directive](#role).
|
|
97
145
|
|
|
98
|
-
###
|
|
146
|
+
### Hierarchies
|
|
99
147
|
|
|
100
148
|
Role values are alphanumeric tokens separated by a colon (`:`).
|
|
101
149
|
Each token defines a Role Scope, forming a hierarchy.
|
|
@@ -105,11 +153,8 @@ directive.
|
|
|
105
153
|
#### Example
|
|
106
154
|
|
|
107
155
|
```yaml
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
/exposition:
|
|
111
|
-
/commits/:user-id:
|
|
112
|
-
role: developer:senior
|
|
156
|
+
/commits/:user-id:
|
|
157
|
+
role: developer:senior
|
|
113
158
|
```
|
|
114
159
|
|
|
115
160
|
The example above defines a `role` directive with the specified `developer:senior` Role Scope.
|
|
@@ -124,18 +169,10 @@ In other words, the Identity must have a specified or more general Role.
|
|
|
124
169
|
</picture>
|
|
125
170
|
</a>
|
|
126
171
|
|
|
127
|
-
|
|
128
172
|
> The root-level Role Scope `system` is preserved and cannot be used with the `role` directives.
|
|
129
173
|
|
|
130
174
|
See also [role management resources](components.md#roles).
|
|
131
175
|
|
|
132
|
-
#### Authorization Directives
|
|
133
|
-
|
|
134
|
-
```yaml
|
|
135
|
-
/identity/roles/:id:
|
|
136
|
-
role: system:roles
|
|
137
|
-
````
|
|
138
|
-
|
|
139
176
|
## Policies
|
|
140
177
|
|
|
141
178
|
Component Resource branches cannot have authorization directives.
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
## Embedding
|
|
21
|
+
|
|
22
|
+
To pass the requested authority to the operation call, [`vary:embed` directive](vary.md#embeddings)
|
|
23
|
+
can be used.
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
# manifest.toa.yaml
|
|
27
|
+
|
|
28
|
+
exposition:
|
|
29
|
+
/:
|
|
30
|
+
GET:
|
|
31
|
+
vary:embed:
|
|
32
|
+
app: authority
|
|
33
|
+
endpoint: observe
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If the value of the `authority` pseudo-header is not present in the `authorities` definition,
|
|
37
|
+
then the value of the `authority` pseudo-header is embedded as is.
|
|
38
|
+
|
|
39
|
+
## Identity
|
|
40
|
+
|
|
41
|
+
Credentials stored or issued by the [authentication system](identity.md) are associated with an
|
|
42
|
+
authority.
|
|
43
|
+
Credentials in one authority are not valid in another,
|
|
44
|
+
or may be associated with a different Identity; in other words, Identity exists in the context of an
|
|
45
|
+
authority.
|
|
46
|
+
|
|
47
|
+
> :warning:<br/>
|
|
48
|
+
> Changing the authority identifier will break compatibility with existing stored or issued
|
|
49
|
+
> 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
|
|
261
|
+
|
|
262
|
+
`/identity/tokens/`
|
|
253
263
|
|
|
254
|
-
|
|
264
|
+
`POST` Issue a new token for the Identity. Request body is as follows:
|
|
265
|
+
|
|
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
|
|
255
275
|
|
|
256
|
-
|
|
276
|
+
The `identity.roles` component manages roles of an Identity used
|
|
277
|
+
by [access authorization](access.md#role).
|
|
257
278
|
|
|
258
|
-
|
|
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.
|
|
@@ -304,3 +329,17 @@ roles:
|
|
|
304
329
|
- developer
|
|
305
330
|
- system:identity:roles
|
|
306
331
|
```
|
|
332
|
+
|
|
333
|
+
When no credentials are provided, transient Identity is created.
|
|
334
|
+
|
|
335
|
+
```http
|
|
336
|
+
GET /identity/
|
|
337
|
+
accept: application/yaml
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
201 Created
|
|
342
|
+
|
|
343
|
+
id: 332017649c814649b25ee466c1fe4534
|
|
344
|
+
roles: []
|
|
345
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Request flow
|
|
2
|
+
|
|
3
|
+
## `flow:fetch`
|
|
4
|
+
|
|
5
|
+
Fetches the content from the resource returned by the specified endpoint.
|
|
6
|
+
|
|
7
|
+
The value of the directive is a `string` specifying endpoint to be called for the redirection
|
|
8
|
+
request.
|
|
9
|
+
|
|
10
|
+
Request `authority`, `path` and `parameters` are passed as input to the redirection endpoint,
|
|
11
|
+
and it must return a URL `string`, an `Error` or an object with the following properties:
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
url: string
|
|
15
|
+
options?:
|
|
16
|
+
method?: string
|
|
17
|
+
headers?: Record<string, string>
|
|
18
|
+
body?: string
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If it returns a URL or Request, then the response to the specified request is returned as the
|
|
22
|
+
response to the original request, along with the `content-type`, `content-length`, and `etag`
|
|
23
|
+
headers.
|
|
24
|
+
|
|
25
|
+
## `flow:compose`
|
|
26
|
+
|
|
27
|
+
Compose an object from a response stream in object mode.
|
|
28
|
+
|
|
29
|
+
The value of the directive is an object whose values are JavaScript expressions
|
|
30
|
+
accessing the response stream objects composed into an array named `$`.
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
flow:compose:
|
|
34
|
+
one: $[0].status
|
|
35
|
+
two: $[1].data.foo
|
|
36
|
+
three: $[2].amount
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
flow:compose:
|
|
41
|
+
sum: $[0].value + $[1].value
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Be careful.
|