@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293
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.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
|
@@ -1,472 +0,0 @@
|
|
|
1
|
-
# Components and resources
|
|
2
|
-
|
|
3
|
-
Exposition comes with a set of components that run within the same process. These components are
|
|
4
|
-
configured in the same
|
|
5
|
-
way as if they were a part of the Context. Resources exposed by the components
|
|
6
|
-
are [isolated](tree.md#directives).
|
|
7
|
-
|
|
8
|
-
See [Persistent credentials](credentials.md) for the centralized Basic, federation, and passkey
|
|
9
|
-
management API.
|
|
10
|
-
|
|
11
|
-
## Basic credentials
|
|
12
|
-
|
|
13
|
-
The `identity.basic` component stores basic credentials.
|
|
14
|
-
|
|
15
|
-
### Password hashing
|
|
16
|
-
|
|
17
|
-
Passwords are hashed using the [bcrypt](https://github.com/dcodeIO/bcrypt.js) algorithm with salt
|
|
18
|
-
and pepper.
|
|
19
|
-
|
|
20
|
-
```yaml
|
|
21
|
-
# context.toa.yaml
|
|
22
|
-
|
|
23
|
-
configuration:
|
|
24
|
-
identity.basic:
|
|
25
|
-
rounds: 10 # salt rounds
|
|
26
|
-
pepper: $IDENTITY_BASIC_PEPPER # hashing pepper, a secret
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Credentials constraints
|
|
30
|
-
|
|
31
|
-
Credential constraints are defined using a set of regular expressions (values must match all of
|
|
32
|
-
them).
|
|
33
|
-
|
|
34
|
-
```yaml
|
|
35
|
-
# context.toa.yaml
|
|
36
|
-
|
|
37
|
-
configuration:
|
|
38
|
-
identity.basic:
|
|
39
|
-
username:
|
|
40
|
-
- ^\S{1,128}$
|
|
41
|
-
password:
|
|
42
|
-
- ^\S{8,32}$
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
> Values in the example above are the default values.
|
|
46
|
-
|
|
47
|
-
### Principal
|
|
48
|
-
|
|
49
|
-
When an application is deployed for the first time, there are no credentials, and therefore, there
|
|
50
|
-
is no Identity that
|
|
51
|
-
could have a Role to manage Roles of other Identities.
|
|
52
|
-
|
|
53
|
-
This issue is addressed by using the `principal` key in the configuration:
|
|
54
|
-
|
|
55
|
-
```yaml
|
|
56
|
-
# context.toa.yaml
|
|
57
|
-
|
|
58
|
-
configuration:
|
|
59
|
-
identity.basic:
|
|
60
|
-
principal:
|
|
61
|
-
authority: example
|
|
62
|
-
username: root
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
`principal` names the authority and the `username` of the basic credentials. Once these
|
|
66
|
-
credentials are created in that authority, the associated Identity is assigned the `system` Role.
|
|
67
|
-
The same username in another authority is ordinary credentials.
|
|
68
|
-
|
|
69
|
-
Credentials created by inception are granted the Role before the reply, so the token that reply
|
|
70
|
-
carries already holds it.
|
|
71
|
-
|
|
72
|
-
Once created, the username of the principal cannot be modified.
|
|
73
|
-
|
|
74
|
-
### Resources
|
|
75
|
-
|
|
76
|
-
#### `/identity/basic/`
|
|
77
|
-
|
|
78
|
-
<code>POST</code> Create new Identity with Basic credentials. Request body is as follows:
|
|
79
|
-
|
|
80
|
-
```yaml
|
|
81
|
-
username: string
|
|
82
|
-
password: string
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Returns `201 Created` if the Identity is created,
|
|
86
|
-
or `422 Unprocessable Entity` with one of the error codes:
|
|
87
|
-
|
|
88
|
-
- `INVALID_USERNAME` - `username` does not match constraints
|
|
89
|
-
- `INVALID_PASSWORD` - `password` does not match constraints
|
|
90
|
-
|
|
91
|
-
Access is [anonymous](access.md#anonymous).
|
|
92
|
-
|
|
93
|
-
#### `/identity/basic/:id/`
|
|
94
|
-
|
|
95
|
-
> `:id` placeholder refers to an Identity.
|
|
96
|
-
|
|
97
|
-
<code>PUT</code> Update basic credentials. Request body is as follows:
|
|
98
|
-
|
|
99
|
-
```yaml
|
|
100
|
-
username?: string
|
|
101
|
-
password?: string
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Access requires basic credentials of the modified Identity or `system:identity:basic` role.
|
|
105
|
-
|
|
106
|
-
<code>POST</code> Incept new basic credentials. Request body is as follows:
|
|
107
|
-
|
|
108
|
-
```yaml
|
|
109
|
-
username: string
|
|
110
|
-
password: string
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Identity should not have associated basic credentials. Access requires any credentials of the Identity.
|
|
114
|
-
|
|
115
|
-
#### `/identity/basic/usernames/:username/`
|
|
116
|
-
|
|
117
|
-
<code>GET</code> Check if the username is available.
|
|
118
|
-
|
|
119
|
-
`username` must be Base64 URL encoded.
|
|
120
|
-
|
|
121
|
-
Returns empty response with status `204` if the username is already taken or `404` if it is available.
|
|
122
|
-
|
|
123
|
-
## Identity federation (OpenID connect)
|
|
124
|
-
|
|
125
|
-
The `identity.federation` component manages OpenID Connect federated identities.
|
|
126
|
-
|
|
127
|
-
Both implicit identities creation and forced [identity inception](./identity.md) are supported
|
|
128
|
-
as in case with basic credentials. `principal` is also working in the same way.
|
|
129
|
-
|
|
130
|
-
The configuration schema alongside default values is described in
|
|
131
|
-
the [component manifest](../components/identity.federation/manifest.toa.yaml).
|
|
132
|
-
|
|
133
|
-
No federated tokens are accepted by default until at least one entry is added to the `trust`
|
|
134
|
-
configuration.
|
|
135
|
-
|
|
136
|
-
Issuer metadata is loaded from `<iss>/.well-known/openid-configuration`; signing keys are then
|
|
137
|
-
loaded from its `jwks_uri`. These requests, including Authorization Code token exchange, use the
|
|
138
|
-
built-in `context.fetch`, so they participate in standard HTTP telemetry and connection pooling.
|
|
139
|
-
JWKS resolvers are cached per fetch instance and issuer.
|
|
140
|
-
|
|
141
|
-
```yaml
|
|
142
|
-
# context.toa.yaml
|
|
143
|
-
|
|
144
|
-
configuration:
|
|
145
|
-
identity.federation:
|
|
146
|
-
trust:
|
|
147
|
-
- iss: https://token.actions.githubusercontent.com
|
|
148
|
-
aud:
|
|
149
|
-
- https://github.com/tinovyatkin
|
|
150
|
-
- https://github.com/temich
|
|
151
|
-
|
|
152
|
-
- iss: https://accounts.google.com
|
|
153
|
-
aud: <GOOGLE_CLIENT_ID>
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## Local tokens
|
|
157
|
-
|
|
158
|
-
The `identity.tokens` component manages local authentication tokens.
|
|
159
|
-
|
|
160
|
-
These tokens carry the information required to authenticate the Identity and authorize access.
|
|
161
|
-
|
|
162
|
-
### Issuing tokens
|
|
163
|
-
|
|
164
|
-
The new token is issued each time the request is made:
|
|
165
|
-
|
|
166
|
-
1. Using authentication scheme other than `Token`.
|
|
167
|
-
2. Using `Token` authentication scheme with an [obsolete token](#token-rotation).
|
|
168
|
-
|
|
169
|
-
When the token is issued it is sent in the `authorization` response header and the `cache-control`
|
|
170
|
-
is set to `no-store`.
|
|
171
|
-
|
|
172
|
-
```http
|
|
173
|
-
authorization: Token ...
|
|
174
|
-
cache-control: no-store
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Custom tokens
|
|
178
|
-
|
|
179
|
-
Custom tokens can be issued with a specific set of permissions and scopes for the own Identity or by
|
|
180
|
-
an Identity with the `system:identity:tokens` role.
|
|
181
|
-
|
|
182
|
-
Tokens are issued with custom secret keys and are not subject to [token rotation](#token-rotation).
|
|
183
|
-
To invalidate a custom token, its secret key must be deleted.
|
|
184
|
-
|
|
185
|
-
Custom tokens have no `refresh` period, that is, never become obsolete and never refreshed.
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
POST /identity/tokens/<identity>/
|
|
189
|
-
host: nex.toa.io
|
|
190
|
-
authorization: ...
|
|
191
|
-
accept: application/yaml
|
|
192
|
-
content-type: application/yaml
|
|
193
|
-
|
|
194
|
-
lifetime: 3600
|
|
195
|
-
label: CI deployment token
|
|
196
|
-
scopes: [app:developer]
|
|
197
|
-
permissions:
|
|
198
|
-
/users/fc8e66dd/: [GET, PUT]
|
|
199
|
-
/posts/fc8e66dd/**/comments/: [*]
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
201 Created
|
|
204
|
-
content-type: application/yaml
|
|
205
|
-
|
|
206
|
-
kid: <key-id>
|
|
207
|
-
exp: <unix-time-ms>
|
|
208
|
-
token: <token>
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
- `lifetime`: Issued token will be valid for this period
|
|
212
|
-
(default is specified in [the configuration](#token-rotation)).
|
|
213
|
-
The value of `0` means the token will not expire, which is supported, but
|
|
214
|
-
**strongly not recommended** for production environments.
|
|
215
|
-
- `label`: Required human-readable name used when listing and revoking issued tokens.
|
|
216
|
-
- `scopes`: Issued token will assume only specified [role scopes](access.md#roles).
|
|
217
|
-
- `permissions`: Issued token will have permissions to access only specified resources and methods.
|
|
218
|
-
Supports [glob patterns](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
|
|
219
|
-
and a wildcard method.
|
|
220
|
-
Patterns are matched against the request path as it is routed: normalized, without the query
|
|
221
|
-
string.
|
|
222
|
-
|
|
223
|
-
> `roles` and `permissions` are additional restrictions applied on top of the Identity’s inherent
|
|
224
|
-
> privileges.
|
|
225
|
-
|
|
226
|
-
### Custom token invalidation
|
|
227
|
-
|
|
228
|
-
A custom token is invalidated through its secret key. The key is revoked, and every token issued
|
|
229
|
-
with it is refused, when the Identity is [banned](#banned-identities), its
|
|
230
|
-
[Basic credentials](#basic-credentials) are modified, or one of its [roles](#roles) is revoked.
|
|
231
|
-
The key can also be deleted by the Identity that issued the token or by an Identity with the
|
|
232
|
-
`system:identity:keys` role.
|
|
233
|
-
|
|
234
|
-
```
|
|
235
|
-
DELETE /identity/keys/<identity>/<key.id>/
|
|
236
|
-
authorization: ...
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
The key `id` is returned as `kid` when the token is issued, is visible in the JWE protected header,
|
|
240
|
-
and can also be obtained by listing issued token keys. The secret key itself is never returned by
|
|
241
|
-
the listing endpoint.
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
GET /identity/keys/<identity>/
|
|
245
|
-
authorization: ...
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
The listing returns `id`, `label`, optional `expires`, `revokedAt` where the key is revoked, and
|
|
249
|
-
`CREATED`. Revocation and deletion prevent new cache lookups from finding a usable key. A runtime
|
|
250
|
-
that already cached it can continue accepting the token for up to `identity.tokens.cache.ttl`
|
|
251
|
-
milliseconds (10 minutes by default).
|
|
252
|
-
|
|
253
|
-
Both listing and deletion require credentials of the owning Identity or the
|
|
254
|
-
`system:identity:keys` role. Key creation is internal to `identity.tokens`; there is no public
|
|
255
|
-
endpoint that returns a stored secret.
|
|
256
|
-
|
|
257
|
-
### Token encryption
|
|
258
|
-
|
|
259
|
-
Issued tokens are compact JWE tokens encrypted with direct symmetric encryption. Their protected
|
|
260
|
-
header is `{ alg: 'dir', enc: 'A256GCM', typ: 'JWT', kid: <key id> }`. Keys are configured in one
|
|
261
|
-
`keys` array. The first entry whose `format` is `jwe` or omitted is the active issuance key.
|
|
262
|
-
Keys are 256-bit secrets encoded with base64url and can be generated with `toa key`.
|
|
263
|
-
|
|
264
|
-
The optional `format` is `jwe` by default. Entries with `format: paseto` contain legacy PASETO
|
|
265
|
-
V3.local secrets and are used only to read old tokens. Legacy tokens are always marked for refresh;
|
|
266
|
-
only JWE tokens are issued.
|
|
267
|
-
The `format` property is transitional and can be removed together with the PASETO entries after the
|
|
268
|
-
legacy compatibility window ends.
|
|
269
|
-
|
|
270
|
-
```yaml
|
|
271
|
-
# context.toa.yaml
|
|
272
|
-
|
|
273
|
-
configuration:
|
|
274
|
-
identity.tokens:
|
|
275
|
-
keys:
|
|
276
|
-
- id: 2026q3
|
|
277
|
-
key: $IDENTITY_TOKENS_ENCRYPTION_KEY0
|
|
278
|
-
- id: legacy
|
|
279
|
-
key: $IDENTITY_TOKENS_KEY0
|
|
280
|
-
format: paseto
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
At least one JWE entry is required. PASETO entries are required only while previously issued legacy
|
|
284
|
-
tokens must remain readable.
|
|
285
|
-
|
|
286
|
-
> Valid secret key may be generated using the [`toa key` command](/runtime/cli/readme.md#key).
|
|
287
|
-
|
|
288
|
-
### Token rotation
|
|
289
|
-
|
|
290
|
-
Issued tokens are valid for a `lifetime` period defined in the configuration. After the `refresh`
|
|
291
|
-
period, the token is considered obsolete (yet still valid), and a new token
|
|
292
|
-
is [issued](#issuing-tokens) unless the provided one has been [revoked](#token-revocation).
|
|
293
|
-
|
|
294
|
-
This essentially means that if the client uses the token at least once every `lifetime` period, it
|
|
295
|
-
will always have a valid token to authenticate with.
|
|
296
|
-
Also, token revocation or changing roles of an Identity will take effect once the `refresh` period
|
|
297
|
-
of the currently issued tokens has expired.
|
|
298
|
-
|
|
299
|
-
A change of what an Identity may do reaches every credential it holds: a token issued by the
|
|
300
|
-
gateway within `refresh`, a [custom token](#custom-tokens) within `cache.ttl`.
|
|
301
|
-
|
|
302
|
-
Adjusting these two values is a delicate trade-off between security, performance and client
|
|
303
|
-
convenience.
|
|
304
|
-
|
|
305
|
-
```yaml
|
|
306
|
-
# context.toa.yaml
|
|
307
|
-
|
|
308
|
-
configuration:
|
|
309
|
-
identity.tokens:
|
|
310
|
-
lifetime: 2592000 # seconds, 30 days
|
|
311
|
-
refresh: 600 # seconds, 10 minutes
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
> Values in the example above are the default values.
|
|
315
|
-
|
|
316
|
-
### Token revocation
|
|
317
|
-
|
|
318
|
-
All currently issued tokens of an Identity are revoked when:
|
|
319
|
-
|
|
320
|
-
1. [Basic credentials](#basic-credentials) associated with the Identity are modified.
|
|
321
|
-
2. Identity is [banned](#banned-identities).
|
|
322
|
-
|
|
323
|
-
Token revocation takes effect once the `refresh` period of the currently issued tokens has expired.
|
|
324
|
-
[Custom tokens](#custom-tokens) are revoked through their keys, within `cache.ttl`.
|
|
325
|
-
|
|
326
|
-
### Secret rotation
|
|
327
|
-
|
|
328
|
-
Tokens are always encrypted using the first JWE entry of the `keys` array and decrypted by the
|
|
329
|
-
entry in the corresponding format branch whose `id` matches the token's `kid`.
|
|
330
|
-
|
|
331
|
-
Rotation uses array order rather than object property order: index `0` is active for issuance and
|
|
332
|
-
the remaining entries are decrypt-only. Use the staged procedure below so every runtime knows the
|
|
333
|
-
new key before it becomes active.
|
|
334
|
-
|
|
335
|
-
Old keys must remain configured until every token issued with them has expired. In the default
|
|
336
|
-
configuration this means retaining them for at least `lifetime` (30 days) after making a new key
|
|
337
|
-
active. The shorter `refresh` interval only controls replacement during active client use and is
|
|
338
|
-
not a safe removal window for clients that remain idle.
|
|
339
|
-
|
|
340
|
-
> Let's say you are adding a new secret key each quarter: `2024Q1`, `2024Q2` and so on.
|
|
341
|
-
> The old key `2024Q1` must be removed only after the maximum lifetime of tokens issued with it has
|
|
342
|
-
> elapsed.
|
|
343
|
-
|
|
344
|
-
```yaml
|
|
345
|
-
# context.toa.yaml
|
|
346
|
-
|
|
347
|
-
configuration:
|
|
348
|
-
identity.tokens:
|
|
349
|
-
keys:
|
|
350
|
-
- id: 2026q3
|
|
351
|
-
key: $TOKEN_ENCRYPTION_KEY_2026Q3
|
|
352
|
-
- id: 2026q4
|
|
353
|
-
key: $TOKEN_ENCRYPTION_KEY_2026Q4
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
1. First deploy both keys everywhere with the current key at index `0`, as shown above.
|
|
357
|
-
2. In an atomic rollout, move the new entry to index `0` and keep the current entry after it.
|
|
358
|
-
All instances can then decrypt tokens encrypted with both the new key and the current key.
|
|
359
|
-
|
|
360
|
-
```yaml
|
|
361
|
-
# context.toa.yaml
|
|
362
|
-
|
|
363
|
-
configuration:
|
|
364
|
-
identity.tokens:
|
|
365
|
-
keys:
|
|
366
|
-
- id: 2026q4
|
|
367
|
-
key: $TOKEN_ENCRYPTION_KEY_2026Q4
|
|
368
|
-
- id: 2026q3
|
|
369
|
-
key: $TOKEN_ENCRYPTION_KEY_2026Q3
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
3. Remove `2026q3` only after its last possible token has expired.
|
|
373
|
-
|
|
374
|
-
The PASETO-to-JWE runtime migration must also be atomic: legacy runtimes cannot decrypt newly
|
|
375
|
-
issued JWE tokens. Keep every `format: paseto` entry until its last token has expired;
|
|
376
|
-
`toa key --format paseto` exists only for maintaining those legacy secrets.
|
|
377
|
-
|
|
378
|
-
### Token resources
|
|
379
|
-
|
|
380
|
-
`/identity/tokens/`
|
|
381
|
-
|
|
382
|
-
`POST` Issue a new token for the Identity. Request body is as follows:
|
|
383
|
-
|
|
384
|
-
```yaml
|
|
385
|
-
lifetime?: number # seconds
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
Providing a value of `0` will result in the token being issued with no expiration.
|
|
389
|
-
However, it will still become invalid once the encryption key used is out
|
|
390
|
-
of [rotation](#secret-rotation).
|
|
391
|
-
|
|
392
|
-
## Roles
|
|
393
|
-
|
|
394
|
-
The `identity.roles` component manages roles of an Identity used
|
|
395
|
-
by [access authorization](access.md#role).
|
|
396
|
-
|
|
397
|
-
### `/identity/roles/:id/`
|
|
398
|
-
|
|
399
|
-
`GET` Get roles of an Identity.
|
|
400
|
-
|
|
401
|
-
Access requires credentials of the Identity or `system:identity:roles` role.
|
|
402
|
-
|
|
403
|
-
`POST` Add a role to an Identity. Request body is as follows:
|
|
404
|
-
|
|
405
|
-
```yaml
|
|
406
|
-
role: string
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
To assign arbitrary roles, the `system:identity:roles` role is required.
|
|
410
|
-
|
|
411
|
-
An Identity having `system:identity:roles:delegation` role can delegate roles within its own
|
|
412
|
-
Role Scopes (see [Role Hierarchies](access.md#hierarchies)), except roles within the
|
|
413
|
-
`system:identity:roles` scope: the right to delegate is not delegated.
|
|
414
|
-
|
|
415
|
-
### `/identity/roles/:id/:role/`
|
|
416
|
-
|
|
417
|
-
`DELETE` Revoke a role of an Identity. The `system:identity:roles` role is required.
|
|
418
|
-
|
|
419
|
-
A Token carries the roles it was issued with; a change reaches its holder when the token is
|
|
420
|
-
[refreshed](#token-rotation). Revoking a role also revokes the [custom tokens](#custom-tokens) of
|
|
421
|
-
the Identity, which are issued again with the roles it has left.
|
|
422
|
-
|
|
423
|
-
## Banned Identities
|
|
424
|
-
|
|
425
|
-
The `identity.bans` component manages banned identities.
|
|
426
|
-
A banned identity will fail to authenticate with any associated credentials
|
|
427
|
-
(except [tokens](#local-tokens) within the `refresh` period).
|
|
428
|
-
|
|
429
|
-
```http
|
|
430
|
-
PUT /identity/bans/:id/
|
|
431
|
-
authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
|
|
432
|
-
content-type: application/yaml
|
|
433
|
-
|
|
434
|
-
banned: true
|
|
435
|
-
comment: Bye bye
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
Access requires `system:identity:bans` role.
|
|
439
|
-
|
|
440
|
-
## Authentication echo
|
|
441
|
-
|
|
442
|
-
Exposition implements a predefined resource `/identity/` with the `GET` method, which returns the
|
|
443
|
-
Identity resolved by the provided credentials.
|
|
444
|
-
|
|
445
|
-
```http
|
|
446
|
-
GET /identity/
|
|
447
|
-
authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
|
|
448
|
-
accept: application/yaml
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
```
|
|
452
|
-
200 OK
|
|
453
|
-
|
|
454
|
-
id: fc8e66ddd51d45eea89602c9dd38a542
|
|
455
|
-
roles:
|
|
456
|
-
- developer
|
|
457
|
-
- system:identity:roles
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
When no credentials are provided, transient Identity is created.
|
|
461
|
-
|
|
462
|
-
```http
|
|
463
|
-
GET /identity/
|
|
464
|
-
accept: application/yaml
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
```
|
|
468
|
-
201 Created
|
|
469
|
-
|
|
470
|
-
id: 332017649c814649b25ee466c1fe4534
|
|
471
|
-
roles: []
|
|
472
|
-
```
|
package/documentation/consent.md
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# Consent
|
|
2
|
-
|
|
3
|
-
The one endpoint of the [authorization server](oauth.md) that needs a person, and so the one this
|
|
4
|
-
extension does not serve. An application serves it at the URL its `exposition.oauth.authorize`
|
|
5
|
-
names.
|
|
6
|
-
|
|
7
|
-
The page is reached by a client opening it in the user's browser. It authenticates the user, shows
|
|
8
|
-
them who is asking, and on their assent redirects back to the client with a code.
|
|
9
|
-
|
|
10
|
-
## What the page receives
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
GET https://app.example.com/oauth/authorize
|
|
14
|
-
?response_type=code
|
|
15
|
-
&client_id=https%3A%2F%2Fclaude.ai%2Foauth%2Fclaude-code-client-metadata
|
|
16
|
-
&redirect_uri=http%3A%2F%2Flocalhost%3A3118%2Fcallback
|
|
17
|
-
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
|
|
18
|
-
&code_challenge_method=S256
|
|
19
|
-
&state=af0ifjsldkj
|
|
20
|
-
&resource=https%3A%2F%2Fapi.example.com%2Fmcp
|
|
21
|
-
&scope=app:notes
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`state` is the client's and is returned untouched. `code_challenge`, `code_challenge_method`,
|
|
25
|
-
`client_id`, `redirect_uri` and `resource` are passed on as they arrived.
|
|
26
|
-
|
|
27
|
-
## What the page does
|
|
28
|
-
|
|
29
|
-
The user is authenticated by whatever means the application already offers. The page then holds
|
|
30
|
-
that identity's own `Token`, and makes two calls with it.
|
|
31
|
-
|
|
32
|
-
Who is asking:
|
|
33
|
-
|
|
34
|
-
```http
|
|
35
|
-
GET /identity/clients/https%3A%2F%2Fclaude.ai%2Foauth%2Fclaude-code-client-metadata/ HTTP/1.1
|
|
36
|
-
authorization: Token …
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
```yaml
|
|
40
|
-
client_id: https://claude.ai/oauth/claude-code-client-metadata
|
|
41
|
-
client_name: Claude Code
|
|
42
|
-
client_uri: https://claude.ai
|
|
43
|
-
logo_uri: https://claude.ai/logo.png
|
|
44
|
-
redirect_uris: [http://localhost/callback, http://127.0.0.1/callback]
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
The page displays `client_name`, and **the host of `redirect_uri`**. A loopback redirect is
|
|
48
|
-
indistinguishable from any other local process, so the user is told where the code will be sent.
|
|
49
|
-
|
|
50
|
-
On assent:
|
|
51
|
-
|
|
52
|
-
```http
|
|
53
|
-
POST /identity/grants/:identity/ HTTP/1.1
|
|
54
|
-
authorization: Token …
|
|
55
|
-
content-type: application/json
|
|
56
|
-
|
|
57
|
-
{"client": "…", "redirect": "…", "challenge": "…", "method": "S256",
|
|
58
|
-
"scope": ["app:notes"], "resource": ["https://api.example.com/mcp"]}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
```http
|
|
62
|
-
201 Created
|
|
63
|
-
cache-control: no-store
|
|
64
|
-
|
|
65
|
-
{"code": "SplxlOBeZQQYbYS6WxSbIA", "expires_in": 60}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
`:identity` is the id of the identity that consents, which is the one the page authenticated.
|
|
69
|
-
|
|
70
|
-
## What the page answers
|
|
71
|
-
|
|
72
|
-
On assent, a redirect carrying the code, the client's `state`, and the issuer:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
302 Found
|
|
76
|
-
location: http://localhost:3118/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=af0ifjsldkj&iss=https%3A%2F%2Fapi.example.com
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
A single-page application does this with `location.assign`; nothing requires a server redirect.
|
|
80
|
-
|
|
81
|
-
`iss` is [RFC 9207](https://www.rfc-editor.org/rfc/rfc9207), and the metadata declares that it is
|
|
82
|
-
sent, so a client rejects a response without it. Its value is the `issuer` of
|
|
83
|
-
`/.well-known/oauth-authorization-server`, which the page may read.
|
|
84
|
-
|
|
85
|
-
On refusal, a redirect saying so, not an error page:
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
302 Found
|
|
89
|
-
location: http://localhost:3118/callback?error=access_denied&state=af0ifjsldkj&iss=https%3A%2F%2Fapi.example.com
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Errors
|
|
93
|
-
|
|
94
|
-
`400` with `error` and `error_description` is answered when the client is unknown, when the
|
|
95
|
-
redirect is not one that client may receive a code at, or when the challenge method is not `S256`.
|
|
96
|
-
A redirect that was not registered must not be redirected to; the page states the refusal itself.
|
|
97
|
-
|
|
98
|
-
## Consent is asked every time
|
|
99
|
-
|
|
100
|
-
A grant is recorded, and `GET /identity/grants/:identity/` lists what a user allowed, but it is
|
|
101
|
-
not consulted to skip this page.
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# Persistent credentials
|
|
2
|
-
|
|
3
|
-
Persistent credentials associate an [Identity](identity.md) with a reusable authentication method.
|
|
4
|
-
Exposition stores Basic, OpenID Connect federation, and WebAuthn passkey credentials. Local tokens
|
|
5
|
-
and one-time passwords are not persistent credentials: tokens are stateless and OTP records expire.
|
|
6
|
-
|
|
7
|
-
See [Features](../features/credentials.feature).
|
|
8
|
-
|
|
9
|
-
## Listing credentials
|
|
10
|
-
|
|
11
|
-
`GET /identity/credentials/:identity/` returns all persistent credentials associated with the
|
|
12
|
-
Identity in the current authority. Access requires credentials of that Identity.
|
|
13
|
-
|
|
14
|
-
```http
|
|
15
|
-
GET /identity/credentials/fc8e66ddd51d45eea89602c9dd38a542/ HTTP/1.1
|
|
16
|
-
authorization: Token ...
|
|
17
|
-
accept: application/yaml
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
```yaml
|
|
21
|
-
basic:
|
|
22
|
-
username: user@example.com
|
|
23
|
-
federation:
|
|
24
|
-
- id: 09200d0bcc2448c5863e3f50ae18af84
|
|
25
|
-
iss: https://accounts.google.com
|
|
26
|
-
CREATED: 1754899200000
|
|
27
|
-
passkeys:
|
|
28
|
-
- id: 54ed430804324e81b39756ea4708b546
|
|
29
|
-
aid: adce0002-35bc-c60a-648b-0b25f1f05503
|
|
30
|
-
synced: true
|
|
31
|
-
label: Personal iPhone
|
|
32
|
-
CREATED: 1754899200000
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
`basic` is `null` when Basic credentials do not exist. `federation` and `passkeys` are always
|
|
36
|
-
arrays. Secret and authentication data, including password hashes, federation subjects, public
|
|
37
|
-
keys, signature counters, and transports, are not returned.
|
|
38
|
-
|
|
39
|
-
The federation issuer identifies the provider. For example, Google uses
|
|
40
|
-
`https://accounts.google.com` and Apple uses `https://appleid.apple.com`. Applications should map
|
|
41
|
-
trusted issuers to their own provider names and presentation.
|
|
42
|
-
|
|
43
|
-
The passkey `aid` is its
|
|
44
|
-
[AAGUID](https://www.w3.org/TR/webauthn-2/#aaguid), which can be resolved against an authenticator
|
|
45
|
-
metadata catalog. `synced` indicates whether the credential was backed up and is therefore likely
|
|
46
|
-
available on more than one device.
|
|
47
|
-
|
|
48
|
-
## Basic credentials
|
|
49
|
-
|
|
50
|
-
- `POST /identity/basic/:identity/` adds Basic credentials to an Identity.
|
|
51
|
-
- `PATCH /identity/basic/:identity/` changes its username or password.
|
|
52
|
-
- `DELETE /identity/basic/:identity/` removes its Basic credentials.
|
|
53
|
-
|
|
54
|
-
An Identity can have at most one Basic credential in an authority. See
|
|
55
|
-
[Basic credentials configuration](components.md#basic-credentials) for password hashing,
|
|
56
|
-
constraints, and principal configuration.
|
|
57
|
-
|
|
58
|
-
## Federated credentials
|
|
59
|
-
|
|
60
|
-
- `POST /identity/federation/:identity/` associates credentials from a trusted issuer and returns
|
|
61
|
-
the associated credential as it is listed.
|
|
62
|
-
- `GET /identity/federation/:identity/` lists federated credentials.
|
|
63
|
-
- `DELETE /identity/federation/:identity/:credential/` removes one federated credential.
|
|
64
|
-
|
|
65
|
-
If the credentials are already associated with the Identity, the existing credential is returned.
|
|
66
|
-
|
|
67
|
-
An Identity can have credentials from multiple issuers and can have multiple subjects from the
|
|
68
|
-
same issuer. The `:credential` segment is the `id` returned by any of these resources. Federation
|
|
69
|
-
resources are provider-independent; issuer-specific authorization flows remain the responsibility
|
|
70
|
-
of the application.
|
|
71
|
-
|
|
72
|
-
## Passkeys
|
|
73
|
-
|
|
74
|
-
Passkey registration consists of a challenge followed by credential creation:
|
|
75
|
-
|
|
76
|
-
- `POST /identity/passkeys/challenges/:identity/` creates a registration challenge.
|
|
77
|
-
- `POST /identity/passkeys/:identity/` verifies the response and stores the passkey.
|
|
78
|
-
- `GET /identity/passkeys/:identity/` lists passkeys.
|
|
79
|
-
- `DELETE /identity/passkeys/:identity/:credential/` removes one passkey.
|
|
80
|
-
|
|
81
|
-
See [Web Authentication](passkeys.md) for standards and feature scenarios.
|
|
82
|
-
|
|
83
|
-
## Removing the last credential
|
|
84
|
-
|
|
85
|
-
Credential components intentionally do not coordinate with one another. Consequently, credentials
|
|
86
|
-
can be removed without checking whether another persistent credential exists.
|
|
87
|
-
Applications that require a recoverable login must prevent removal of the last usable credential
|
|
88
|
-
in their client workflow.
|
package/documentation/dev.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Development tools
|
|
2
|
-
|
|
3
|
-
## `dev:stub`
|
|
4
|
-
|
|
5
|
-
Returns a successful response with the given body.
|
|
6
|
-
|
|
7
|
-
```yaml
|
|
8
|
-
/foo:
|
|
9
|
-
dev:sub: Hello!
|
|
10
|
-
/bar:
|
|
11
|
-
dev:sub:
|
|
12
|
-
hello: world
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## `dev:sleep`
|
|
16
|
-
|
|
17
|
-
Enables random delay before processing the request, up to given maximum time in milliseconds.
|
|
18
|
-
|
|
19
|
-
Desired delay range can be set in the `sleep` request header as a JSON array of two numbers, the minimum
|
|
20
|
-
and maximum delay in milliseconds.
|
|
21
|
-
|
|
22
|
-
```yaml
|
|
23
|
-
/foo:
|
|
24
|
-
dev:sleep: 1000
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
```http
|
|
28
|
-
GET /foo/ HTTP/1.1
|
|
29
|
-
sleep: [500, 1000]
|
|
30
|
-
```
|