@_mustachio/openauth 0.9.2 → 0.11.0
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/dist/esm/adapters/d1/audit-log.js +15 -0
- package/dist/esm/adapters/d1/config-store.js +45 -0
- package/dist/esm/adapters/d1/index.js +12 -0
- package/dist/esm/adapters/d1/key-store.js +116 -0
- package/dist/esm/adapters/d1/method-store.js +52 -0
- package/dist/esm/adapters/d1/migrations.js +77 -0
- package/dist/esm/adapters/d1/session-store.js +134 -0
- package/dist/esm/adapters/d1/session.js +18 -0
- package/dist/esm/adapters/d1/token-store.js +140 -0
- package/dist/esm/adapters/durable-object/index.js +3 -0
- package/dist/esm/adapters/durable-object/session-store.js +139 -0
- package/dist/esm/adapters/durable-object/types.js +0 -0
- package/dist/esm/adapters/dynamo/audit-log.js +23 -0
- package/dist/esm/adapters/dynamo/client.js +0 -0
- package/dist/esm/adapters/dynamo/config-store.js +57 -0
- package/dist/esm/adapters/dynamo/index.js +10 -0
- package/dist/esm/adapters/dynamo/key-store.js +188 -0
- package/dist/esm/adapters/dynamo/method-store.js +72 -0
- package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
- package/dist/esm/adapters/dynamo/sdk.js +128 -0
- package/dist/esm/adapters/dynamo/session-store.js +173 -0
- package/dist/esm/adapters/dynamo/token-store.js +178 -0
- package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
- package/dist/esm/adapters/kms/index.js +5 -0
- package/dist/esm/adapters/kms/key-store.js +129 -0
- package/dist/esm/adapters/kms/sdk.js +23 -0
- package/dist/esm/adapters/kms/types.js +0 -0
- package/dist/esm/adapters/kv/audit-log.js +21 -0
- package/dist/esm/adapters/kv/config-store.js +43 -0
- package/dist/esm/adapters/kv/index.js +5 -0
- package/dist/esm/adapters/kv/method-store.js +63 -0
- package/dist/esm/adapters/kv/types.js +0 -0
- package/dist/esm/adapters/memory/audit-log.js +16 -0
- package/dist/esm/adapters/memory/clock.js +5 -0
- package/dist/esm/adapters/memory/config-store.js +31 -0
- package/dist/esm/adapters/memory/index.js +10 -0
- package/dist/esm/adapters/memory/key-store.js +78 -0
- package/dist/esm/adapters/memory/method-store.js +43 -0
- package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
- package/dist/esm/adapters/memory/session-store.js +104 -0
- package/dist/esm/adapters/memory/token-store.js +104 -0
- package/dist/esm/adapters/postgres/audit-log.js +16 -0
- package/dist/esm/adapters/postgres/config-store.js +48 -0
- package/dist/esm/adapters/postgres/executor.js +21 -0
- package/dist/esm/adapters/postgres/index.js +13 -0
- package/dist/esm/adapters/postgres/key-store.js +191 -0
- package/dist/esm/adapters/postgres/method-store.js +61 -0
- package/dist/esm/adapters/postgres/migrations.js +111 -0
- package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
- package/dist/esm/adapters/postgres/session-store.js +135 -0
- package/dist/esm/adapters/postgres/token-store.js +151 -0
- package/dist/esm/client.js +35 -12
- package/dist/esm/domain/audit.js +13 -0
- package/dist/esm/domain/authorize.js +217 -0
- package/dist/esm/domain/callback.js +176 -0
- package/dist/esm/domain/client-auth.js +61 -0
- package/dist/esm/domain/client-credentials.js +91 -0
- package/dist/esm/domain/crypto.js +97 -0
- package/dist/esm/domain/discovery.js +83 -0
- package/dist/esm/domain/dpop.js +122 -0
- package/dist/esm/domain/id-token.js +94 -0
- package/dist/esm/domain/introspect.js +55 -0
- package/dist/esm/domain/jwt.js +71 -0
- package/dist/esm/domain/logout.js +75 -0
- package/dist/esm/domain/method-cache.js +136 -0
- package/dist/esm/domain/method-dispatch.js +36 -0
- package/dist/esm/domain/method-route.js +111 -0
- package/dist/esm/domain/par.js +51 -0
- package/dist/esm/domain/pkce.js +16 -0
- package/dist/esm/domain/refresh.js +102 -0
- package/dist/esm/domain/register.js +74 -0
- package/dist/esm/domain/revoke.js +81 -0
- package/dist/esm/domain/state-envelope.js +80 -0
- package/dist/esm/domain/token-exchange.js +102 -0
- package/dist/esm/domain/token.js +246 -0
- package/dist/esm/domain/userinfo.js +62 -0
- package/dist/esm/http/context.js +7 -0
- package/dist/esm/http/cookies.js +98 -0
- package/dist/esm/http/errors.js +71 -0
- package/dist/esm/http/handlers/authorize.js +250 -0
- package/dist/esm/http/handlers/callback.js +53 -0
- package/dist/esm/http/handlers/end-session.js +64 -0
- package/dist/esm/http/handlers/metadata.js +37 -0
- package/dist/esm/http/handlers/method-route.js +87 -0
- package/dist/esm/http/handlers/par.js +53 -0
- package/dist/esm/http/handlers/register.js +46 -0
- package/dist/esm/http/handlers/revocation.js +98 -0
- package/dist/esm/http/handlers/token.js +197 -0
- package/dist/esm/http/handlers/userinfo.js +60 -0
- package/dist/esm/http/middleware/error.js +15 -0
- package/dist/esm/http/middleware/tenant.js +102 -0
- package/dist/esm/http/resolver.js +15 -0
- package/dist/esm/http/router.js +45 -0
- package/dist/esm/http/schemas/authorize.js +30 -0
- package/dist/esm/http/schemas/end-session.js +13 -0
- package/dist/esm/http/schemas/par.js +9 -0
- package/dist/esm/http/schemas/register.js +16 -0
- package/dist/esm/http/schemas/revocation.js +18 -0
- package/dist/esm/http/schemas/token.js +57 -0
- package/dist/esm/index.js +126 -9
- package/dist/esm/methods/code.js +221 -0
- package/dist/esm/methods/m2m.js +41 -0
- package/dist/esm/methods/oauth2-factory.js +84 -0
- package/dist/esm/methods/oauth2-generic.js +196 -0
- package/dist/esm/methods/oidc-generic.js +53 -0
- package/dist/esm/methods/passkey.js +275 -0
- package/dist/esm/methods/password-hash.js +79 -0
- package/dist/esm/methods/password.js +166 -0
- package/dist/esm/methods/providers/apple.js +29 -0
- package/dist/esm/methods/providers/cognito.js +37 -0
- package/dist/esm/methods/providers/discord.js +28 -0
- package/dist/esm/methods/providers/facebook.js +42 -0
- package/dist/esm/methods/providers/github.js +29 -0
- package/dist/esm/methods/providers/google.js +29 -0
- package/dist/esm/methods/providers/index.js +17 -0
- package/dist/esm/methods/providers/jumpcloud.js +27 -0
- package/dist/esm/methods/providers/keycloak.js +32 -0
- package/dist/esm/methods/providers/linkedin.js +28 -0
- package/dist/esm/methods/providers/microsoft.js +28 -0
- package/dist/esm/methods/providers/slack.js +30 -0
- package/dist/esm/methods/providers/spotify.js +28 -0
- package/dist/esm/methods/providers/twitch.js +28 -0
- package/dist/esm/methods/providers/x.js +28 -0
- package/dist/esm/methods/providers/yahoo.js +27 -0
- package/dist/esm/pkce.js +4 -16
- package/dist/esm/ports/audit-log.js +0 -0
- package/dist/esm/ports/config-store.js +0 -0
- package/dist/esm/ports/key-store.js +0 -0
- package/dist/esm/ports/method-store.js +0 -0
- package/dist/esm/ports/session-store.js +0 -0
- package/dist/esm/ports/token-store.js +0 -0
- package/dist/esm/types/authorization.js +0 -0
- package/dist/esm/types/error.js +70 -0
- package/dist/esm/types/flow.js +0 -0
- package/dist/esm/types/idp.js +0 -0
- package/dist/esm/types/method.js +0 -0
- package/dist/esm/types/picker.js +0 -0
- package/dist/esm/types/result.js +11 -0
- package/dist/esm/types/subject.js +0 -0
- package/dist/esm/types/tenant.js +5 -0
- package/dist/esm/types/token.js +0 -0
- package/dist/esm/ui/forms.js +253 -0
- package/dist/esm/ui/index.js +8 -0
- package/dist/esm/ui/picker.js +49 -0
- package/dist/types/adapters/d1/audit-log.d.ts +19 -0
- package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/d1/config-store.d.ts +20 -0
- package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/index.d.ts +35 -0
- package/dist/types/adapters/d1/index.d.ts.map +1 -0
- package/dist/types/adapters/d1/key-store.d.ts +17 -0
- package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/method-store.d.ts +21 -0
- package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/migrations.d.ts +18 -0
- package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
- package/dist/types/adapters/d1/session-store.d.ts +20 -0
- package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/session.d.ts +18 -0
- package/dist/types/adapters/d1/session.d.ts.map +1 -0
- package/dist/types/adapters/d1/token-store.d.ts +29 -0
- package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/types.d.ts +43 -0
- package/dist/types/adapters/d1/types.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/index.d.ts +17 -0
- package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
- package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/types.d.ts +23 -0
- package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/client.d.ts +111 -0
- package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
- package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/index.d.ts +60 -0
- package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
- package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
- package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
- package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
- package/dist/types/adapters/kms/index.d.ts +35 -0
- package/dist/types/adapters/kms/index.d.ts.map +1 -0
- package/dist/types/adapters/kms/key-store.d.ts +20 -0
- package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/sdk.d.ts +16 -0
- package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
- package/dist/types/adapters/kms/types.d.ts +58 -0
- package/dist/types/adapters/kms/types.d.ts.map +1 -0
- package/dist/types/adapters/kv/audit-log.d.ts +22 -0
- package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/kv/config-store.d.ts +25 -0
- package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/index.d.ts +21 -0
- package/dist/types/adapters/kv/index.d.ts.map +1 -0
- package/dist/types/adapters/kv/method-store.d.ts +23 -0
- package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/types.d.ts +28 -0
- package/dist/types/adapters/kv/types.d.ts.map +1 -0
- package/dist/types/adapters/memory/audit-log.d.ts +18 -0
- package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/memory/clock.d.ts +7 -0
- package/dist/types/adapters/memory/clock.d.ts.map +1 -0
- package/dist/types/adapters/memory/config-store.d.ts +19 -0
- package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/index.d.ts +15 -0
- package/dist/types/adapters/memory/index.d.ts.map +1 -0
- package/dist/types/adapters/memory/key-store.d.ts +17 -0
- package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/method-store.d.ts +26 -0
- package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/session-store.d.ts +21 -0
- package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/token-store.d.ts +29 -0
- package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
- package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/postgres/config-store.d.ts +21 -0
- package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/executor.d.ts +48 -0
- package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
- package/dist/types/adapters/postgres/index.d.ts +39 -0
- package/dist/types/adapters/postgres/index.d.ts.map +1 -0
- package/dist/types/adapters/postgres/key-store.d.ts +23 -0
- package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/method-store.d.ts +21 -0
- package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/migrations.d.ts +22 -0
- package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/session-store.d.ts +20 -0
- package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/token-store.d.ts +30 -0
- package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
- package/dist/types/client.d.ts +20 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/domain/audit.d.ts +17 -0
- package/dist/types/domain/audit.d.ts.map +1 -0
- package/dist/types/domain/authorize.d.ts +125 -0
- package/dist/types/domain/authorize.d.ts.map +1 -0
- package/dist/types/domain/callback.d.ts +70 -0
- package/dist/types/domain/callback.d.ts.map +1 -0
- package/dist/types/domain/client-auth.d.ts +57 -0
- package/dist/types/domain/client-auth.d.ts.map +1 -0
- package/dist/types/domain/client-credentials.d.ts +54 -0
- package/dist/types/domain/client-credentials.d.ts.map +1 -0
- package/dist/types/domain/crypto.d.ts +53 -0
- package/dist/types/domain/crypto.d.ts.map +1 -0
- package/dist/types/domain/discovery.d.ts +81 -0
- package/dist/types/domain/discovery.d.ts.map +1 -0
- package/dist/types/domain/dpop.d.ts +61 -0
- package/dist/types/domain/dpop.d.ts.map +1 -0
- package/dist/types/domain/id-token.d.ts +83 -0
- package/dist/types/domain/id-token.d.ts.map +1 -0
- package/dist/types/domain/introspect.d.ts +79 -0
- package/dist/types/domain/introspect.d.ts.map +1 -0
- package/dist/types/domain/jwt.d.ts +74 -0
- package/dist/types/domain/jwt.d.ts.map +1 -0
- package/dist/types/domain/logout.d.ts +69 -0
- package/dist/types/domain/logout.d.ts.map +1 -0
- package/dist/types/domain/method-cache.d.ts +42 -0
- package/dist/types/domain/method-cache.d.ts.map +1 -0
- package/dist/types/domain/method-dispatch.d.ts +37 -0
- package/dist/types/domain/method-dispatch.d.ts.map +1 -0
- package/dist/types/domain/method-route.d.ts +77 -0
- package/dist/types/domain/method-route.d.ts.map +1 -0
- package/dist/types/domain/par.d.ts +62 -0
- package/dist/types/domain/par.d.ts.map +1 -0
- package/dist/types/domain/pkce.d.ts +15 -0
- package/dist/types/domain/pkce.d.ts.map +1 -0
- package/dist/types/domain/refresh.d.ts +52 -0
- package/dist/types/domain/refresh.d.ts.map +1 -0
- package/dist/types/domain/register.d.ts +33 -0
- package/dist/types/domain/register.d.ts.map +1 -0
- package/dist/types/domain/revoke.d.ts +61 -0
- package/dist/types/domain/revoke.d.ts.map +1 -0
- package/dist/types/domain/state-envelope.d.ts +30 -0
- package/dist/types/domain/state-envelope.d.ts.map +1 -0
- package/dist/types/domain/token-exchange.d.ts +69 -0
- package/dist/types/domain/token-exchange.d.ts.map +1 -0
- package/dist/types/domain/token.d.ts +140 -0
- package/dist/types/domain/token.d.ts.map +1 -0
- package/dist/types/domain/userinfo.d.ts +61 -0
- package/dist/types/domain/userinfo.d.ts.map +1 -0
- package/dist/types/http/context.d.ts +66 -0
- package/dist/types/http/context.d.ts.map +1 -0
- package/dist/types/http/cookies.d.ts +45 -0
- package/dist/types/http/cookies.d.ts.map +1 -0
- package/dist/types/http/errors.d.ts +36 -0
- package/dist/types/http/errors.d.ts.map +1 -0
- package/dist/types/http/handlers/authorize.d.ts +3 -0
- package/dist/types/http/handlers/authorize.d.ts.map +1 -0
- package/dist/types/http/handlers/callback.d.ts +3 -0
- package/dist/types/http/handlers/callback.d.ts.map +1 -0
- package/dist/types/http/handlers/end-session.d.ts +3 -0
- package/dist/types/http/handlers/end-session.d.ts.map +1 -0
- package/dist/types/http/handlers/metadata.d.ts +4 -0
- package/dist/types/http/handlers/metadata.d.ts.map +1 -0
- package/dist/types/http/handlers/method-route.d.ts +3 -0
- package/dist/types/http/handlers/method-route.d.ts.map +1 -0
- package/dist/types/http/handlers/par.d.ts +3 -0
- package/dist/types/http/handlers/par.d.ts.map +1 -0
- package/dist/types/http/handlers/register.d.ts +3 -0
- package/dist/types/http/handlers/register.d.ts.map +1 -0
- package/dist/types/http/handlers/revocation.d.ts +4 -0
- package/dist/types/http/handlers/revocation.d.ts.map +1 -0
- package/dist/types/http/handlers/token.d.ts +3 -0
- package/dist/types/http/handlers/token.d.ts.map +1 -0
- package/dist/types/http/handlers/userinfo.d.ts +3 -0
- package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
- package/dist/types/http/middleware/error.d.ts +9 -0
- package/dist/types/http/middleware/error.d.ts.map +1 -0
- package/dist/types/http/middleware/tenant.d.ts +30 -0
- package/dist/types/http/middleware/tenant.d.ts.map +1 -0
- package/dist/types/http/resolver.d.ts +22 -0
- package/dist/types/http/resolver.d.ts.map +1 -0
- package/dist/types/http/router.d.ts +21 -0
- package/dist/types/http/router.d.ts.map +1 -0
- package/dist/types/http/schemas/authorize.d.ts +92 -0
- package/dist/types/http/schemas/authorize.d.ts.map +1 -0
- package/dist/types/http/schemas/end-session.d.ts +31 -0
- package/dist/types/http/schemas/end-session.d.ts.map +1 -0
- package/dist/types/http/schemas/par.d.ts +20 -0
- package/dist/types/http/schemas/par.d.ts.map +1 -0
- package/dist/types/http/schemas/register.d.ts +42 -0
- package/dist/types/http/schemas/register.d.ts.map +1 -0
- package/dist/types/http/schemas/revocation.d.ts +41 -0
- package/dist/types/http/schemas/revocation.d.ts.map +1 -0
- package/dist/types/http/schemas/token.d.ts +227 -0
- package/dist/types/http/schemas/token.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/methods/code.d.ts +96 -0
- package/dist/types/methods/code.d.ts.map +1 -0
- package/dist/types/methods/m2m.d.ts +41 -0
- package/dist/types/methods/m2m.d.ts.map +1 -0
- package/dist/types/methods/oauth2-factory.d.ts +133 -0
- package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
- package/dist/types/methods/oauth2-generic.d.ts +75 -0
- package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
- package/dist/types/methods/oidc-generic.d.ts +26 -0
- package/dist/types/methods/oidc-generic.d.ts.map +1 -0
- package/dist/types/methods/passkey.d.ts +106 -0
- package/dist/types/methods/passkey.d.ts.map +1 -0
- package/dist/types/methods/password-hash.d.ts +25 -0
- package/dist/types/methods/password-hash.d.ts.map +1 -0
- package/dist/types/methods/password.d.ts +70 -0
- package/dist/types/methods/password.d.ts.map +1 -0
- package/dist/types/methods/providers/apple.d.ts +29 -0
- package/dist/types/methods/providers/apple.d.ts.map +1 -0
- package/dist/types/methods/providers/cognito.d.ts +36 -0
- package/dist/types/methods/providers/cognito.d.ts.map +1 -0
- package/dist/types/methods/providers/discord.d.ts +22 -0
- package/dist/types/methods/providers/discord.d.ts.map +1 -0
- package/dist/types/methods/providers/facebook.d.ts +29 -0
- package/dist/types/methods/providers/facebook.d.ts.map +1 -0
- package/dist/types/methods/providers/github.d.ts +25 -0
- package/dist/types/methods/providers/github.d.ts.map +1 -0
- package/dist/types/methods/providers/google.d.ts +28 -0
- package/dist/types/methods/providers/google.d.ts.map +1 -0
- package/dist/types/methods/providers/index.d.ts +24 -0
- package/dist/types/methods/providers/index.d.ts.map +1 -0
- package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
- package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
- package/dist/types/methods/providers/keycloak.d.ts +30 -0
- package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
- package/dist/types/methods/providers/linkedin.d.ts +22 -0
- package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
- package/dist/types/methods/providers/microsoft.d.ts +30 -0
- package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
- package/dist/types/methods/providers/slack.d.ts +25 -0
- package/dist/types/methods/providers/slack.d.ts.map +1 -0
- package/dist/types/methods/providers/spotify.d.ts +22 -0
- package/dist/types/methods/providers/spotify.d.ts.map +1 -0
- package/dist/types/methods/providers/twitch.d.ts +23 -0
- package/dist/types/methods/providers/twitch.d.ts.map +1 -0
- package/dist/types/methods/providers/x.d.ts +25 -0
- package/dist/types/methods/providers/x.d.ts.map +1 -0
- package/dist/types/methods/providers/yahoo.d.ts +22 -0
- package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
- package/dist/types/pkce.d.ts +1 -2
- package/dist/types/pkce.d.ts.map +1 -1
- package/dist/types/ports/audit-log.d.ts +166 -0
- package/dist/types/ports/audit-log.d.ts.map +1 -0
- package/dist/types/ports/config-store.d.ts +32 -0
- package/dist/types/ports/config-store.d.ts.map +1 -0
- package/dist/types/ports/key-store.d.ts +98 -0
- package/dist/types/ports/key-store.d.ts.map +1 -0
- package/dist/types/ports/method-store.d.ts +29 -0
- package/dist/types/ports/method-store.d.ts.map +1 -0
- package/dist/types/ports/session-store.d.ts +109 -0
- package/dist/types/ports/session-store.d.ts.map +1 -0
- package/dist/types/ports/token-store.d.ts +105 -0
- package/dist/types/ports/token-store.d.ts.map +1 -0
- package/dist/types/types/authorization.d.ts +75 -0
- package/dist/types/types/authorization.d.ts.map +1 -0
- package/dist/types/types/error.d.ts +101 -0
- package/dist/types/types/error.d.ts.map +1 -0
- package/dist/types/types/flow.d.ts +97 -0
- package/dist/types/types/flow.d.ts.map +1 -0
- package/dist/types/types/idp.d.ts +324 -0
- package/dist/types/types/idp.d.ts.map +1 -0
- package/dist/types/types/method.d.ts +256 -0
- package/dist/types/types/method.d.ts.map +1 -0
- package/dist/types/types/picker.d.ts +31 -0
- package/dist/types/types/picker.d.ts.map +1 -0
- package/dist/types/types/result.d.ts +29 -0
- package/dist/types/types/result.d.ts.map +1 -0
- package/dist/types/types/subject.d.ts +47 -0
- package/dist/types/types/subject.d.ts.map +1 -0
- package/dist/types/types/tenant.d.ts +276 -0
- package/dist/types/types/tenant.d.ts.map +1 -0
- package/dist/types/types/token.d.ts +231 -0
- package/dist/types/types/token.d.ts.map +1 -0
- package/dist/types/ui/forms.d.ts +35 -0
- package/dist/types/ui/forms.d.ts.map +1 -0
- package/dist/types/ui/index.d.ts +14 -0
- package/dist/types/ui/index.d.ts.map +1 -0
- package/dist/types/ui/picker.d.ts +18 -0
- package/dist/types/ui/picker.d.ts.map +1 -0
- package/package.json +41 -6
- package/src/adapters/d1/audit-log.ts +32 -0
- package/src/adapters/d1/config-store.ts +67 -0
- package/src/adapters/d1/index.ts +41 -0
- package/src/adapters/d1/key-store.ts +218 -0
- package/src/adapters/d1/method-store.ts +103 -0
- package/src/adapters/d1/migrations.ts +89 -0
- package/src/adapters/d1/session-store.ts +230 -0
- package/src/adapters/d1/session.ts +38 -0
- package/src/adapters/d1/token-store.ts +251 -0
- package/src/adapters/d1/types.ts +53 -0
- package/src/adapters/durable-object/index.ts +23 -0
- package/src/adapters/durable-object/session-store.ts +227 -0
- package/src/adapters/durable-object/types.ts +25 -0
- package/src/adapters/dynamo/audit-log.ts +35 -0
- package/src/adapters/dynamo/client.ts +118 -0
- package/src/adapters/dynamo/config-store.ts +72 -0
- package/src/adapters/dynamo/index.ts +81 -0
- package/src/adapters/dynamo/key-store.ts +267 -0
- package/src/adapters/dynamo/method-store.ts +105 -0
- package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
- package/src/adapters/dynamo/sdk.ts +189 -0
- package/src/adapters/dynamo/session-store.ts +229 -0
- package/src/adapters/dynamo/token-store.ts +248 -0
- package/src/adapters/kms/in-memory-backing.ts +36 -0
- package/src/adapters/kms/index.ts +39 -0
- package/src/adapters/kms/key-store.ts +176 -0
- package/src/adapters/kms/sdk.ts +39 -0
- package/src/adapters/kms/types.ts +61 -0
- package/src/adapters/kv/audit-log.ts +40 -0
- package/src/adapters/kv/config-store.ts +63 -0
- package/src/adapters/kv/index.ts +20 -0
- package/src/adapters/kv/method-store.ts +98 -0
- package/src/adapters/kv/types.ts +26 -0
- package/src/adapters/memory/audit-log.ts +28 -0
- package/src/adapters/memory/clock.ts +7 -0
- package/src/adapters/memory/config-store.ts +41 -0
- package/src/adapters/memory/index.ts +26 -0
- package/src/adapters/memory/key-store.ts +102 -0
- package/src/adapters/memory/method-store.ts +75 -0
- package/src/adapters/memory/passkey-credential-store.ts +97 -0
- package/src/adapters/memory/session-store.ts +171 -0
- package/src/adapters/memory/token-store.ts +181 -0
- package/src/adapters/postgres/audit-log.ts +34 -0
- package/src/adapters/postgres/config-store.ts +72 -0
- package/src/adapters/postgres/executor.ts +76 -0
- package/src/adapters/postgres/index.ts +60 -0
- package/src/adapters/postgres/key-store.ts +334 -0
- package/src/adapters/postgres/method-store.ts +104 -0
- package/src/adapters/postgres/migrations.ts +131 -0
- package/src/adapters/postgres/passkey-credential-store.ts +150 -0
- package/src/adapters/postgres/session-store.ts +216 -0
- package/src/adapters/postgres/token-store.ts +263 -0
- package/src/client.ts +82 -16
- package/src/domain/audit.ts +28 -0
- package/src/domain/authorize.ts +414 -0
- package/src/domain/callback.ts +268 -0
- package/src/domain/client-auth.ts +116 -0
- package/src/domain/client-credentials.ts +180 -0
- package/src/domain/crypto.ts +168 -0
- package/src/domain/discovery.ts +161 -0
- package/src/domain/dpop.ts +293 -0
- package/src/domain/id-token.ts +213 -0
- package/src/domain/introspect.ts +155 -0
- package/src/domain/jwt.ts +185 -0
- package/src/domain/logout.ts +180 -0
- package/src/domain/method-cache.ts +220 -0
- package/src/domain/method-dispatch.ts +95 -0
- package/src/domain/method-route.ts +213 -0
- package/src/domain/par.ts +141 -0
- package/src/domain/pkce.ts +37 -0
- package/src/domain/refresh.ts +210 -0
- package/src/domain/register.ts +168 -0
- package/src/domain/revoke.ts +161 -0
- package/src/domain/state-envelope.ts +142 -0
- package/src/domain/token-exchange.ts +243 -0
- package/src/domain/token.ts +483 -0
- package/src/domain/userinfo.ts +171 -0
- package/src/http/context.ts +90 -0
- package/src/http/cookies.ts +167 -0
- package/src/http/errors.ts +98 -0
- package/src/http/handlers/authorize.ts +362 -0
- package/src/http/handlers/callback.ts +77 -0
- package/src/http/handlers/end-session.ts +106 -0
- package/src/http/handlers/metadata.ts +49 -0
- package/src/http/handlers/method-route.ts +115 -0
- package/src/http/handlers/par.ts +84 -0
- package/src/http/handlers/register.ts +70 -0
- package/src/http/handlers/revocation.ts +151 -0
- package/src/http/handlers/token.ts +300 -0
- package/src/http/handlers/userinfo.ts +90 -0
- package/src/http/middleware/error.ts +26 -0
- package/src/http/middleware/tenant.ts +165 -0
- package/src/http/resolver.ts +34 -0
- package/src/http/router.ts +85 -0
- package/src/http/schemas/authorize.ts +85 -0
- package/src/http/schemas/end-session.ts +23 -0
- package/src/http/schemas/par.ts +23 -0
- package/src/http/schemas/register.ts +29 -0
- package/src/http/schemas/revocation.ts +23 -0
- package/src/http/schemas/token.ts +85 -0
- package/src/index.ts +283 -20
- package/src/methods/code.ts +359 -0
- package/src/methods/m2m.ts +82 -0
- package/src/methods/oauth2-factory.ts +151 -0
- package/src/methods/oauth2-generic.ts +360 -0
- package/src/methods/oidc-generic.ts +109 -0
- package/src/methods/passkey.ts +419 -0
- package/src/methods/password-hash.ts +134 -0
- package/src/methods/password.ts +298 -0
- package/src/methods/providers/apple.ts +42 -0
- package/src/methods/providers/cognito.ts +55 -0
- package/src/methods/providers/discord.ts +37 -0
- package/src/methods/providers/facebook.ts +54 -0
- package/src/methods/providers/github.ts +42 -0
- package/src/methods/providers/google.ts +43 -0
- package/src/methods/providers/index.ts +23 -0
- package/src/methods/providers/jumpcloud.ts +36 -0
- package/src/methods/providers/keycloak.ts +42 -0
- package/src/methods/providers/linkedin.ts +37 -0
- package/src/methods/providers/microsoft.ts +42 -0
- package/src/methods/providers/slack.ts +42 -0
- package/src/methods/providers/spotify.ts +37 -0
- package/src/methods/providers/twitch.ts +38 -0
- package/src/methods/providers/x.ts +40 -0
- package/src/methods/providers/yahoo.ts +36 -0
- package/src/pkce.ts +20 -21
- package/src/ports/CONSISTENCY.md +119 -0
- package/src/ports/audit-log.ts +177 -0
- package/src/ports/config-store.ts +34 -0
- package/src/ports/key-store.ts +106 -0
- package/src/ports/method-store.ts +41 -0
- package/src/ports/session-store.ts +131 -0
- package/src/ports/token-store.ts +116 -0
- package/src/types/authorization.ts +78 -0
- package/src/types/error.ts +146 -0
- package/src/types/flow.ts +99 -0
- package/src/types/idp.ts +365 -0
- package/src/types/method.ts +270 -0
- package/src/types/picker.ts +32 -0
- package/src/types/result.ts +23 -0
- package/src/types/subject.ts +50 -0
- package/src/types/tenant.ts +285 -0
- package/src/types/token.ts +236 -0
- package/src/ui/forms.ts +289 -0
- package/src/ui/index.ts +14 -0
- package/src/ui/picker.ts +63 -0
- package/dist/esm/issuer.js +0 -691
- package/dist/esm/jwt.js +0 -16
- package/dist/esm/keys.js +0 -113
- package/dist/esm/provider/apple.js +0 -28
- package/dist/esm/provider/arctic.js +0 -43
- package/dist/esm/provider/code.js +0 -58
- package/dist/esm/provider/cognito.js +0 -16
- package/dist/esm/provider/discord.js +0 -15
- package/dist/esm/provider/facebook.js +0 -24
- package/dist/esm/provider/github.js +0 -15
- package/dist/esm/provider/google.js +0 -25
- package/dist/esm/provider/index.js +0 -3
- package/dist/esm/provider/jumpcloud.js +0 -15
- package/dist/esm/provider/keycloak.js +0 -15
- package/dist/esm/provider/linkedin.js +0 -15
- package/dist/esm/provider/m2m.js +0 -16
- package/dist/esm/provider/microsoft.js +0 -24
- package/dist/esm/provider/oauth2.js +0 -119
- package/dist/esm/provider/oidc.js +0 -69
- package/dist/esm/provider/passkey.js +0 -315
- package/dist/esm/provider/password.js +0 -306
- package/dist/esm/provider/provider.js +0 -10
- package/dist/esm/provider/slack.js +0 -15
- package/dist/esm/provider/spotify.js +0 -15
- package/dist/esm/provider/twitch.js +0 -15
- package/dist/esm/provider/x.js +0 -16
- package/dist/esm/provider/yahoo.js +0 -15
- package/dist/esm/random.js +0 -27
- package/dist/esm/storage/aws.js +0 -39
- package/dist/esm/storage/cloudflare.js +0 -42
- package/dist/esm/storage/dynamo.js +0 -116
- package/dist/esm/storage/memory.js +0 -88
- package/dist/esm/storage/storage.js +0 -36
- package/dist/esm/subject.js +0 -7
- package/dist/esm/ui/base.js +0 -407
- package/dist/esm/ui/code.js +0 -151
- package/dist/esm/ui/form.js +0 -43
- package/dist/esm/ui/icon.js +0 -92
- package/dist/esm/ui/passkey.js +0 -329
- package/dist/esm/ui/password.js +0 -338
- package/dist/esm/ui/select.js +0 -187
- package/dist/esm/ui/theme.js +0 -115
- package/dist/esm/util.js +0 -54
- package/dist/types/issuer.d.ts +0 -607
- package/dist/types/issuer.d.ts.map +0 -1
- package/dist/types/jwt.d.ts +0 -6
- package/dist/types/jwt.d.ts.map +0 -1
- package/dist/types/keys.d.ts +0 -18
- package/dist/types/keys.d.ts.map +0 -1
- package/dist/types/provider/apple.d.ts +0 -108
- package/dist/types/provider/apple.d.ts.map +0 -1
- package/dist/types/provider/arctic.d.ts +0 -16
- package/dist/types/provider/arctic.d.ts.map +0 -1
- package/dist/types/provider/code.d.ts +0 -74
- package/dist/types/provider/code.d.ts.map +0 -1
- package/dist/types/provider/cognito.d.ts +0 -64
- package/dist/types/provider/cognito.d.ts.map +0 -1
- package/dist/types/provider/discord.d.ts +0 -38
- package/dist/types/provider/discord.d.ts.map +0 -1
- package/dist/types/provider/facebook.d.ts +0 -74
- package/dist/types/provider/facebook.d.ts.map +0 -1
- package/dist/types/provider/github.d.ts +0 -38
- package/dist/types/provider/github.d.ts.map +0 -1
- package/dist/types/provider/google.d.ts +0 -74
- package/dist/types/provider/google.d.ts.map +0 -1
- package/dist/types/provider/index.d.ts +0 -4
- package/dist/types/provider/index.d.ts.map +0 -1
- package/dist/types/provider/jumpcloud.d.ts +0 -38
- package/dist/types/provider/jumpcloud.d.ts.map +0 -1
- package/dist/types/provider/keycloak.d.ts +0 -67
- package/dist/types/provider/keycloak.d.ts.map +0 -1
- package/dist/types/provider/linkedin.d.ts +0 -6
- package/dist/types/provider/linkedin.d.ts.map +0 -1
- package/dist/types/provider/m2m.d.ts +0 -34
- package/dist/types/provider/m2m.d.ts.map +0 -1
- package/dist/types/provider/microsoft.d.ts +0 -89
- package/dist/types/provider/microsoft.d.ts.map +0 -1
- package/dist/types/provider/oauth2.d.ts +0 -133
- package/dist/types/provider/oauth2.d.ts.map +0 -1
- package/dist/types/provider/oidc.d.ts +0 -91
- package/dist/types/provider/oidc.d.ts.map +0 -1
- package/dist/types/provider/passkey.d.ts +0 -143
- package/dist/types/provider/passkey.d.ts.map +0 -1
- package/dist/types/provider/password.d.ts +0 -210
- package/dist/types/provider/password.d.ts.map +0 -1
- package/dist/types/provider/provider.d.ts +0 -29
- package/dist/types/provider/provider.d.ts.map +0 -1
- package/dist/types/provider/slack.d.ts +0 -59
- package/dist/types/provider/slack.d.ts.map +0 -1
- package/dist/types/provider/spotify.d.ts +0 -38
- package/dist/types/provider/spotify.d.ts.map +0 -1
- package/dist/types/provider/twitch.d.ts +0 -38
- package/dist/types/provider/twitch.d.ts.map +0 -1
- package/dist/types/provider/x.d.ts +0 -38
- package/dist/types/provider/x.d.ts.map +0 -1
- package/dist/types/provider/yahoo.d.ts +0 -38
- package/dist/types/provider/yahoo.d.ts.map +0 -1
- package/dist/types/random.d.ts +0 -3
- package/dist/types/random.d.ts.map +0 -1
- package/dist/types/storage/aws.d.ts +0 -4
- package/dist/types/storage/aws.d.ts.map +0 -1
- package/dist/types/storage/cloudflare.d.ts +0 -34
- package/dist/types/storage/cloudflare.d.ts.map +0 -1
- package/dist/types/storage/dynamo.d.ts +0 -65
- package/dist/types/storage/dynamo.d.ts.map +0 -1
- package/dist/types/storage/memory.d.ts +0 -49
- package/dist/types/storage/memory.d.ts.map +0 -1
- package/dist/types/storage/storage.d.ts +0 -15
- package/dist/types/storage/storage.d.ts.map +0 -1
- package/dist/types/subject.d.ts +0 -122
- package/dist/types/subject.d.ts.map +0 -1
- package/dist/types/ui/base.d.ts +0 -5
- package/dist/types/ui/base.d.ts.map +0 -1
- package/dist/types/ui/code.d.ts +0 -104
- package/dist/types/ui/code.d.ts.map +0 -1
- package/dist/types/ui/form.d.ts +0 -6
- package/dist/types/ui/form.d.ts.map +0 -1
- package/dist/types/ui/icon.d.ts +0 -6
- package/dist/types/ui/icon.d.ts.map +0 -1
- package/dist/types/ui/passkey.d.ts +0 -5
- package/dist/types/ui/passkey.d.ts.map +0 -1
- package/dist/types/ui/password.d.ts +0 -139
- package/dist/types/ui/password.d.ts.map +0 -1
- package/dist/types/ui/select.d.ts +0 -55
- package/dist/types/ui/select.d.ts.map +0 -1
- package/dist/types/ui/theme.d.ts +0 -207
- package/dist/types/ui/theme.d.ts.map +0 -1
- package/dist/types/util.d.ts +0 -8
- package/dist/types/util.d.ts.map +0 -1
- package/src/css.d.ts +0 -4
- package/src/issuer.ts +0 -1628
- package/src/jwt.ts +0 -17
- package/src/keys.ts +0 -139
- package/src/provider/apple.ts +0 -127
- package/src/provider/arctic.ts +0 -66
- package/src/provider/code.ts +0 -227
- package/src/provider/cognito.ts +0 -74
- package/src/provider/discord.ts +0 -45
- package/src/provider/facebook.ts +0 -84
- package/src/provider/github.ts +0 -45
- package/src/provider/google.ts +0 -85
- package/src/provider/index.ts +0 -3
- package/src/provider/jumpcloud.ts +0 -45
- package/src/provider/keycloak.ts +0 -75
- package/src/provider/linkedin.ts +0 -12
- package/src/provider/m2m.ts +0 -56
- package/src/provider/microsoft.ts +0 -100
- package/src/provider/oauth2.ts +0 -297
- package/src/provider/oidc.ts +0 -179
- package/src/provider/passkey.ts +0 -655
- package/src/provider/password.ts +0 -672
- package/src/provider/provider.ts +0 -33
- package/src/provider/slack.ts +0 -67
- package/src/provider/spotify.ts +0 -45
- package/src/provider/twitch.ts +0 -45
- package/src/provider/x.ts +0 -46
- package/src/provider/yahoo.ts +0 -45
- package/src/random.ts +0 -24
- package/src/storage/aws.ts +0 -59
- package/src/storage/cloudflare.ts +0 -77
- package/src/storage/dynamo.ts +0 -193
- package/src/storage/memory.ts +0 -135
- package/src/storage/storage.ts +0 -46
- package/src/subject.ts +0 -130
- package/src/ui/base.tsx +0 -118
- package/src/ui/code.tsx +0 -215
- package/src/ui/form.tsx +0 -40
- package/src/ui/icon.tsx +0 -95
- package/src/ui/passkey.tsx +0 -321
- package/src/ui/password.tsx +0 -405
- package/src/ui/select.tsx +0 -221
- package/src/ui/theme.ts +0 -319
- package/src/ui/ui.css +0 -252
- package/src/util.ts +0 -58
- /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata-document builders for `/.well-known/openid-configuration` and
|
|
3
|
+
* `/.well-known/jwks.json`.
|
|
4
|
+
*
|
|
5
|
+
* Pure functions over typed ports + a small options record.
|
|
6
|
+
*/
|
|
7
|
+
import type { KeyStore } from "../ports/key-store";
|
|
8
|
+
import type { AuthError } from "../types/error";
|
|
9
|
+
import type { Result } from "../types/result";
|
|
10
|
+
import { buildJwksDocument } from "./jwt";
|
|
11
|
+
export type DiscoveryDocument = {
|
|
12
|
+
issuer: string;
|
|
13
|
+
authorization_endpoint: string;
|
|
14
|
+
token_endpoint: string;
|
|
15
|
+
userinfo_endpoint: string;
|
|
16
|
+
jwks_uri: string;
|
|
17
|
+
revocation_endpoint: string;
|
|
18
|
+
introspection_endpoint: string;
|
|
19
|
+
/** OIDC RP-Initiated Logout 1.0 §2. */
|
|
20
|
+
end_session_endpoint: string;
|
|
21
|
+
/** RFC 7591 §3.1. */
|
|
22
|
+
registration_endpoint: string;
|
|
23
|
+
/** RFC 9126 §5. */
|
|
24
|
+
pushed_authorization_request_endpoint: string;
|
|
25
|
+
/**
|
|
26
|
+
* RFC 9126 §5. True iff every client on this tenant is required to use
|
|
27
|
+
* PAR. We advertise `false` at the tenant level — the per-client toggle
|
|
28
|
+
* is read at request time.
|
|
29
|
+
*/
|
|
30
|
+
require_pushed_authorization_requests: boolean;
|
|
31
|
+
/** RFC 9449 §5.1 — DPoP algorithms accepted on proof JWTs. */
|
|
32
|
+
dpop_signing_alg_values_supported: string[];
|
|
33
|
+
response_types_supported: string[];
|
|
34
|
+
grant_types_supported: string[];
|
|
35
|
+
subject_types_supported: string[];
|
|
36
|
+
id_token_signing_alg_values_supported: string[];
|
|
37
|
+
scopes_supported: string[];
|
|
38
|
+
/** OIDC Core §3 — registered claim names the IdP can return. */
|
|
39
|
+
claims_supported: string[];
|
|
40
|
+
/** OIDC Core §5.5 — `claims` request parameter is honored. */
|
|
41
|
+
claims_parameter_supported: boolean;
|
|
42
|
+
/** OIDC Core §6.1 — JAR (`request` parameter). Not implemented. */
|
|
43
|
+
request_parameter_supported: boolean;
|
|
44
|
+
/** OIDC Core §6.2 — JAR (`request_uri` parameter). Not implemented. */
|
|
45
|
+
request_uri_parameter_supported: boolean;
|
|
46
|
+
/** OIDC Core §6.2 — whether `request_uri` values must be pre-registered. */
|
|
47
|
+
require_request_uri_registration: boolean;
|
|
48
|
+
/** OIDC Core §3.1.2.1 — UI locales the OP can render. */
|
|
49
|
+
ui_locales_supported?: string[];
|
|
50
|
+
token_endpoint_auth_methods_supported: string[];
|
|
51
|
+
code_challenge_methods_supported: string[];
|
|
52
|
+
};
|
|
53
|
+
export type DiscoveryDeps = {
|
|
54
|
+
issuerUrl: string;
|
|
55
|
+
/** Override path defaults if mounted under a non-root prefix. */
|
|
56
|
+
paths?: Partial<{
|
|
57
|
+
authorize: string;
|
|
58
|
+
token: string;
|
|
59
|
+
userinfo: string;
|
|
60
|
+
jwks: string;
|
|
61
|
+
revoke: string;
|
|
62
|
+
introspect: string;
|
|
63
|
+
endSession: string;
|
|
64
|
+
par: string;
|
|
65
|
+
register: string;
|
|
66
|
+
}>;
|
|
67
|
+
/** Advertised scopes. Defaults to `["openid", "email", "profile"]`. */
|
|
68
|
+
scopes?: string[];
|
|
69
|
+
/** Advertised UI locales. Defaults to `["en"]`. */
|
|
70
|
+
uiLocales?: string[];
|
|
71
|
+
/**
|
|
72
|
+
* Host-supplied scope → claim-names map. Each key adds a scope to
|
|
73
|
+
* `scopes_supported`; the union of values augments `claims_supported`.
|
|
74
|
+
* Mirrors `IdPOptions.customScopeClaims`.
|
|
75
|
+
*/
|
|
76
|
+
customScopeClaims?: Record<string, ReadonlyArray<string>>;
|
|
77
|
+
};
|
|
78
|
+
export declare function buildDiscoveryDocument(deps: DiscoveryDeps): DiscoveryDocument;
|
|
79
|
+
export type JwksDoc = ReturnType<typeof buildJwksDocument>;
|
|
80
|
+
export declare function buildJwks(keyStore: KeyStore): Promise<Result<JwksDoc, AuthError>>;
|
|
81
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/domain/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,uCAAuC;IACvC,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qBAAqB;IACrB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,mBAAmB;IACnB,qCAAqC,EAAE,MAAM,CAAA;IAC7C;;;;OAIG;IACH,qCAAqC,EAAE,OAAO,CAAA;IAC9C,8DAA8D;IAC9D,iCAAiC,EAAE,MAAM,EAAE,CAAA;IAC3C,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAA;IACjC,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,8DAA8D;IAC9D,0BAA0B,EAAE,OAAO,CAAA;IACnC,mEAAmE;IACnE,2BAA2B,EAAE,OAAO,CAAA;IACpC,uEAAuE;IACvE,+BAA+B,EAAE,OAAO,CAAA;IACxC,4EAA4E;IAC5E,gCAAgC,EAAE,OAAO,CAAA;IACzC,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,qCAAqC,EAAE,MAAM,EAAE,CAAA;IAC/C,gCAAgC,EAAE,MAAM,EAAE,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;IACF,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAoE7E;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE1D,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAIrC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { TokenStore } from "../ports/token-store";
|
|
2
|
+
import { type AuthError } from "../types/error";
|
|
3
|
+
import type { Result } from "../types/result";
|
|
4
|
+
/** RFC 9449 §4.2 — fixed 60-second tolerance is the conventional default. */
|
|
5
|
+
export declare const DEFAULT_DPOP_IAT_TOLERANCE_SEC = 60;
|
|
6
|
+
/** Replay-window TTL for `jti` tracking. Matches `iat` tolerance × 2. */
|
|
7
|
+
export declare const DEFAULT_DPOP_JTI_TTL_MS: number;
|
|
8
|
+
export type DpopProofPayload = {
|
|
9
|
+
htu: string;
|
|
10
|
+
htm: string;
|
|
11
|
+
iat: number;
|
|
12
|
+
jti: string;
|
|
13
|
+
ath?: string;
|
|
14
|
+
nonce?: string;
|
|
15
|
+
};
|
|
16
|
+
export type VerifiedDpopProof = {
|
|
17
|
+
/** RFC 7638 JWK thumbprint of the proof's public key. */
|
|
18
|
+
jkt: string;
|
|
19
|
+
/** The decoded + signature-verified proof payload. */
|
|
20
|
+
payload: DpopProofPayload;
|
|
21
|
+
};
|
|
22
|
+
export type VerifyDpopProofInput = {
|
|
23
|
+
proofJwt: string;
|
|
24
|
+
/** Actual request URI (scheme + host + port + path; query/frag stripped). */
|
|
25
|
+
htu: string;
|
|
26
|
+
/** Actual HTTP method, uppercase. */
|
|
27
|
+
htm: string;
|
|
28
|
+
/** Wall clock seconds. */
|
|
29
|
+
nowSec: number;
|
|
30
|
+
/** Optional skew allowance. */
|
|
31
|
+
iatToleranceSec?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Required at resource servers when the proof must bind to a presented
|
|
34
|
+
* access token. The verifier checks the proof's `ath` equals
|
|
35
|
+
* base64url(SHA-256(access_token ASCII)). Omit at the AS `/token`
|
|
36
|
+
* endpoint — no access token exists yet there.
|
|
37
|
+
*/
|
|
38
|
+
expectedAth?: string;
|
|
39
|
+
};
|
|
40
|
+
export type VerifyDpopProofDeps = {
|
|
41
|
+
tokenStore: TokenStore;
|
|
42
|
+
jtiTtlMs?: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Verify a DPoP proof JWT and return its `jkt` + payload. Side-effect:
|
|
46
|
+
* records the `jti` in `TokenStore` so a replay within the TTL window
|
|
47
|
+
* is rejected.
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyDpopProof(input: VerifyDpopProofInput, deps: VerifyDpopProofDeps): Promise<Result<VerifiedDpopProof, AuthError>>;
|
|
50
|
+
/**
|
|
51
|
+
* Canonicalize a request URL for `htu` comparison (RFC 9449 §4.3).
|
|
52
|
+
* Strips query string and fragment; preserves scheme, host, port, path.
|
|
53
|
+
* Default port for the scheme is removed.
|
|
54
|
+
*/
|
|
55
|
+
export declare function canonicalHtu(rawUrl: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Compute the `ath` value (RFC 9449 §4.2): base64url(SHA-256(access_token ASCII)).
|
|
58
|
+
* Resource servers compare the presented DPoP proof's `ath` to this.
|
|
59
|
+
*/
|
|
60
|
+
export declare function computeAth(accessToken: string): Promise<string>;
|
|
61
|
+
//# sourceMappingURL=dpop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop.d.ts","sourceRoot":"","sources":["../../../src/domain/dpop.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAQ7C,6EAA6E;AAC7E,eAAO,MAAM,8BAA8B,KAAK,CAAA;AAEhD,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,QAA4C,CAAA;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAwK/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { ClaimsRequest } from "../types/authorization";
|
|
2
|
+
import type { IdTokenClaims, ScopedProfileClaims } from "../types/token";
|
|
3
|
+
import type { SubjectClaim } from "../types/subject";
|
|
4
|
+
/**
|
|
5
|
+
* Derive `amr` from the originating `methodKind`. Values are RFC 8176
|
|
6
|
+
* registered AMR codes. Returns `undefined` when no clean mapping exists
|
|
7
|
+
* — `amr` is an OPTIONAL id_token claim, so omission is spec-compliant.
|
|
8
|
+
*/
|
|
9
|
+
export declare function deriveAmr(methodKind: string): string[] | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* `at_hash` per OIDC Core §3.1.3.6: left-half of SHA-256(access_token
|
|
12
|
+
* ASCII), base64url. Always 16 bytes → 22 base64url characters for
|
|
13
|
+
* SHA-256 (256-bit → 128-bit half → 16 bytes → 22 chars).
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeAtHash(accessToken: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Filter a `SubjectClaim.properties` record down to claims granted by the
|
|
18
|
+
* requested OIDC scopes, then optionally augment with claim names the RP
|
|
19
|
+
* specifically requested via the OIDC Core §5.5 `claims` parameter.
|
|
20
|
+
* Returns a typed `ScopedProfileClaims` ready to spread into the id_token
|
|
21
|
+
* or `/userinfo` response. Properties not named by any granted scope or
|
|
22
|
+
* explicit claim request are dropped.
|
|
23
|
+
*
|
|
24
|
+
* `extra` is the set of claim names the RP requested via `claims`
|
|
25
|
+
* parameter for THIS surface (id_token vs userinfo). Listing a name in
|
|
26
|
+
* `extra` bypasses scope gating per §5.5 ("works without the requestor
|
|
27
|
+
* having to include the scope value").
|
|
28
|
+
*
|
|
29
|
+
* `customMappings` is a host-supplied scope → claim-names map merged on
|
|
30
|
+
* top of the OIDC Core §5.4 table. Lets the host expose vendor-specific
|
|
31
|
+
* identity fields (e.g. `tenant_id`, `org_role`) via a custom scope
|
|
32
|
+
* (`scope=foo` granting `[tenant_id, …]`). Reserved §5.4 names cannot be
|
|
33
|
+
* shadowed — the standard mapping always wins on collision so an
|
|
34
|
+
* `email` scope can't accidentally start meaning something else.
|
|
35
|
+
*
|
|
36
|
+
* Host-supplied values are trusted to match their declared OIDC types
|
|
37
|
+
* — schemas live on `IdPOptions.subjects`, not here. The narrowing cast
|
|
38
|
+
* is the boundary between "host's responsibility" and "framework's
|
|
39
|
+
* responsibility."
|
|
40
|
+
*/
|
|
41
|
+
export declare function pickScopedClaims(claim: SubjectClaim, scopes: ReadonlyArray<string>, extra?: ReadonlyArray<string>, customMappings?: Record<string, ReadonlyArray<string>>): ScopedProfileClaims;
|
|
42
|
+
export type BuildIdTokenInput = {
|
|
43
|
+
issuerUrl: string;
|
|
44
|
+
/** RP `client_id` — the id_token's `aud`. */
|
|
45
|
+
audience: string;
|
|
46
|
+
/** Stable subject identifier (same value as the access token's `sub`). */
|
|
47
|
+
subjectId: string;
|
|
48
|
+
claim: SubjectClaim;
|
|
49
|
+
scopes: ReadonlyArray<string>;
|
|
50
|
+
/** Seconds-since-epoch the user authenticated. */
|
|
51
|
+
authTime: number;
|
|
52
|
+
/** RP-supplied OIDC nonce, when present. */
|
|
53
|
+
appNonce?: string;
|
|
54
|
+
/** Wall clock (ms). */
|
|
55
|
+
now: number;
|
|
56
|
+
/** id_token TTL (ms). Default 5 minutes. */
|
|
57
|
+
ttlMs?: number;
|
|
58
|
+
/** Method kind for `amr` derivation. */
|
|
59
|
+
methodKind: string;
|
|
60
|
+
/** Pre-signed access token whose `at_hash` is bound into the id_token. */
|
|
61
|
+
accessToken: string;
|
|
62
|
+
/** OIDC Core §5.5 — RP-requested claims (this drives only id_token here). */
|
|
63
|
+
claimsRequest?: ClaimsRequest;
|
|
64
|
+
/**
|
|
65
|
+
* Host-supplied vendor scope → claim-names map. Merged on top of OIDC
|
|
66
|
+
* Core §5.4 at scope-gating time. See `pickScopedClaims`.
|
|
67
|
+
*/
|
|
68
|
+
customScopeClaims?: Record<string, ReadonlyArray<string>>;
|
|
69
|
+
};
|
|
70
|
+
export declare const DEFAULT_ID_TOKEN_TTL_MS: number;
|
|
71
|
+
/**
|
|
72
|
+
* Assemble an `IdTokenClaims` object. Pure — no crypto except `at_hash`.
|
|
73
|
+
* Caller signs the result via `signIdToken`.
|
|
74
|
+
*
|
|
75
|
+
* Composition is via spread so the type stays narrow: the base claim set
|
|
76
|
+
* (REQUIRED OIDC §2 + auth_time + at_hash + optional nonce/amr) is built
|
|
77
|
+
* first; the scope-gated §5.1 profile claims merge over the top via
|
|
78
|
+
* `...pickScopedClaims(...)`. No dynamic index assignment, no cast.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildIdTokenClaims(input: BuildIdTokenInput): Promise<IdTokenClaims>;
|
|
81
|
+
/** Predicate: does this token request warrant an `id_token` being issued? */
|
|
82
|
+
export declare function shouldIssueIdToken(scopes: ReadonlyArray<string>): boolean;
|
|
83
|
+
//# sourceMappingURL=id-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-token.d.ts","sourceRoot":"","sources":["../../../src/domain/id-token.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AA6BpD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAiBlE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,KAAK,GAAE,aAAa,CAAC,MAAM,CAAM,EACjC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAM,GACzD,mBAAmB,CAqBrB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,eAAO,MAAM,uBAAuB,QAAgB,CAAA;AAEpD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,aAAa,CAAC,CAqBxB;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAEzE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/introspect` endpoint logic (RFC 7662).
|
|
3
|
+
*
|
|
4
|
+
* RFC 7662 §2.1 REQUIRES authentication: "To prevent token scanning
|
|
5
|
+
* attacks, the endpoint MUST also require some form of authorization to
|
|
6
|
+
* access this endpoint." Confidential-client credentials are validated
|
|
7
|
+
* against the **presenter's** tenant — resolved by the HTTP layer from
|
|
8
|
+
* the request, exactly the same way `/token client_credentials` resolves
|
|
9
|
+
* tenant. Authenticating before touching the token's `tid` means:
|
|
10
|
+
*
|
|
11
|
+
* - Unknown presenting client OR wrong secret → `invalid_client`
|
|
12
|
+
* (uniform — the response says nothing about the token).
|
|
13
|
+
* - Token belongs to a different tenant than the presenter, or names a
|
|
14
|
+
* different client as audience, or fails verification → `{active: false}`.
|
|
15
|
+
*
|
|
16
|
+
* Pre-fix the order was "verify token → load token's tenant → look up
|
|
17
|
+
* presenter in *that* tenant", which let a client authenticated in
|
|
18
|
+
* tenant X probe whether its `client_id` existed in tenant Y by
|
|
19
|
+
* watching for `invalid_client` versus `{active: false}` responses.
|
|
20
|
+
*
|
|
21
|
+
* Audience check (RFC 7662 §2.2): an authenticated client may only
|
|
22
|
+
* inspect tokens that name it as the audience. Tokens belonging to a
|
|
23
|
+
* different client return `{ active: false }` — never a structured
|
|
24
|
+
* error — to avoid leaking which tokens exist.
|
|
25
|
+
*
|
|
26
|
+
* Refresh tokens are not introspectable here; RFC 7662 §2.1 only
|
|
27
|
+
* requires access-token introspection, and our refresh tokens are
|
|
28
|
+
* opaque and don't carry the standard introspection metadata.
|
|
29
|
+
*/
|
|
30
|
+
import type { ConfigStore } from "../ports/config-store";
|
|
31
|
+
import type { KeyStore } from "../ports/key-store";
|
|
32
|
+
import type { AuthError } from "../types/error";
|
|
33
|
+
import type { Result } from "../types/result";
|
|
34
|
+
import type { TenantId } from "../types/tenant";
|
|
35
|
+
export type IntrospectResponse = {
|
|
36
|
+
active: false;
|
|
37
|
+
} | {
|
|
38
|
+
active: true;
|
|
39
|
+
sub: string;
|
|
40
|
+
aud: string;
|
|
41
|
+
iss: string;
|
|
42
|
+
exp: number;
|
|
43
|
+
iat: number;
|
|
44
|
+
scope?: string;
|
|
45
|
+
client_id?: string;
|
|
46
|
+
/** RFC 7662 §2.2 — the token's type indicator. */
|
|
47
|
+
token_type: "Bearer" | "DPoP";
|
|
48
|
+
tid: string;
|
|
49
|
+
mid?: string;
|
|
50
|
+
mkind?: string;
|
|
51
|
+
/** Library-specific — subject schema discriminator (e.g. "user", "admin"). */
|
|
52
|
+
subject_type?: string;
|
|
53
|
+
/** RFC 9449 §6 — present when the access token is DPoP-bound. */
|
|
54
|
+
cnf?: {
|
|
55
|
+
jkt: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export type IntrospectRequest = {
|
|
59
|
+
token: string;
|
|
60
|
+
tokenTypeHint?: "access_token" | "refresh_token";
|
|
61
|
+
/** REQUIRED — RFC 7662 §2.1. */
|
|
62
|
+
clientId: string;
|
|
63
|
+
clientSecret?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The tenant the presenting client belongs to. Resolved by the HTTP
|
|
66
|
+
* layer via `IdPOptions.resolveTenant`, just like for the m2m grant.
|
|
67
|
+
* Cross-tenant introspection collapses to `{active: false}` regardless
|
|
68
|
+
* of whether the presenter's client exists in the token's tenant.
|
|
69
|
+
*/
|
|
70
|
+
presenterTenantId: TenantId;
|
|
71
|
+
};
|
|
72
|
+
export type IntrospectDeps = {
|
|
73
|
+
keyStore: KeyStore;
|
|
74
|
+
configStore: ConfigStore;
|
|
75
|
+
/** Expected issuer for additional validation. */
|
|
76
|
+
issuerUrl?: string;
|
|
77
|
+
};
|
|
78
|
+
export declare function introspect(req: IntrospectRequest, deps: IntrospectDeps): Promise<Result<IntrospectResponse, AuthError>>;
|
|
79
|
+
//# sourceMappingURL=introspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../../src/domain/introspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAK/C,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GACjB;IACE,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAA;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iEAAiE;IACjE,GAAG,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CACtB,CAAA;AAEL,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,cAAc,GAAG,eAAe,CAAA;IAChD,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,iBAAiB,EAAE,QAAQ,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAkEhD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT signing + verification for access tokens, plus the JWKS document
|
|
3
|
+
* builder consumed by `/.well-known/jwks.json`.
|
|
4
|
+
*
|
|
5
|
+
* Per AD9 / AD11, access tokens are JWTs (ES256 default; Ed25519 supported).
|
|
6
|
+
* Refresh tokens are opaque server-side records — they do NOT pass through
|
|
7
|
+
* this module.
|
|
8
|
+
*/
|
|
9
|
+
import type { JWK, KeyLike } from "jose";
|
|
10
|
+
import type { AccessTokenClaims, IdTokenClaims } from "../types/token";
|
|
11
|
+
import type { SigningKey } from "../ports/key-store";
|
|
12
|
+
/**
|
|
13
|
+
* Sign an access-token claim set under the supplied private key. `kid` is
|
|
14
|
+
* stamped into the JWT header so verifiers can look up the right public
|
|
15
|
+
* key from JWKS.
|
|
16
|
+
*/
|
|
17
|
+
export declare function signAccessToken(claims: AccessTokenClaims, privateKey: KeyLike, alg: string, kid: string): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Sign an OIDC `id_token` claim set (OIDC Core §2). Header `typ` is
|
|
20
|
+
* `"JWT"` per common practice; OIDC Core does not mandate `"id_token"`.
|
|
21
|
+
* The claims object is verified by the caller to include `iss`, `sub`,
|
|
22
|
+
* `aud`, `exp`, `iat` (REQUIRED per §2).
|
|
23
|
+
*/
|
|
24
|
+
export declare function signIdToken(claims: IdTokenClaims, privateKey: KeyLike, alg: string, kid: string): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Verify an OIDC `id_token` against the IdP's published signing keys.
|
|
27
|
+
* Used at `/end_session` to validate `id_token_hint` and by adjacent
|
|
28
|
+
* domain code that needs to introspect a previously-issued id_token.
|
|
29
|
+
*
|
|
30
|
+
* Same algorithm-confusion defenses as `verifyAccessToken`: only the
|
|
31
|
+
* asymmetric allow-list (`ES256`, `EdDSA`) accepted; `alg: "none"`
|
|
32
|
+
* rejected explicitly.
|
|
33
|
+
*
|
|
34
|
+
* `acceptExpired` relaxes the `exp` check — required at `/end_session`
|
|
35
|
+
* per OIDC RP-Initiated Logout 1.0 §2, where logout often follows token
|
|
36
|
+
* expiry and the spec permits accepting an expired hint. The signature
|
|
37
|
+
* + issuer + audience checks remain strict.
|
|
38
|
+
*/
|
|
39
|
+
export declare function verifyIdToken(token: string, keys: ReadonlyArray<SigningKey>, options?: {
|
|
40
|
+
issuer?: string;
|
|
41
|
+
audience?: string;
|
|
42
|
+
acceptExpired?: boolean;
|
|
43
|
+
}): Promise<IdTokenClaims>;
|
|
44
|
+
/**
|
|
45
|
+
* Verify a JWT access token using a list of trusted signing keys (from
|
|
46
|
+
* `KeyStore.signingKeys()`). Looks up by `kid` in the JWT header.
|
|
47
|
+
*
|
|
48
|
+
* Algorithm enforcement: the allow-list is derived from the loaded
|
|
49
|
+
* `SigningKey.alg` values, intersected with the asymmetric allow-list
|
|
50
|
+
* (`ES256`, `EdDSA`). Symmetric (`HS*`) and `none` are filtered out, so a
|
|
51
|
+
* symmetric key accidentally landing in the store does not open an
|
|
52
|
+
* alg-confusion path. The kid resolver also rejects `alg: "none"`
|
|
53
|
+
* explicitly as defense in depth — `jose` already refuses tokens whose
|
|
54
|
+
* header `alg` is outside `algorithms`, but a future call site that
|
|
55
|
+
* dropped the option would still be safe.
|
|
56
|
+
*
|
|
57
|
+
* Returns the typed claims on success. Throws (via `jose`) on any
|
|
58
|
+
* signature, expiry, or alg-mismatch failure — callers wrap in `try` and
|
|
59
|
+
* convert to `Result`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function verifyAccessToken(token: string, keys: ReadonlyArray<SigningKey>, options?: {
|
|
62
|
+
issuer?: string;
|
|
63
|
+
audience?: string;
|
|
64
|
+
}): Promise<AccessTokenClaims>;
|
|
65
|
+
/**
|
|
66
|
+
* Build the JWKS document for `/.well-known/jwks.json`. Includes active +
|
|
67
|
+
* recently-rotated keys (the overlap window) so consumers caching JWKS
|
|
68
|
+
* continue to verify tokens signed under a just-retired key until they
|
|
69
|
+
* refresh.
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildJwksDocument(keys: ReadonlyArray<SigningKey>): {
|
|
72
|
+
keys: JWK[];
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../../src/domain/jwt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,OAAO,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,OAAO,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAC/B,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;CACnB,GACL,OAAO,CAAC,aAAa,CAAC,CAsCxB;AAKD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAC/B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,iBAAiB,CAAC,CAgC5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG;IAClE,IAAI,EAAE,GAAG,EAAE,CAAA;CACZ,CASA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/end_session` endpoint logic — OIDC RP-Initiated Logout 1.0.
|
|
3
|
+
*
|
|
4
|
+
* The OP validates the optional `id_token_hint`, validates the optional
|
|
5
|
+
* `post_logout_redirect_uri` against the client's registered list,
|
|
6
|
+
* revokes the subject's refresh tokens (when a subject is identified),
|
|
7
|
+
* and either redirects the user-agent back to the RP with `state` echoed
|
|
8
|
+
* or returns a generic "logged out" acknowledgement.
|
|
9
|
+
*
|
|
10
|
+
* Per §2:
|
|
11
|
+
* - `id_token_hint` (RECOMMENDED): a previously-issued id_token. The
|
|
12
|
+
* OP MUST verify the signature; expiry MAY be tolerated because
|
|
13
|
+
* logout commonly follows token expiry. We accept expired hints but
|
|
14
|
+
* enforce signature + issuer.
|
|
15
|
+
* - `client_id` (OPTIONAL): when both this and `id_token_hint` are
|
|
16
|
+
* present, the OP MUST verify the client_id matches the hint's `aud`.
|
|
17
|
+
* - `post_logout_redirect_uri` (OPTIONAL): MUST be exact-match against
|
|
18
|
+
* the resolved client's `postLogoutRedirectUris`. If the URI is not
|
|
19
|
+
* registered, the OP MUST NOT redirect — surface a non-redirecting
|
|
20
|
+
* error instead, otherwise the endpoint becomes an open redirector.
|
|
21
|
+
* - `state` (OPTIONAL): echoed back in the redirect.
|
|
22
|
+
*
|
|
23
|
+
* Front-channel / back-channel logout (RP notification of OP-initiated
|
|
24
|
+
* logout) is out of scope for this minimal endpoint. Hosts that need it
|
|
25
|
+
* can layer their own notification fan-out on top of `session_logout`
|
|
26
|
+
* audit events.
|
|
27
|
+
*/
|
|
28
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
29
|
+
import type { ConfigStore } from "../ports/config-store";
|
|
30
|
+
import type { KeyStore } from "../ports/key-store";
|
|
31
|
+
import type { TokenStore } from "../ports/token-store";
|
|
32
|
+
import { type AuthError } from "../types/error";
|
|
33
|
+
import type { Result } from "../types/result";
|
|
34
|
+
import type { TenantContext } from "../types/tenant";
|
|
35
|
+
export type EndSessionRequest = {
|
|
36
|
+
idTokenHint?: string;
|
|
37
|
+
clientId?: string;
|
|
38
|
+
postLogoutRedirectUri?: string;
|
|
39
|
+
state?: string;
|
|
40
|
+
};
|
|
41
|
+
export type EndSessionDeps = {
|
|
42
|
+
configStore: ConfigStore;
|
|
43
|
+
tokenStore: TokenStore;
|
|
44
|
+
keyStore: KeyStore;
|
|
45
|
+
auditLog?: AuditLog;
|
|
46
|
+
issuerUrl: string;
|
|
47
|
+
clock: () => number;
|
|
48
|
+
};
|
|
49
|
+
export type EndSessionOutput =
|
|
50
|
+
/** Redirect the user-agent back to the RP. */
|
|
51
|
+
{
|
|
52
|
+
kind: "redirect";
|
|
53
|
+
url: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* No `post_logout_redirect_uri` was supplied (or it wasn't registered).
|
|
57
|
+
* Caller should render a minimal "logged out" page or return 200.
|
|
58
|
+
*/
|
|
59
|
+
| {
|
|
60
|
+
kind: "ok";
|
|
61
|
+
subjectId?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Process an `/end_session` request and return an outcome the HTTP
|
|
65
|
+
* adapter can translate into a `Response`. Pure domain — no Hono types,
|
|
66
|
+
* no `Response` construction here.
|
|
67
|
+
*/
|
|
68
|
+
export declare function endSession(req: EndSessionRequest, tenant: TenantContext, deps: EndSessionDeps): Promise<Result<EndSessionOutput, AuthError>>;
|
|
69
|
+
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/domain/logout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAMlE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,gBAAgB;AAC1B,8CAA8C;AAC5C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACnC;;;GAGG;GACD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtC;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAyG9C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `MethodCache` — loads `AuthMethodFactory` builds per
|
|
3
|
+
* `(tenantId, MethodConfig.id)` and caches the result.
|
|
4
|
+
*
|
|
5
|
+
* Responsibilities per plan §"Per-tenant config → typed method config":
|
|
6
|
+
* 1. Look up the factory by `MethodConfig.kind`. Unknown kind → audit
|
|
7
|
+
* `unknown_method_kind`, treat instance as disabled.
|
|
8
|
+
* 2. Validate `MethodConfig.config` against `factory.configSchema`.
|
|
9
|
+
* Failure → audit `invalid_method_config`, treat instance as disabled.
|
|
10
|
+
* 3. Call `factory.build({ id, kind, tenantId, config })`. Verify the
|
|
11
|
+
* returned `AuthMethod` has `id` / `kind` matching the inputs. Mismatch
|
|
12
|
+
* → audit `factory_id_mismatch`, fail the load.
|
|
13
|
+
* 4. Cache per `(tenantId, MethodConfig.id)`. The cache is in-process —
|
|
14
|
+
* TTL is governed by the `ConfigStore` invalidation hook in Phase 3+;
|
|
15
|
+
* in Phase 2 / tests, manual `invalidate(tenantId)` is sufficient.
|
|
16
|
+
*/
|
|
17
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
18
|
+
import { type AuthError } from "../types/error";
|
|
19
|
+
import type { AnyAuthMethodFactory, AuthMethod } from "../types/method";
|
|
20
|
+
import type { Result } from "../types/result";
|
|
21
|
+
import type { TenantConfig, TenantId } from "../types/tenant";
|
|
22
|
+
export type MethodCacheOptions = {
|
|
23
|
+
factories: Record<string, AnyAuthMethodFactory>;
|
|
24
|
+
auditLog?: AuditLog;
|
|
25
|
+
/** Injectable clock for audit timestamps. */
|
|
26
|
+
now: () => number;
|
|
27
|
+
};
|
|
28
|
+
export declare class MethodCache {
|
|
29
|
+
#private;
|
|
30
|
+
constructor(opts: MethodCacheOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Load (or fetch from cache) the `AuthMethod` for the given tenant +
|
|
33
|
+
* tenant-local method instance id. Returns `method_not_found` for any
|
|
34
|
+
* disabled / unknown / invalid-config path.
|
|
35
|
+
*/
|
|
36
|
+
resolve(tenant: TenantConfig, methodId: string): Promise<Result<AuthMethod, AuthError>>;
|
|
37
|
+
/** Drop cached instances for a tenant. Called on config invalidation. */
|
|
38
|
+
invalidate(tenantId: TenantId, methodId?: string): void;
|
|
39
|
+
/** List all enabled methods for a tenant — used by method-selection UI. */
|
|
40
|
+
listAvailable(tenant: TenantConfig): Promise<AuthMethod[]>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=method-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-cache.d.ts","sourceRoot":"","sources":["../../../src/domain/method-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAgB,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE3E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAC/C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB,CAAA;AAED,qBAAa,WAAW;;gBAQV,IAAI,EAAE,kBAAkB;IAMpC;;;;OAIG;IACG,OAAO,CACX,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAsCzC,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAevD,2EAA2E;IACrE,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAgHjE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Method dispatch — invoke a method's route handler, then enforce the
|
|
3
|
+
* `saveMethodState` durability contract.
|
|
4
|
+
*
|
|
5
|
+
* Per `ARCHITECTURE.md`: when a method handler returns
|
|
6
|
+
* `{ kind: "challenge", saveMethodState }`, the framework MUST persist
|
|
7
|
+
* `methodState` via `SessionStore.updateFlowMethodState` **before**
|
|
8
|
+
* surfacing the response. Centralizing that here keeps the
|
|
9
|
+
* happens-before contract uniform across every call site.
|
|
10
|
+
*/
|
|
11
|
+
import type { SessionStore } from "../ports/session-store";
|
|
12
|
+
import { type AuthError } from "../types/error";
|
|
13
|
+
import type { FlowRecord } from "../types/flow";
|
|
14
|
+
import type { AuthMethod, MethodDispatchData, MethodResult } from "../types/method";
|
|
15
|
+
import type { Result } from "../types/result";
|
|
16
|
+
import type { TenantContext } from "../types/tenant";
|
|
17
|
+
export type RouteKey = `${"GET" | "POST"} ${string}`;
|
|
18
|
+
export type DispatchInput = {
|
|
19
|
+
method: AuthMethod;
|
|
20
|
+
route: RouteKey;
|
|
21
|
+
tenant: TenantContext;
|
|
22
|
+
request: Request;
|
|
23
|
+
subPath: string;
|
|
24
|
+
flow: FlowRecord | null;
|
|
25
|
+
cookies: ReadonlyMap<string, string>;
|
|
26
|
+
sessionStore: SessionStore;
|
|
27
|
+
/** Populated at `GET /authorize`; null on callbacks. */
|
|
28
|
+
dispatch: MethodDispatchData | null;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Invoke the named route on the method. If the result is a challenge with
|
|
32
|
+
* `saveMethodState`, persist it to `SessionStore` and only then return.
|
|
33
|
+
* The framework owns this happens-before guarantee so methods cannot
|
|
34
|
+
* accidentally surface a redirect before the upstream verifier is durable.
|
|
35
|
+
*/
|
|
36
|
+
export declare function dispatchMethod(input: DispatchInput): Promise<Result<MethodResult<unknown, unknown>, AuthError>>;
|
|
37
|
+
//# sourceMappingURL=method-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method-dispatch.d.ts","sourceRoot":"","sources":["../../../src/domain/method-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EACV,UAAU,EAEV,kBAAkB,EAClB,YAAY,EACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,QAAQ,GAAG,GAAG,KAAK,GAAG,MAAM,IAAI,MAAM,EAAE,CAAA;AAEpD,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,YAAY,EAAE,YAAY,CAAA;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;CACpC,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAgD5D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `handleMethodRoute` — the third pipeline.
|
|
3
|
+
*
|
|
4
|
+
* `/authorize` and `/cb/:methodId` are the two pipelines that produce a
|
|
5
|
+
* flow record and consume it respectively. Credential-style methods
|
|
6
|
+
* (password, code, passkey) additionally need a way to make in-flight
|
|
7
|
+
* POSTs against the IdP — submitting a login form, asking for a one-time
|
|
8
|
+
* code, completing a WebAuthn ceremony. The HTTP layer mounts these at
|
|
9
|
+
* `/m/<methodId>/<subPath>` and delegates here.
|
|
10
|
+
*
|
|
11
|
+
* Responsibilities:
|
|
12
|
+
* 1. Read `flowId` from the framework-set HttpOnly `idp.flow` cookie.
|
|
13
|
+
* No cookie → `invalid_request` (the user lost their flow).
|
|
14
|
+
* 2. `SessionStore.readFlow(flowId)` — peek, do not consume. Methods may
|
|
15
|
+
* need multiple round trips before completing (e.g. send-code →
|
|
16
|
+
* verify-code).
|
|
17
|
+
* 3. Tenant must match the cookie's flow. If the request's tenant
|
|
18
|
+
* (resolved via `resolveTenant`) disagrees with the flow's tenant,
|
|
19
|
+
* audit `flow_tenant_mismatch` and reject. This is the same invariant
|
|
20
|
+
* the upstream-callback path enforces.
|
|
21
|
+
* 4. Dispatch the method's `<METHOD> <subPath>` route.
|
|
22
|
+
* 5. Translate `MethodResult`:
|
|
23
|
+
* - `challenge` → return response (methodState merged before send).
|
|
24
|
+
* - `success` → `consumeFlow`, snapshot into auth code, return
|
|
25
|
+
* `issue-code` for the HTTP layer to redirect.
|
|
26
|
+
* - `denied` → return reason; HTTP layer renders.
|
|
27
|
+
* - `error` → propagated.
|
|
28
|
+
*/
|
|
29
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
30
|
+
import type { KeyStore } from "../ports/key-store";
|
|
31
|
+
import type { SessionStore } from "../ports/session-store";
|
|
32
|
+
import type { TokenStore } from "../ports/token-store";
|
|
33
|
+
import { type AuthError } from "../types/error";
|
|
34
|
+
import type { CachePolicy, SetCookie } from "../types/method";
|
|
35
|
+
import type { Result } from "../types/result";
|
|
36
|
+
import type { TenantContext } from "../types/tenant";
|
|
37
|
+
import { MethodCache } from "./method-cache";
|
|
38
|
+
export type MethodRouteOutput = {
|
|
39
|
+
kind: "issue-code";
|
|
40
|
+
code: string;
|
|
41
|
+
appRedirectUri: string;
|
|
42
|
+
appState: string | null;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "challenge";
|
|
45
|
+
response: Response;
|
|
46
|
+
setCookies: SetCookie[];
|
|
47
|
+
cache?: CachePolicy;
|
|
48
|
+
} | {
|
|
49
|
+
kind: "denied";
|
|
50
|
+
reason: string;
|
|
51
|
+
setCookies: SetCookie[];
|
|
52
|
+
};
|
|
53
|
+
export type HandleMethodRouteInput = {
|
|
54
|
+
rawRequest: Request;
|
|
55
|
+
tenant: TenantContext;
|
|
56
|
+
/** Tenant-local instance id (`MethodConfig.id`) parsed from the URL. */
|
|
57
|
+
methodId: string;
|
|
58
|
+
/** Path within the method's mount, e.g. `"/login"`. */
|
|
59
|
+
subPath: string;
|
|
60
|
+
/** HTTP method of the incoming request: `"GET"` or `"POST"`. */
|
|
61
|
+
httpMethod: "GET" | "POST";
|
|
62
|
+
/** flowId from the `idp.flow` cookie. */
|
|
63
|
+
flowId: string;
|
|
64
|
+
cookies: ReadonlyMap<string, string>;
|
|
65
|
+
};
|
|
66
|
+
export type HandleMethodRouteDeps = {
|
|
67
|
+
sessionStore: SessionStore;
|
|
68
|
+
tokenStore: TokenStore;
|
|
69
|
+
/** Needed for at-rest encryption of the code payload — see `domain/token.ts`. */
|
|
70
|
+
keyStore: KeyStore;
|
|
71
|
+
auditLog?: AuditLog;
|
|
72
|
+
methodCache: MethodCache;
|
|
73
|
+
clock: () => number;
|
|
74
|
+
newCodeId?: () => string;
|
|
75
|
+
};
|
|
76
|
+
export declare function handleMethodRoute(input: HandleMethodRouteInput, deps: HandleMethodRouteDeps): Promise<Result<MethodRouteOutput, AuthError>>;
|
|
77
|
+
//# sourceMappingURL=method-route.d.ts.map
|