@toa.io/extensions.exposition 1.0.0-alpha.292 → 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 +24 -13
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.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/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +2 -12
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- 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/{aLpTDmOc.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 -42
- 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 -239
- 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/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 -435
- 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 -1
- 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/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 -10
- package/source/io.ts +0 -4
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/service.ts +0 -95
- package/source/userland.ts +0 -47
- 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/BaWe3aOV.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
- package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
|
@@ -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
|
-
```
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# Resource discovery
|
|
2
|
-
|
|
3
|
-
Everything an application serves, at one path, and a page to read it with.
|
|
4
|
-
|
|
5
|
-
```http
|
|
6
|
-
OPTIONS /.discovery HTTP/1.1
|
|
7
|
-
accept: application/yaml
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
```http
|
|
11
|
-
200 OK
|
|
12
|
-
Allow: GET, HEAD, OPTIONS
|
|
13
|
-
cache-control: private, max-age=1800
|
|
14
|
-
|
|
15
|
-
routes:
|
|
16
|
-
/pots:
|
|
17
|
-
title: Pots
|
|
18
|
-
GET:
|
|
19
|
-
title: Every pot
|
|
20
|
-
description: Every pot there is, newest first.
|
|
21
|
-
output:
|
|
22
|
-
type: array
|
|
23
|
-
items:
|
|
24
|
-
type: object
|
|
25
|
-
properties:
|
|
26
|
-
title: { type: string, maxLength: 64 }
|
|
27
|
-
POST:
|
|
28
|
-
input:
|
|
29
|
-
type: object
|
|
30
|
-
properties:
|
|
31
|
-
title: { type: string, maxLength: 64 }
|
|
32
|
-
required: [title]
|
|
33
|
-
errors:
|
|
34
|
-
- NO_WAY
|
|
35
|
-
/pots/:id:
|
|
36
|
-
protected: true
|
|
37
|
-
GET:
|
|
38
|
-
protected: true
|
|
39
|
-
route:
|
|
40
|
-
id: { title: Which pot }
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
`routes` is keyed by route template, and an object so that what is said of the whole tree has
|
|
44
|
-
somewhere to go. What a key maps to is what [`OPTIONS`](introspection.md) on that path
|
|
45
|
-
answers — what the resource is, from [`help:node`](help.md), beside every method of it — so a key
|
|
46
|
-
can be read from here and sent straight back as a request. A method this identity may not reach is
|
|
47
|
-
not in either, and a resource they may reach no method of is not here at all — so what a reader
|
|
48
|
-
sees is what they may call, and signing in is what adds to it.
|
|
49
|
-
|
|
50
|
-
A key carries no trailing slash, and a request needs one: `OPTIONS /pots/:id` and
|
|
51
|
-
`OPTIONS /pots/:id/` both answer, but `GET /pots/:id` is `404` and `GET /pots/:id/` is the call.
|
|
52
|
-
Append it.
|
|
53
|
-
|
|
54
|
-
Held for half an hour, and `private`: what is in it is what the identity that asked may reach.
|
|
55
|
-
|
|
56
|
-
## The page
|
|
57
|
-
|
|
58
|
-
`GET /.discovery/` is a page that reads the tree, served from the same origin the API is. It
|
|
59
|
-
answers before a credential is read, so it opens for a client whose token has expired — which is
|
|
60
|
-
the client most likely to be looking.
|
|
61
|
-
|
|
62
|
-
A method is called from it: the verb is a button, what the method takes is a form, and what came
|
|
63
|
-
back is shown where the form was. The call is made as whoever is reading — the same request they
|
|
64
|
-
would send themselves, and with the same effect.
|
|
65
|
-
|
|
66
|
-
A `GET /` is sent here where its `accept` prefers a page, or asks for nothing in particular — so
|
|
67
|
-
the address of the application opens it in a browser, and a link to that address unfurls as it.
|
|
68
|
-
A client that asked for a media type the gateway answers with gets what it asked for, and a route
|
|
69
|
-
declared at `/` answers `/` as it always did.
|
|
70
|
-
|
|
71
|
-
## Turning it off
|
|
72
|
-
|
|
73
|
-
Both answer wherever a gateway does, and no annotation turns either on. An application that does
|
|
74
|
-
not publish its routes to everyone refuses `/.discovery` at the ingress, which is the whole of
|
|
75
|
-
what an operator does about it.
|
|
76
|
-
|
|
77
|
-
## References
|
|
78
|
-
|
|
79
|
-
- [Introspection](introspection.md), which is what an entry is
|
|
80
|
-
- [Help](help.md), which is what names one
|
|
81
|
-
- [Features](../features/discovery.feature)
|
package/documentation/flow.md
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
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.
|
package/documentation/help.md
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# Help
|
|
2
|
-
|
|
3
|
-
What a resource and its methods are, in the words an application chooses for them. One
|
|
4
|
-
declaration, read by everything that describes a resource: [`OPTIONS`](introspection.md),
|
|
5
|
-
[discovery](discovery.md), and the tools [MCP](mcp.md) publishes.
|
|
6
|
-
|
|
7
|
-
```yaml
|
|
8
|
-
/pots:
|
|
9
|
-
help:node: Pots
|
|
10
|
-
GET:
|
|
11
|
-
help:method: Every pot
|
|
12
|
-
help:query:
|
|
13
|
-
criteria:
|
|
14
|
-
title: What to match
|
|
15
|
-
description: An RSQL expression over a pot's fields.
|
|
16
|
-
endpoint: enumerate
|
|
17
|
-
/:id:
|
|
18
|
-
GET:
|
|
19
|
-
help:method:
|
|
20
|
-
title: One pot
|
|
21
|
-
description: The pot by its id, and what is in it.
|
|
22
|
-
help:route:
|
|
23
|
-
id: Which pot
|
|
24
|
-
endpoint: observe
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
<dl>
|
|
28
|
-
<dt><code>help:node</code></dt>
|
|
29
|
-
<dd>What the resource is.</dd>
|
|
30
|
-
<dt><code>help:method</code></dt>
|
|
31
|
-
<dd>What one of its methods is.</dd>
|
|
32
|
-
<dt><code>help:route</code></dt>
|
|
33
|
-
<dd>What a route variable is, by the name the template gives it.</dd>
|
|
34
|
-
<dt><code>help:query</code></dt>
|
|
35
|
-
<dd>What a querystring parameter is, by name.</dd>
|
|
36
|
-
</dl>
|
|
37
|
-
|
|
38
|
-
All four take the same value. A bare one is the <code>title</code> — the short thing, and what a
|
|
39
|
-
client has somewhere to put. A sentence is written as a <code>description</code> beside it, and
|
|
40
|
-
either may stand alone. The parameters name each one they describe.
|
|
41
|
-
|
|
42
|
-
`help:method: null` hides the method instead of naming it: it is in no answer — not `OPTIONS`,
|
|
43
|
-
not the [tree](discovery.md), not the tools [MCP](mcp.md) publishes — and is reached exactly as
|
|
44
|
-
it was. What a monitor calls, and what a person has no business going looking for, is declared
|
|
45
|
-
this way. A resource whose every method is hidden answers `403` to `OPTIONS` and is not in the
|
|
46
|
-
tree at all.
|
|
47
|
-
|
|
48
|
-
```yaml
|
|
49
|
-
/hello/agent:
|
|
50
|
-
GET:
|
|
51
|
-
help:method: null
|
|
52
|
-
endpoint: agent
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
A title is not a name. A name is an address — `apps._identity._id.repos.POST` — and reads as one;
|
|
56
|
-
this is what a person is shown instead.
|
|
57
|
-
|
|
58
|
-
An operation [states what it is](/documentation/component/declaration.md) as well, and that is not
|
|
59
|
-
this: it is written without knowledge of any route, and a method is an operation and a route
|
|
60
|
-
together. The same operation mounted twice is two methods, and one sentence is not true of both.
|
|
61
|
-
The operation's own is the Introspection's to read, and the gateway does not use it.
|
|
62
|
-
|
|
63
|
-
## Where it is answered
|
|
64
|
-
|
|
65
|
-
`help:node` is answered beside the methods, and `help:method` inside the method it is on. A verb
|
|
66
|
-
is upper case, so neither key can be mistaken for the other. A parameter's goes in its schema,
|
|
67
|
-
which is where a schema says these anyway:
|
|
68
|
-
|
|
69
|
-
```yaml
|
|
70
|
-
title: Pots
|
|
71
|
-
GET:
|
|
72
|
-
title: Every pot
|
|
73
|
-
query:
|
|
74
|
-
criteria:
|
|
75
|
-
type: string
|
|
76
|
-
title: What to match
|
|
77
|
-
description: An RSQL expression over a pot's fields.
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Describe a parameter by the name the answer carries it under. `map:segments` answers a variable
|
|
81
|
-
under the property it fills, so that is its name here and the template's is nowhere in the answer.
|
|
82
|
-
|
|
83
|
-
A route variable the template names is answered whether or not the operation declares it — an `:id`
|
|
84
|
-
an observation takes through the query is otherwise not in the answer at all, and describing it is
|
|
85
|
-
what puts it there. Anything else is described only where it is already answered. A name that is
|
|
86
|
-
nobody's is not answered, and nothing here checks one: the template does not say them all.
|
|
87
|
-
|
|
88
|
-
`help:query` describes the [parameters a resource declares](query.md#parameters). What selects
|
|
89
|
-
records — `criteria`, `sort` and the rest — is the same of every queryable resource and says so
|
|
90
|
-
itself, so it is neither answered here nor described.
|
|
91
|
-
|
|
92
|
-
## Where it applies
|
|
93
|
-
|
|
94
|
-
To the node it is written on, and to nothing under it. Every other directive applies downward;
|
|
95
|
-
carried down, this one would say of every resource below that it is the one it was written for.
|
|
96
|
-
|
|
97
|
-
```yaml
|
|
98
|
-
/pots:
|
|
99
|
-
help:node: Pots # `/pots`, and not `/pots/:id`
|
|
100
|
-
GET: enumerate
|
|
101
|
-
/:id:
|
|
102
|
-
GET: observe
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
A node whose `/` answers in its place is the exception, because the two are one resource:
|
|
106
|
-
|
|
107
|
-
```yaml
|
|
108
|
-
/pots:
|
|
109
|
-
help:node: Pots # `/pots/` is what answers, and it is described
|
|
110
|
-
/:
|
|
111
|
-
GET: enumerate
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
A resource is described beside what it serves, so a node that serves nothing cannot be described.
|
|
115
|
-
Declaring it there is refused where it is written, rather than found missing from the answer.
|
|
116
|
-
|
|
117
|
-
## References
|
|
118
|
-
|
|
119
|
-
- [Resource introspection](introspection.md), which is where a method's own is answered
|
|
120
|
-
- [Resource discovery](discovery.md), which answers every resource at once
|
|
121
|
-
- [MCP](mcp.md), where a published method is a tool called this
|
|
122
|
-
- [Features](../features/help.feature)
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
# Identity
|
|
2
|
-
|
|
3
|
-
Identity is the fundamental entity within an authentication system that represents the **unique
|
|
4
|
-
identifier** of an individual, organization, application or device.
|
|
5
|
-
|
|
6
|
-
To prove its Identity, the request originator must provide a valid _credentials_ that are associated
|
|
7
|
-
with that Identity.
|
|
8
|
-
|
|
9
|
-
Persistent authentication methods and their management resources are described in
|
|
10
|
-
[Persistent credentials](credentials.md).
|
|
11
|
-
|
|
12
|
-
Identity is intrinsically linked to credentials, as an Identity is established only when the first
|
|
13
|
-
set of credentials for that Identity is created.
|
|
14
|
-
In other words, the creation of credentials marks the inception of an Identity.
|
|
15
|
-
Once the last credentials are removed from the Identity, it ceases to exist.
|
|
16
|
-
Without credentials, there is no basis for defining or asserting an Identity.
|
|
17
|
-
|
|
18
|
-
## Authentication
|
|
19
|
-
|
|
20
|
-
The Authentication system resolves provided credentials to an Identity using one of the supported
|
|
21
|
-
authentication schemes.
|
|
22
|
-
|
|
23
|
-
The Authentication is request-agnostic, meaning it does not depend on the specific URL being
|
|
24
|
-
requested or the content of the request body.
|
|
25
|
-
The only information it handles is the value of the `Authorization` header.
|
|
26
|
-
|
|
27
|
-
> Except for its own [management resources](components.md).
|
|
28
|
-
|
|
29
|
-
If the provided credentials are not valid or not associated with an Identity, then Authentication
|
|
30
|
-
interrupts request processing and responds with an authentication error.
|
|
31
|
-
|
|
32
|
-
### Basic scheme
|
|
33
|
-
|
|
34
|
-
Classic username/password pair. See [RFC7617](https://datatracker.ietf.org/doc/html/rfc7617).
|
|
35
|
-
|
|
36
|
-
```http
|
|
37
|
-
Authorization: Basic aGVsbG86d29ybGQK
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
See [`identity.basic` component](components.md#basic-credentials).
|
|
41
|
-
|
|
42
|
-
### Token scheme
|
|
43
|
-
|
|
44
|
-
Tokens issued by the Authentication system. New tokens are compact
|
|
45
|
-
[JSON Web Encryption (JWE)](https://www.rfc-editor.org/rfc/rfc7516) values using direct symmetric
|
|
46
|
-
encryption (`alg: dir`) and AES-256-GCM (`enc: A256GCM`). Legacy PASETO V3.local tokens remain
|
|
47
|
-
accepted during migration and are always replaced on successful authentication.
|
|
48
|
-
|
|
49
|
-
```http
|
|
50
|
-
Authorization: Token eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwidHlwIjoiSldUIiwia2lkIjo...
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
The `Token` is the **primary** authentication scheme.
|
|
54
|
-
If request originators use an alternative authentication scheme, they will receive a response
|
|
55
|
-
containing `Token` credentials and will be required to switch to the `Token` scheme for any
|
|
56
|
-
subsequent requests.
|
|
57
|
-
|
|
58
|
-
See [`identity.tokens` component](components.md#local-tokens).
|
|
59
|
-
|
|
60
|
-
### Failed authentications
|
|
61
|
-
|
|
62
|
-
Credentials that are rejected can be metered per client address, whatever the scheme. An address
|
|
63
|
-
may fail `attempts` at once and earns them back at `attempts` per `interval` seconds; a request
|
|
64
|
-
carrying credentials from an address with nothing left is answered `429 Too Many Requests` with
|
|
65
|
-
`Retry-After`. Nothing is metered unless the exposition annotation carries `bouncer`;
|
|
66
|
-
`attempts` and `interval` default to 20 and 60. The address is the one the request context
|
|
67
|
-
resolved, see [Client address](ip.md): `bouncer` requires `ip`, in the same environment, and a
|
|
68
|
-
request without an address is not metered.
|
|
69
|
-
|
|
70
|
-
```yaml
|
|
71
|
-
# context.toa.yaml
|
|
72
|
-
|
|
73
|
-
exposition:
|
|
74
|
-
ip: cf-connecting-ip
|
|
75
|
-
bouncer:
|
|
76
|
-
attempts: 20
|
|
77
|
-
interval: 60
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
The count is shared by the gateway replicas through
|
|
81
|
-
[atomicity](../../../connectors/atomicity/readme.md) and decided in each process; nothing is read on
|
|
82
|
-
the request path.
|
|
83
|
-
|
|
84
|
-
### Bearer scheme
|
|
85
|
-
|
|
86
|
-
OpenID tokens issued by trusted providers, and access tokens issued by
|
|
87
|
-
[this authorization server](oauth.md) to OAuth clients. Both are presented the same way, and each
|
|
88
|
-
provider says which credentials are its own; a credential neither claims is refused.
|
|
89
|
-
For more information, refer
|
|
90
|
-
to [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.html),
|
|
91
|
-
[RFC6750](https://datatracker.ietf.org/doc/html/rfc6750).
|
|
92
|
-
|
|
93
|
-
```http
|
|
94
|
-
Authorization: Bearer eyJhbGciOiJIUzI1...
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Trusted providers are specified using the `identity.federation` configuration. Provider metadata
|
|
98
|
-
and signing keys are discovered using OpenID Connect discovery and JWKS.
|
|
99
|
-
|
|
100
|
-
```yaml
|
|
101
|
-
# context.toa.yaml
|
|
102
|
-
|
|
103
|
-
configuration:
|
|
104
|
-
identity.federation:
|
|
105
|
-
trust:
|
|
106
|
-
- iss: https://accounts.google.com
|
|
107
|
-
aud: <GOOGLE_CLIENT_ID>
|
|
108
|
-
|
|
109
|
-
- iss: https://appleid.apple.com
|
|
110
|
-
aud: <APPLE_CLIENT_ID>
|
|
111
|
-
secret: <APPLE_CLIENT_SECRET> # enables Authorization Code Flow
|
|
112
|
-
principal:
|
|
113
|
-
authority: example
|
|
114
|
-
iss: https://accounts.google.com
|
|
115
|
-
sub: 4218230498234
|
|
116
|
-
assert: true
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
`principal` specifies the authority and the values of the `iss` and `sub` claims of an Identity
|
|
120
|
-
that will be granted with a `system` role. The same subject in another authority is ordinary
|
|
121
|
-
credentials.
|
|
122
|
-
|
|
123
|
-
`assert` indicates whether the Identity should be implicitly created when valid credentials for a
|
|
124
|
-
non-existent Identity are provided (default `true`).
|
|
125
|
-
|
|
126
|
-
### Authorization Code Flow
|
|
127
|
-
|
|
128
|
-
[OAuth 2.0 RFC 6749, section 4.1](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1)
|
|
129
|
-
|
|
130
|
-
```
|
|
131
|
-
GET /identity/
|
|
132
|
-
authorization: Code <credentials>
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
`<credentials>` is a base64-encoded JSON containing the following properties:
|
|
136
|
-
|
|
137
|
-
```yaml
|
|
138
|
-
code: authorization code
|
|
139
|
-
iss: code issuer
|
|
140
|
-
for: redirect URI
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Trust configuration for the issuer requires either `secret` or `signature`
|
|
144
|
-
to enable the Authorization Code Flow.
|
|
145
|
-
|
|
146
|
-
> If `aud` is an array, the first value is used.
|
|
147
|
-
|
|
148
|
-
```yaml
|
|
149
|
-
# context.toa.yaml
|
|
150
|
-
configuration:
|
|
151
|
-
identity.federation:
|
|
152
|
-
trust:
|
|
153
|
-
- iss: https://accounts.google.com
|
|
154
|
-
aud: 1045282659797-n705sf85j4b2rodtpdn43od43tvseiet.apps.googleusercontent.com
|
|
155
|
-
secret: $GOOGLE_CLIENT_SECRET
|
|
156
|
-
- iss: https://appleid.apple.com
|
|
157
|
-
aud: io.toa.services.id
|
|
158
|
-
signature:
|
|
159
|
-
iss: team-id
|
|
160
|
-
kid: key-id
|
|
161
|
-
key: $APPLE_PRIVATE_KEY # PKCS8 PEM, as in the .p8 file
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### OTP scheme
|
|
165
|
-
|
|
166
|
-
One-time passwords.
|
|
167
|
-
|
|
168
|
-
Passwords can be issued by calling `identity.otp.issue` operation, with the following input:
|
|
169
|
-
|
|
170
|
-
```yaml
|
|
171
|
-
authority: string
|
|
172
|
-
username: string
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
The reply will contain the `code` property of type `string` formed as a random 6-digit number,
|
|
176
|
-
valid for 60 seconds by default.
|
|
177
|
-
|
|
178
|
-
```yaml
|
|
179
|
-
code: 123456
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
OTP can be used with `OTP` authentication formatted as `base64(username:password)`.
|
|
183
|
-
|
|
184
|
-
```
|
|
185
|
-
GET /identity/ HTTP/1.1
|
|
186
|
-
authentication: OTP dXNlcm5hbWU6MTIzNDU2
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
OTP expiration time and the number of failed attempts a username is allowed within it can be
|
|
190
|
-
configured using the `identity.otp` configuration.
|
|
191
|
-
|
|
192
|
-
```yaml
|
|
193
|
-
# context.toa.yaml
|
|
194
|
-
configuration:
|
|
195
|
-
identity.otp:
|
|
196
|
-
lifetime: 60 # seconds
|
|
197
|
-
attempts: 5
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## Identity inception
|
|
201
|
-
|
|
202
|
-
The simplest way to establish a relationship between an Identity and an entity representing a user
|
|
203
|
-
is to synchronize their identifiers.
|
|
204
|
-
|
|
205
|
-
This can be achieved by using the `auth:incept` directive as follows:
|
|
206
|
-
|
|
207
|
-
```yaml
|
|
208
|
-
# manifest.toa.yaml
|
|
209
|
-
name: users
|
|
210
|
-
|
|
211
|
-
entity:
|
|
212
|
-
properties:
|
|
213
|
-
name:
|
|
214
|
-
type: string
|
|
215
|
-
|
|
216
|
-
exposition:
|
|
217
|
-
/:
|
|
218
|
-
POST:
|
|
219
|
-
incept: id
|
|
220
|
-
endpoint: transit
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
The value of the `auth:incept` directive refers to the name of the response property that will be
|
|
224
|
-
returned by the `POST` operation, containing the created entity identifier.
|
|
225
|
-
|
|
226
|
-
A request with Identity inception may contain (non-existent) credentials that will be associated
|
|
227
|
-
with the created Identity.
|
|
228
|
-
|
|
229
|
-
```http
|
|
230
|
-
POST /users/
|
|
231
|
-
authorization: Basic dXNlcjpwYXNz
|
|
232
|
-
accept: application/yaml
|
|
233
|
-
content-type: application/yaml
|
|
234
|
-
|
|
235
|
-
name: John
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
```
|
|
239
|
-
201 Created
|
|
240
|
-
content-type: application/yaml
|
|
241
|
-
|
|
242
|
-
id: 2428c31ecb6e4a51a24ef52f0c4181b9
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
As a result of processing the above request, the provided Basic credentials associated with the
|
|
246
|
-
Identity `2428c31ecb6e4a51a24ef52f0c4181b9` are created.
|
|
247
|
-
|
|
248
|
-
> `auth:incept` directive may have a `null` value, which means that the Identity will be created
|
|
249
|
-
> without any associated entity.
|
|
250
|
-
|
|
251
|
-
Inception is supported for `Basic` and `Bearer` authentication schemes.
|
|
252
|
-
|
|
253
|
-
Inception goes ahead when the request carries no credentials, or credentials the scheme verified
|
|
254
|
-
and no Identity owns, which its `authenticate` operation reports as `NOT_FOUND`. Credentials
|
|
255
|
-
rejected for any other reason, a wrong password for one, are answered with `401 Unauthorized`
|
|
256
|
-
before the endpoint is called.
|
|
257
|
-
|
|
258
|
-
## Identity assertion
|
|
259
|
-
|
|
260
|
-
`auth:assert` directive is used to ensure that given credentials are associated with an existing
|
|
261
|
-
Identity or to create a new Identity if it does not exist.
|
|
262
|
-
The directive itself does not allow or deny access to the requested resource.
|
|
263
|
-
|
|
264
|
-
> Used authentication scheme must support inception.
|
|
265
|
-
|
|
266
|
-
```yaml
|
|
267
|
-
/accounts/echo:
|
|
268
|
-
auth:assert: true
|
|
269
|
-
auth:anyone: true
|
|
270
|
-
endpoint: echo
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
```http
|
|
274
|
-
GET /accounts/echo/
|
|
275
|
-
authorization: Basic new-or-existent-credentials
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
If new Identity is created and endpoint returns a successful response, the status code `201 Created`
|
|
279
|
-
is returned.
|
|
280
|
-
|
|
281
|
-
## FAQ
|
|
282
|
-
|
|
283
|
-
<dl>
|
|
284
|
-
<dt>How can I log in a user?</dt>
|
|
285
|
-
<dd>
|
|
286
|
-
Technically speaking, since the Authentication is request-agnostic, user credentials
|
|
287
|
-
can be sent with any request.
|
|
288
|
-
|
|
289
|
-
However, it is most likely that a request originator will need to obtain an Identity value for
|
|
290
|
-
subsequent requests.
|
|
291
|
-
For this reason, it is recommended to make a `GET /identity/` request.
|
|
292
|
-
</dd>
|
|
293
|
-
<dt>How can I log out a user?</dt>
|
|
294
|
-
<dd>Delete <code>Token</code> credentials from the device.</dd>
|
|
295
|
-
<dt>Where are the sessions?</dt>
|
|
296
|
-
<dd>
|
|
297
|
-
The Authentication is stateless, meaning it does not store any information between
|
|
298
|
-
requests except for persistent credentials.</dd>
|
|
299
|
-
<dt>How can I pass the Identity to an operation call?</dt>
|
|
300
|
-
<dd>
|
|
301
|
-
This is not possible. Refer to the Resource Design Guidelines for more information.
|
|
302
|
-
<a href="https://github.com/toa-io/toa/issues/353">#353</a>
|
|
303
|
-
</dd>
|
|
304
|
-
</dl>
|