@_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,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres schema for the IdP adapters. One migration; future schema changes
|
|
3
|
+
* append new migrations and a small migrate-from-version routine.
|
|
4
|
+
*
|
|
5
|
+
* Tables are prefixed `openauth_` so the IdP can share a database with the
|
|
6
|
+
* application that consumes it. The schema is intentionally narrow — JSONB
|
|
7
|
+
* blobs carry the bulk of the data (auth-code ciphertext, refresh payload,
|
|
8
|
+
* tenant config) so that adding fields in later phases is non-breaking.
|
|
9
|
+
*
|
|
10
|
+
* Timestamps are `bigint` (epoch ms) rather than `timestamptz` so that the
|
|
11
|
+
* adapter's injectable clock works seamlessly in tests and so that
|
|
12
|
+
* comparisons are simple integer math.
|
|
13
|
+
*/
|
|
14
|
+
import type { PostgresExecutor } from "./executor";
|
|
15
|
+
export declare const INITIAL_SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS openauth_tenants (\n id text PRIMARY KEY,\n config jsonb NOT NULL,\n updated_at bigint NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS openauth_methods (\n tenant_id text NOT NULL,\n method_id text NOT NULL,\n config jsonb NOT NULL,\n updated_at bigint NOT NULL,\n PRIMARY KEY (tenant_id, method_id)\n);\n\nCREATE TABLE IF NOT EXISTS openauth_signing_keys (\n kid text PRIMARY KEY,\n alg text NOT NULL,\n crv text,\n public_jwk jsonb NOT NULL,\n private_jwk jsonb NOT NULL,\n private_jwk_wrapped boolean NOT NULL DEFAULT false,\n status text NOT NULL,\n created_at bigint NOT NULL,\n rotated_at bigint\n);\n\nALTER TABLE openauth_signing_keys\n ADD COLUMN IF NOT EXISTS private_jwk_wrapped boolean NOT NULL DEFAULT false;\n\nCREATE TABLE IF NOT EXISTS openauth_encryption_keys (\n kid text PRIMARY KEY,\n alg text NOT NULL,\n key_material bytea NOT NULL,\n key_material_wrapped boolean NOT NULL DEFAULT false,\n status text NOT NULL,\n created_at bigint NOT NULL,\n rotated_at bigint\n);\n\nALTER TABLE openauth_encryption_keys\n ADD COLUMN IF NOT EXISTS key_material_wrapped boolean NOT NULL DEFAULT false;\n\nCREATE TABLE IF NOT EXISTS openauth_codes (\n code text PRIMARY KEY,\n ciphertext text NOT NULL,\n expires_at bigint NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS openauth_refresh_tokens (\n token text PRIMARY KEY,\n tenant_id text NOT NULL,\n client_id text NOT NULL,\n subject_id text NOT NULL,\n family text NOT NULL,\n expires_at bigint NOT NULL,\n consumed_at bigint,\n payload jsonb NOT NULL\n);\nCREATE INDEX IF NOT EXISTS openauth_refresh_family_idx\n ON openauth_refresh_tokens (family);\nCREATE INDEX IF NOT EXISTS openauth_refresh_subject_idx\n ON openauth_refresh_tokens (tenant_id, subject_id);\n\nCREATE TABLE IF NOT EXISTS openauth_flows (\n flow_id text PRIMARY KEY,\n payload jsonb NOT NULL,\n expires_at bigint NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS openauth_sessions (\n session_id text PRIMARY KEY,\n payload jsonb NOT NULL,\n expires_at bigint NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS openauth_audit_events (\n id bigserial PRIMARY KEY,\n ts bigint NOT NULL,\n kind text NOT NULL,\n payload jsonb NOT NULL\n);\nCREATE INDEX IF NOT EXISTS openauth_audit_kind_idx\n ON openauth_audit_events (kind);\nCREATE INDEX IF NOT EXISTS openauth_audit_ts_idx\n ON openauth_audit_events (ts);\n\nCREATE TABLE IF NOT EXISTS openauth_passkey_credentials (\n tenant_id text NOT NULL,\n credential_id text NOT NULL,\n user_id text NOT NULL,\n public_key text NOT NULL,\n counter bigint NOT NULL DEFAULT 0,\n transports jsonb,\n created_at bigint NOT NULL,\n PRIMARY KEY (tenant_id, credential_id)\n);\nCREATE INDEX IF NOT EXISTS openauth_passkey_user_idx\n ON openauth_passkey_credentials (tenant_id, user_id);\n";
|
|
16
|
+
/**
|
|
17
|
+
* Apply the initial schema. Idempotent — uses `CREATE TABLE IF NOT EXISTS`.
|
|
18
|
+
* Deployments using a real migration tool can apply the SQL above directly
|
|
19
|
+
* and skip this helper.
|
|
20
|
+
*/
|
|
21
|
+
export declare function migrate(exec: PostgresExecutor): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgres/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,eAAO,MAAM,kBAAkB,mwFAmG9B,CAAA;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres `PasskeyCredentialStore`.
|
|
3
|
+
*
|
|
4
|
+
* Schema (created by `migrate()` in `./migrations.ts`):
|
|
5
|
+
*
|
|
6
|
+
* openauth_passkey_credentials
|
|
7
|
+
* tenant_id text NOT NULL
|
|
8
|
+
* credential_id text NOT NULL
|
|
9
|
+
* user_id text NOT NULL
|
|
10
|
+
* public_key text NOT NULL
|
|
11
|
+
* counter bigint NOT NULL DEFAULT 0
|
|
12
|
+
* transports jsonb
|
|
13
|
+
* created_at bigint NOT NULL
|
|
14
|
+
* PRIMARY KEY (tenant_id, credential_id)
|
|
15
|
+
* INDEX (tenant_id, user_id) -- findByUsername path
|
|
16
|
+
*
|
|
17
|
+
* The reference adapter treats `userId` as the username lookup key —
|
|
18
|
+
* matching the bundled `passkeyMethod` which sets `userId =
|
|
19
|
+
* parsed.data.username` at registration. Hosts that want a separate
|
|
20
|
+
* username dimension implement `PasskeyCredentialStore` directly
|
|
21
|
+
* against their own user table.
|
|
22
|
+
*/
|
|
23
|
+
import type { PasskeyCredentialStore, StoredCredential } from "../../methods/passkey";
|
|
24
|
+
import type { PostgresExecutor } from "./executor";
|
|
25
|
+
export type PostgresPasskeyCredentialStoreOptions = {
|
|
26
|
+
exec: PostgresExecutor;
|
|
27
|
+
clock?: () => number;
|
|
28
|
+
};
|
|
29
|
+
export declare class PostgresPasskeyCredentialStore implements PasskeyCredentialStore {
|
|
30
|
+
#private;
|
|
31
|
+
constructor(opts: PostgresPasskeyCredentialStoreOptions);
|
|
32
|
+
findByUsername(username: string, tenantId: string): Promise<{
|
|
33
|
+
userId: string;
|
|
34
|
+
credentials: StoredCredential[];
|
|
35
|
+
} | null>;
|
|
36
|
+
findById(credentialId: string, tenantId: string): Promise<StoredCredential | null>;
|
|
37
|
+
updateCounter(input: {
|
|
38
|
+
credentialId: string;
|
|
39
|
+
counter: number;
|
|
40
|
+
tenantId: string;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
create(input: {
|
|
43
|
+
userId: string;
|
|
44
|
+
credential: StoredCredential;
|
|
45
|
+
tenantId: string;
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=passkey-credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey-credential-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgres/passkey-credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,gBAAgB,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CACrB,CAAA;AAUD,qBAAa,8BAA+B,YAAW,sBAAsB;;gBAI/D,IAAI,EAAE,qCAAqC;IAKjD,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,gBAAgB,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAchE,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAY7B,aAAa,CAAC,KAAK,EAAE;QACzB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IASX,MAAM,CAAC,KAAK,EAAE;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,gBAAgB,CAAA;QAC5B,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBlB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FlowRecord } from "../../types/flow";
|
|
2
|
+
import type { SessionRecord, SessionStore } from "../../ports/session-store";
|
|
3
|
+
import type { Result } from "../../types/result";
|
|
4
|
+
import type { PostgresExecutor } from "./executor";
|
|
5
|
+
export type PostgresSessionStoreOptions = {
|
|
6
|
+
exec: PostgresExecutor;
|
|
7
|
+
clock?: () => number;
|
|
8
|
+
};
|
|
9
|
+
export declare class PostgresSessionStore implements SessionStore {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(opts: PostgresSessionStoreOptions);
|
|
12
|
+
saveFlow(flowId: string, payload: FlowRecord, ttl: number): Promise<Result<void>>;
|
|
13
|
+
updateFlowMethodState(flowId: string, methodState: unknown): Promise<Result<void>>;
|
|
14
|
+
readFlow(flowId: string): Promise<Result<FlowRecord>>;
|
|
15
|
+
consumeFlow(flowId: string): Promise<Result<FlowRecord>>;
|
|
16
|
+
createSession(sessionId: string, payload: SessionRecord, ttl: number): Promise<Result<void>>;
|
|
17
|
+
readSession(sessionId: string): Promise<Result<SessionRecord>>;
|
|
18
|
+
revokeSession(sessionId: string): Promise<Result<void>>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgres/session-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,gBAAgB,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CACrB,CAAA;AAED,qBAAa,oBAAqB,YAAW,YAAY;;gBAI3C,IAAI,EAAE,2BAA2B;IAKvC,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAmBlB,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAwBlB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IA6BrD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IA4BxD,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAsBlB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IA6B9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAW9D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { KeyStore } from "../../ports/key-store";
|
|
2
|
+
import type { TokenStore } from "../../ports/token-store";
|
|
3
|
+
import type { Result } from "../../types/result";
|
|
4
|
+
import type { TenantId } from "../../types/tenant";
|
|
5
|
+
import type { RefreshTokenPayload } from "../../types/token";
|
|
6
|
+
import type { PostgresExecutor } from "./executor";
|
|
7
|
+
export type PostgresTokenStoreOptions = {
|
|
8
|
+
exec: PostgresExecutor;
|
|
9
|
+
/**
|
|
10
|
+
* Optional — retained for API stability after M1 moved code-payload
|
|
11
|
+
* encryption to the domain layer. The adapter no longer touches it.
|
|
12
|
+
*/
|
|
13
|
+
keyStore?: KeyStore;
|
|
14
|
+
/** Injectable clock — defaults to `Date.now`. Tests advance it. */
|
|
15
|
+
clock?: () => number;
|
|
16
|
+
};
|
|
17
|
+
export declare class PostgresTokenStore implements TokenStore {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(opts: PostgresTokenStoreOptions);
|
|
20
|
+
saveCode(code: string, ciphertext: string, ttl: number): Promise<Result<void>>;
|
|
21
|
+
consumeCode(code: string): Promise<Result<string>>;
|
|
22
|
+
saveRefresh(refresh: string, payload: RefreshTokenPayload): Promise<Result<void>>;
|
|
23
|
+
consumeRefresh(refresh: string, options?: {
|
|
24
|
+
reuseWindowMs?: number;
|
|
25
|
+
}): Promise<Result<RefreshTokenPayload>>;
|
|
26
|
+
peekRefresh(refresh: string): Promise<Result<RefreshTokenPayload>>;
|
|
27
|
+
revokeFamily(family: string): Promise<Result<void>>;
|
|
28
|
+
revokeBySubject(tenantId: TenantId, subjectId: string): Promise<Result<void>>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgres/token-store.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,gBAAgB,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CACrB,CAAA;AAED,qBAAa,kBAAmB,YAAW,UAAU;;gBAIvC,IAAI,EAAE,yBAAyB;IAKrC,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAoBlB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAyBlD,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAsBlB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACvC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IA6EjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAyBlE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAYnD,eAAe,CACnB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAYzB"}
|
package/dist/types/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SubjectSchema } from "./subject
|
|
1
|
+
import type { SubjectSchema } from "./types/subject";
|
|
2
2
|
import type { v1 } from "@standard-schema/spec";
|
|
3
3
|
import { InvalidAccessTokenError, InvalidAuthorizationCodeError, InvalidRefreshTokenError } from "./error.js";
|
|
4
4
|
/**
|
|
@@ -35,6 +35,13 @@ export interface Tokens {
|
|
|
35
35
|
* The number of seconds until the access token expires.
|
|
36
36
|
*/
|
|
37
37
|
expiresIn: number;
|
|
38
|
+
/**
|
|
39
|
+
* The OIDC `id_token` (signed JWT), present when `scope=openid` was granted.
|
|
40
|
+
*
|
|
41
|
+
* Refresh-grant rotation reissues this with a stable `auth_time` per
|
|
42
|
+
* OIDC Core §12 and deliberately omits the original `nonce`.
|
|
43
|
+
*/
|
|
44
|
+
idToken?: string;
|
|
38
45
|
}
|
|
39
46
|
interface ResponseLike {
|
|
40
47
|
json(): Promise<unknown>;
|
|
@@ -118,6 +125,18 @@ export interface AuthorizeOptions {
|
|
|
118
125
|
* If there's only one provider configured, the user will be redirected to that.
|
|
119
126
|
*/
|
|
120
127
|
provider?: string;
|
|
128
|
+
/**
|
|
129
|
+
* OAuth scopes to request, e.g. `["openid", "email", "profile"]`.
|
|
130
|
+
*
|
|
131
|
+
* Pass `openid` to request an `id_token` at `/token` (OIDC Core §2). Pass
|
|
132
|
+
* `email` / `profile` / `phone` / `address` to opt into the standard §5.4
|
|
133
|
+
* profile claim sets on the id_token and `/userinfo` response.
|
|
134
|
+
*
|
|
135
|
+
* Accepts an array or a pre-joined space-separated string. When omitted,
|
|
136
|
+
* no `scope` is sent — the IdP's default grant applies, which typically
|
|
137
|
+
* does NOT include `openid` and therefore does NOT issue an id_token.
|
|
138
|
+
*/
|
|
139
|
+
scope?: string | string[];
|
|
121
140
|
}
|
|
122
141
|
export interface AuthorizeResult {
|
|
123
142
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EAEzB,MAAM,YAAY,CAAA;AAGnB;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,YAAY;IACpB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;CACnB;AACD,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;AAE1D;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;;;OAQG;IACH,SAAS,EAAE,SAAS,CAAA;IACpB;;;;;;;;OAQG;IACH,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,GAAG,EAAE,KAAK,CAAA;IACV;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;OASG;IACH,GAAG,EAAE,6BAA6B,CAAA;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,GAAG,EAAE,KAAK,CAAA;IACV;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,GAAG,EAAE,wBAAwB,GAAG,uBAAuB,CAAA;CACxD;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,aAAa;IACnD;;OAEG;IACH,GAAG,CAAC,EAAE,SAAS,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,OAAO,EAAE;SACN,IAAI,IAAI,MAAM,CAAC,GAAG;YAAE,IAAI,EAAE,IAAI,CAAC;YAAC,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;SAAE;KACvE,CAAC,MAAM,CAAC,CAAC,CAAA;CACX;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,GAAG,EAAE,wBAAwB,GAAG,uBAAuB,CAAA;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,OAAO,EAC1B,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,eAAe,CAAC,CAAA;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,GAAG,aAAa,CAAC,CAAA;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACH,OAAO,CACL,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC,CAAA;IACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACH,MAAM,CAAC,CAAC,SAAS,aAAa,EAC5B,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAA;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAwPvD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `safeAudit` helper — every domain module that emits audit
|
|
3
|
+
* events used to keep its own private `audit(...)` wrapper around
|
|
4
|
+
* `auditLog.log(event)` that silently swallowed any thrown error. The
|
|
5
|
+
* intent (per `ports/audit-log.ts`) is that audit emission must not
|
|
6
|
+
* derail the OAuth hot path, but operators have no signal when the
|
|
7
|
+
* pipeline goes down.
|
|
8
|
+
*
|
|
9
|
+
* Until the Logger port lands in Phase 8, durability failures here
|
|
10
|
+
* surface via `console.error` with a discriminating prefix. The Logger
|
|
11
|
+
* port will replace this single helper — the call sites stay put.
|
|
12
|
+
*/
|
|
13
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
14
|
+
export declare function safeAudit(deps: {
|
|
15
|
+
auditLog?: AuditLog;
|
|
16
|
+
}, event: Parameters<AuditLog["log"]>[0]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/domain/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,wBAAsB,SAAS,CAC7B,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,EAC7B,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `startAuthorize` — orchestrate the `/authorize` flow.
|
|
3
|
+
*
|
|
4
|
+
* Pure domain function over typed ports. The HTTP layer (Phase 3) parses
|
|
5
|
+
* the incoming `Request` into an `AuthorizationRequest`, runs
|
|
6
|
+
* `resolveTenant`, then calls into this function. No framework imports.
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities (in order):
|
|
9
|
+
* 1. Validate the request against the registered `ClientConfig` —
|
|
10
|
+
* client lookup, redirect-URI exact match, scope subset, PKCE
|
|
11
|
+
* required-when-required.
|
|
12
|
+
* 2. Pick the method to dispatch to: explicit `methodId` if present,
|
|
13
|
+
* else the only enabled method, else surface a method-selection
|
|
14
|
+
* output for the UI.
|
|
15
|
+
* 3. Atomically `saveFlow` the `FlowRecord` (creates the
|
|
16
|
+
* pre-callback state) under a freshly minted `flowId`.
|
|
17
|
+
* 4. Mint the MAC-signed `state` envelope under the active key.
|
|
18
|
+
* 5. Dispatch to the method's `GET /authorize` handler — the method
|
|
19
|
+
* builds the upstream redirect (or renders the credential form,
|
|
20
|
+
* etc.) using the `dispatch.state` / `dispatch.callbackUrl` data
|
|
21
|
+
* we supply.
|
|
22
|
+
* 6. Translate the `MethodResult` into an `AuthorizeOutput`:
|
|
23
|
+
* `challenge` (HTTP layer renders), `success` (HTTP layer issues a
|
|
24
|
+
* code immediately — e.g. single-step credential flows), `denied`
|
|
25
|
+
* (OAuth `access_denied`), `error` (propagated).
|
|
26
|
+
*
|
|
27
|
+
* The framework writes / consumes `FlowRecord`. Methods read via
|
|
28
|
+
* `MethodContext.flow` / `methodState` and request state changes via
|
|
29
|
+
* `MethodResult.challenge.saveMethodState`.
|
|
30
|
+
*/
|
|
31
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
32
|
+
import type { KeyStore } from "../ports/key-store";
|
|
33
|
+
import type { SessionStore } from "../ports/session-store";
|
|
34
|
+
import type { TokenStore } from "../ports/token-store";
|
|
35
|
+
import type { AuthError } from "../types/error";
|
|
36
|
+
import type { AuthorizationRequest } from "../types/authorization";
|
|
37
|
+
import type { AnyAuthMethodFactory, SetCookie, CachePolicy } from "../types/method";
|
|
38
|
+
import type { Result } from "../types/result";
|
|
39
|
+
import type { StateKeyRing, TenantContext } from "../types/tenant";
|
|
40
|
+
import { MethodCache } from "./method-cache";
|
|
41
|
+
/** Default 10-minute pre-callback flow lifetime per plan §"TTLs". */
|
|
42
|
+
export declare const DEFAULT_FLOW_TTL_MS: number;
|
|
43
|
+
/**
|
|
44
|
+
* Auth-code lifetime per OAuth 2.1 BCP (`draft-ietf-oauth-v2-1-13` §4.1.3):
|
|
45
|
+
* the framework issues codes with this exact TTL, and every `TokenStore`
|
|
46
|
+
* adapter rejects `saveCode` calls whose `ttl` exceeds it. Treated as
|
|
47
|
+
* both the canonical default and the hard ceiling — there is no
|
|
48
|
+
* separate "max" knob.
|
|
49
|
+
*/
|
|
50
|
+
export declare const AUTH_CODE_TTL_MS: number;
|
|
51
|
+
export type AuthorizeOutput =
|
|
52
|
+
/**
|
|
53
|
+
* Render the method's challenge (UI / redirect). HTTP layer applies
|
|
54
|
+
* cookies. `flowId` is exposed so the HTTP layer can stamp the
|
|
55
|
+
* framework's `idp.flow` cookie — used by credential POSTs (`/m/...`)
|
|
56
|
+
* to identify the in-flight flow without trusting form input, and as
|
|
57
|
+
* defense-in-depth for the OAuth callback path.
|
|
58
|
+
*/
|
|
59
|
+
{
|
|
60
|
+
kind: "challenge";
|
|
61
|
+
response: Response;
|
|
62
|
+
setCookies: SetCookie[];
|
|
63
|
+
flowId: string;
|
|
64
|
+
cache?: CachePolicy;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Method returned synchronous success (e.g. single-step credential flow).
|
|
68
|
+
* The framework has minted an auth code; HTTP layer 302s back to the RP
|
|
69
|
+
* with `code` + `state` in the query.
|
|
70
|
+
*/
|
|
71
|
+
| {
|
|
72
|
+
kind: "issue-code";
|
|
73
|
+
code: string;
|
|
74
|
+
appRedirectUri: string;
|
|
75
|
+
appState: string | null;
|
|
76
|
+
}
|
|
77
|
+
/** Method denied — surface `access_denied` per OAuth 2.1. */
|
|
78
|
+
| {
|
|
79
|
+
kind: "denied";
|
|
80
|
+
reason: string;
|
|
81
|
+
setCookies: SetCookie[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* No `methodId` given and >1 enabled methods configured. HTTP layer
|
|
85
|
+
* renders a selection page that re-requests `/authorize?methodId=…`.
|
|
86
|
+
*/
|
|
87
|
+
| {
|
|
88
|
+
kind: "select-method";
|
|
89
|
+
methods: Array<{
|
|
90
|
+
id: string;
|
|
91
|
+
kind: string;
|
|
92
|
+
type: string;
|
|
93
|
+
}>;
|
|
94
|
+
};
|
|
95
|
+
export type StartAuthorizeInput = {
|
|
96
|
+
request: AuthorizationRequest;
|
|
97
|
+
/** The raw `Request` — handed to the method via `MethodContext.request`. */
|
|
98
|
+
rawRequest: Request;
|
|
99
|
+
tenant: TenantContext;
|
|
100
|
+
cookies: ReadonlyMap<string, string>;
|
|
101
|
+
};
|
|
102
|
+
export type StartAuthorizeDeps = {
|
|
103
|
+
sessionStore: SessionStore;
|
|
104
|
+
tokenStore: TokenStore;
|
|
105
|
+
/** Needed for at-rest encryption of the code payload — see `domain/token.ts`. */
|
|
106
|
+
keyStore: KeyStore;
|
|
107
|
+
auditLog?: AuditLog;
|
|
108
|
+
methodCache: MethodCache;
|
|
109
|
+
stateKeys: StateKeyRing;
|
|
110
|
+
/** Issuer URL — used to build the callback URL and threaded to methods. */
|
|
111
|
+
issuerUrl: string;
|
|
112
|
+
/** Tenant-partitioned callback host helper. Optional (recovery mechanism #2). */
|
|
113
|
+
callbackHostFor?: (tenantId: string) => string;
|
|
114
|
+
clock: () => number;
|
|
115
|
+
/** Override for testability. Defaults to `randomId` / `randomToken`. */
|
|
116
|
+
newFlowId?: () => string;
|
|
117
|
+
newCodeId?: () => string;
|
|
118
|
+
newNonce?: () => string;
|
|
119
|
+
/** Override TTLs. */
|
|
120
|
+
flowTtlMs?: number;
|
|
121
|
+
};
|
|
122
|
+
export declare function startAuthorize(input: StartAuthorizeInput, deps: StartAuthorizeDeps): Promise<Result<AuthorizeOutput, AuthError>>;
|
|
123
|
+
/** Factory map type — exported for HTTP-layer consumers. */
|
|
124
|
+
export type FactoryMap = Record<string, AnyAuthMethodFactory>;
|
|
125
|
+
//# sourceMappingURL=authorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../src/domain/authorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `handleCallback` — process the upstream provider's redirect back to the
|
|
3
|
+
* IdP. The framework:
|
|
4
|
+
*
|
|
5
|
+
* 1. Recovers `(tenantId, flowId)` from the MAC-bound `state` envelope.
|
|
6
|
+
* 2. Atomically `consumeFlow(flowId)` — single delete-on-read, returns
|
|
7
|
+
* the full `FlowRecord`.
|
|
8
|
+
* 3. Runs the **state-flow consistency check** (tenant, nonce, host,
|
|
9
|
+
* path). Any mismatch → `invalid_request` + corresponding audit.
|
|
10
|
+
* 4. Loads tenant config + resolves the method via `MethodCache`.
|
|
11
|
+
* 5. Dispatches the method's `GET /callback` handler.
|
|
12
|
+
* 6. On `success`, snapshots the in-memory `FlowRecord` into the
|
|
13
|
+
* auth-code payload via `TokenStore.saveCode` and returns
|
|
14
|
+
* `issue-code`. `methodState` is NOT snapshotted.
|
|
15
|
+
*
|
|
16
|
+
* Phase 2 implements the `mac-state` recovery only. Recovery mechanisms
|
|
17
|
+
* #2 (partitioned-host) and #3 (`flowId`-in-URI) are wired in Phase 3
|
|
18
|
+
* alongside the HTTP layer that knows the request's host / path /
|
|
19
|
+
* registered redirect URIs.
|
|
20
|
+
*/
|
|
21
|
+
import type { ConfigStore } from "../ports/config-store";
|
|
22
|
+
import type { KeyStore } from "../ports/key-store";
|
|
23
|
+
import type { SessionStore } from "../ports/session-store";
|
|
24
|
+
import type { TokenStore } from "../ports/token-store";
|
|
25
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
26
|
+
import type { AuthError } from "../types/error";
|
|
27
|
+
import type { SetCookie, CachePolicy } from "../types/method";
|
|
28
|
+
import type { Result } from "../types/result";
|
|
29
|
+
import type { StateKeyRing } from "../types/tenant";
|
|
30
|
+
import { MethodCache } from "./method-cache";
|
|
31
|
+
export type CallbackOutput = {
|
|
32
|
+
kind: "issue-code";
|
|
33
|
+
code: string;
|
|
34
|
+
appRedirectUri: string;
|
|
35
|
+
appState: string | null;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "challenge";
|
|
38
|
+
response: Response;
|
|
39
|
+
setCookies: SetCookie[];
|
|
40
|
+
cache?: CachePolicy;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "denied";
|
|
43
|
+
reason: string;
|
|
44
|
+
setCookies: SetCookie[];
|
|
45
|
+
};
|
|
46
|
+
export type HandleCallbackInput = {
|
|
47
|
+
/** The raw `Request` for the upstream provider's redirect. */
|
|
48
|
+
rawRequest: Request;
|
|
49
|
+
cookies: ReadonlyMap<string, string>;
|
|
50
|
+
};
|
|
51
|
+
export type HandleCallbackDeps = {
|
|
52
|
+
configStore: ConfigStore;
|
|
53
|
+
sessionStore: SessionStore;
|
|
54
|
+
tokenStore: TokenStore;
|
|
55
|
+
/** Needed for at-rest encryption of the code payload — see `domain/token.ts`. */
|
|
56
|
+
keyStore: KeyStore;
|
|
57
|
+
auditLog?: AuditLog;
|
|
58
|
+
methodCache: MethodCache;
|
|
59
|
+
stateKeys: StateKeyRing;
|
|
60
|
+
clock: () => number;
|
|
61
|
+
newCodeId?: () => string;
|
|
62
|
+
/**
|
|
63
|
+
* Build the `TenantContext.request.custom` blob. Wired through from
|
|
64
|
+
* `IdPOptions.buildCustomContext` by the HTTP layer; if absent the
|
|
65
|
+
* blob is `{}`.
|
|
66
|
+
*/
|
|
67
|
+
buildCustomContext?: (req: Request) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
68
|
+
};
|
|
69
|
+
export declare function handleCallback(input: HandleCallbackInput, deps: HandleCallbackDeps): Promise<Result<CallbackOutput, AuthError>>;
|
|
70
|
+
//# sourceMappingURL=callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../src/domain/callback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C,OAAO,KAAK,EAAgB,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,iBAAiB,CAAA;AAIlE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAM5C,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAAA;AAE/D,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,iFAAiF;IACjF,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;IACxB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CACnB,GAAG,EAAE,OAAO,KACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAChE,CAAA;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAiG5C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared client-authentication helpers.
|
|
3
|
+
*
|
|
4
|
+
* `/token`, `/revoke`, `/introspect`, and refresh-token rotation all need
|
|
5
|
+
* to validate presented credentials against a `ClientConfig`. The logic is
|
|
6
|
+
* the same in every case:
|
|
7
|
+
*
|
|
8
|
+
* - **Public clients** MUST NOT present a `client_secret` (RFC 6749 §2.3).
|
|
9
|
+
* - **Confidential clients** MUST present a `client_secret`, hashed and
|
|
10
|
+
* compared in constant time against `ClientConfig.secretHash`.
|
|
11
|
+
*
|
|
12
|
+
* Credentials may ride either in the form body (`client_id`,
|
|
13
|
+
* `client_secret`) or in an `Authorization: Basic` header
|
|
14
|
+
* (RFC 6749 §2.3.1). Both encodings are accepted; the header takes
|
|
15
|
+
* precedence when both are present.
|
|
16
|
+
*
|
|
17
|
+
* The hashing function lives in `./token.ts` (`hashClientSecret`) to keep
|
|
18
|
+
* the legacy phase-2 SHA-256 / base64url format in one place; production
|
|
19
|
+
* deployments migrate to argon2id later in the rebuild.
|
|
20
|
+
*/
|
|
21
|
+
import { type AuthError } from "../types/error";
|
|
22
|
+
import type { ClientConfig } from "../types/tenant";
|
|
23
|
+
export type ClientCredentials = {
|
|
24
|
+
/** Client identifier (always present when credentials are presented). */
|
|
25
|
+
clientId: string;
|
|
26
|
+
/** Confidential clients only. */
|
|
27
|
+
clientSecret?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Validate presented credentials against `client`. Returns `null` on
|
|
31
|
+
* success, `AuthError` on rejection.
|
|
32
|
+
*
|
|
33
|
+
* Public clients pass when no secret is presented. Confidential clients
|
|
34
|
+
* require both a secret and a matching `secretHash`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function verifyClientCredentials(client: ClientConfig, presentedSecret: string | undefined): Promise<AuthError | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Parse an `Authorization: Basic <base64>` header.
|
|
39
|
+
*
|
|
40
|
+
* Returns `null` for missing / non-Basic headers and for any decoding
|
|
41
|
+
* failure; callers fall back to form-body credentials.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseBasicAuth(header: string | null): ClientCredentials | null;
|
|
44
|
+
/**
|
|
45
|
+
* Merge form-body credentials with an optional `Authorization: Basic`
|
|
46
|
+
* header. The header wins per RFC 6749 §2.3 when both are present.
|
|
47
|
+
*
|
|
48
|
+
* Returns `null` when neither source supplies a `client_id` — callers
|
|
49
|
+
* then decide whether that's permissible (anonymous revoke is OK; the
|
|
50
|
+
* token endpoint isn't).
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveClientCredentials(input: {
|
|
53
|
+
authorizationHeader: string | null;
|
|
54
|
+
bodyClientId: string | undefined;
|
|
55
|
+
bodyClientSecret: string | undefined;
|
|
56
|
+
}): ClientCredentials | null;
|
|
57
|
+
//# sourceMappingURL=client-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-auth.d.ts","sourceRoot":"","sources":["../../../src/domain/client-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAKnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,YAAY,EACpB,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiB3B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,iBAAiB,GAAG,IAAI,CAqB1B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,GAAG,iBAAiB,GAAG,IAAI,CAU3B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/token` endpoint logic for `grant_type=client_credentials` (RFC 6749 §4.4).
|
|
3
|
+
*
|
|
4
|
+
* Steps:
|
|
5
|
+
* 1. Authenticate the client. Must be confidential and must declare
|
|
6
|
+
* `client_credentials` in `grantTypes`.
|
|
7
|
+
* 2. Resolve the tenant's m2m method. The plan models m2m as a method
|
|
8
|
+
* with a `client` fn and no routes; we look for the unique
|
|
9
|
+
* `type === "m2m"` instance on the tenant. Zero or multiple → error.
|
|
10
|
+
* 3. Call `method.client({ clientID, clientSecret, params })`. On
|
|
11
|
+
* success the method returns the `P` properties it would have
|
|
12
|
+
* emitted on a `success` MethodResult.
|
|
13
|
+
* 4. Invoke the user's `success` callback to mint the subject claim
|
|
14
|
+
* with `methodKind = method.kind`, `methodId = method.id`.
|
|
15
|
+
* 5. `mintTokens` — access token only (no refresh per §4.4.3).
|
|
16
|
+
*
|
|
17
|
+
* The framework rejects requests presenting `scope` beyond what
|
|
18
|
+
* `ClientConfig.scopes` allows.
|
|
19
|
+
*/
|
|
20
|
+
import type { AuditLog } from "../ports/audit-log";
|
|
21
|
+
import type { ConfigStore } from "../ports/config-store";
|
|
22
|
+
import type { KeyStore } from "../ports/key-store";
|
|
23
|
+
import type { TokenStore } from "../ports/token-store";
|
|
24
|
+
import { type AuthError } from "../types/error";
|
|
25
|
+
import type { PersistUpstreamTokens, SuccessMapInput } from "../types/idp";
|
|
26
|
+
import type { Result } from "../types/result";
|
|
27
|
+
import type { SubjectClaim } from "../types/subject";
|
|
28
|
+
import type { TenantId } from "../types/tenant";
|
|
29
|
+
import type { TokenResponse } from "../types/token";
|
|
30
|
+
import { MethodCache } from "./method-cache";
|
|
31
|
+
export type ClientCredentialsRequest = {
|
|
32
|
+
grantType: "client_credentials";
|
|
33
|
+
clientId: string;
|
|
34
|
+
clientSecret: string;
|
|
35
|
+
scope?: string;
|
|
36
|
+
/** Extra params (audience, resource, etc.). Forwarded to `method.client`. */
|
|
37
|
+
params?: Record<string, string>;
|
|
38
|
+
};
|
|
39
|
+
export type ClientCredentialsDeps = {
|
|
40
|
+
configStore: ConfigStore;
|
|
41
|
+
tokenStore: TokenStore;
|
|
42
|
+
keyStore: KeyStore;
|
|
43
|
+
auditLog?: AuditLog;
|
|
44
|
+
methodCache: MethodCache;
|
|
45
|
+
success: (input: SuccessMapInput) => Promise<SubjectClaim>;
|
|
46
|
+
persistUpstreamTokens?: PersistUpstreamTokens;
|
|
47
|
+
issuerUrl: string;
|
|
48
|
+
clock: () => number;
|
|
49
|
+
newRefreshFamily?: () => string;
|
|
50
|
+
/** See `IdPOptions.customScopeClaims`. Forwarded to `mintTokens`. */
|
|
51
|
+
customScopeClaims?: Record<string, ReadonlyArray<string>>;
|
|
52
|
+
};
|
|
53
|
+
export declare function clientCredentialsGrant(req: ClientCredentialsRequest, deps: ClientCredentialsDeps, tenantId: TenantId): Promise<Result<TokenResponse, AuthError>>;
|
|
54
|
+
//# sourceMappingURL=client-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-credentials.d.ts","sourceRoot":"","sources":["../../../src/domain/client-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAKnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,oBAAoB,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1D,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAA;IAC/B,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D,CAAA;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAmH3C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** 256-bit random token, base64url-encoded. ~43 chars. */
|
|
2
|
+
export declare function randomToken(): string;
|
|
3
|
+
/** 128-bit random id, base64url-encoded. ~22 chars. */
|
|
4
|
+
export declare function randomId(): string;
|
|
5
|
+
/** Cryptographic random hex string of `bytes` length. */
|
|
6
|
+
export declare function randomHex(bytes: number): string;
|
|
7
|
+
/** Cryptographic random `Uint8Array` of `bytes` length. */
|
|
8
|
+
export declare function randomBytes(bytes: number): Uint8Array;
|
|
9
|
+
/** Base64url encode raw bytes (jose alias for downstream consistency). */
|
|
10
|
+
export declare const base64url: {
|
|
11
|
+
encode: (data: Uint8Array | string) => string;
|
|
12
|
+
decode: (s: string) => Uint8Array;
|
|
13
|
+
};
|
|
14
|
+
/** UTF-8 helpers. */
|
|
15
|
+
export declare const utf8: {
|
|
16
|
+
encode: (s: string) => Uint8Array;
|
|
17
|
+
decode: (b: Uint8Array) => string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Constant-time byte-array compare. Returns false fast on length mismatch
|
|
21
|
+
* (length itself is not secret), then XORs every byte to avoid early exit.
|
|
22
|
+
*/
|
|
23
|
+
export declare function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
24
|
+
/** Constant-time string compare (UTF-8 bytes). */
|
|
25
|
+
export declare function timingSafeEqualStr(a: string, b: string): boolean;
|
|
26
|
+
/** SHA-256 digest. */
|
|
27
|
+
export declare function sha256(data: Uint8Array | string): Promise<Uint8Array>;
|
|
28
|
+
/** Import a 32-byte HMAC-SHA-256 key for sign/verify use. */
|
|
29
|
+
export declare function importHmacKey(raw: Uint8Array, usage?: ReadonlyArray<"sign" | "verify">): Promise<CryptoKey>;
|
|
30
|
+
/** HMAC-SHA-256 sign. */
|
|
31
|
+
export declare function hmacSign(key: CryptoKey, message: Uint8Array): Promise<Uint8Array>;
|
|
32
|
+
/**
|
|
33
|
+
* HMAC-SHA-256 verify. `crypto.subtle.verify` is timing-safe by spec, which
|
|
34
|
+
* is why we use it instead of recomputing + comparing manually.
|
|
35
|
+
*/
|
|
36
|
+
export declare function hmacVerify(key: CryptoKey, signature: Uint8Array, message: Uint8Array): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Encrypt a JSON-serializable payload with AES-256-GCM under the supplied
|
|
39
|
+
* 256-bit key. Output is a compact JWE string (`{header}.{enc-key}.{iv}.{ct}.{tag}`).
|
|
40
|
+
*
|
|
41
|
+
* Used for `TokenStore.saveCode` — the auth-code payload is encrypted at
|
|
42
|
+
* rest. The compact-JWE format embeds the `kid` so `consumeCode` can pick
|
|
43
|
+
* the right key during overlap rotation.
|
|
44
|
+
*
|
|
45
|
+
* For symmetric direct encryption we use `dir` with `A256GCM`, so the
|
|
46
|
+
* supplied `keyBytes` is the content-encryption key itself.
|
|
47
|
+
*/
|
|
48
|
+
export declare function encryptPayload(payload: unknown, kid: string, keyBytes: Uint8Array): Promise<string>;
|
|
49
|
+
/** Inverse of {@link encryptPayload}. Returns the parsed JSON payload. */
|
|
50
|
+
export declare function decryptPayload<T = unknown>(jwe: string, resolveKey: (kid: string) => Promise<Uint8Array>): Promise<T>;
|
|
51
|
+
/** Generate a fresh 32-byte AES-256 / HMAC-SHA-256 key. */
|
|
52
|
+
export declare function generateSymmetricKey(): Uint8Array;
|
|
53
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/domain/crypto.ts"],"names":[],"mappings":"AAQA,0DAA0D;AAC1D,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAED,uDAAuD;AACvD,wBAAgB,QAAQ,IAAI,MAAM,CAIjC;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAIrD;AAED,0EAA0E;AAC1E,eAAO,MAAM,SAAS;mBACL,UAAU,GAAG,MAAM,KAAG,MAAM;gBAC/B,MAAM,KAAG,UAAU;CAChC,CAAA;AAED,qBAAqB;AACrB,eAAO,MAAM,IAAI;gBACH,MAAM,KAAG,UAAU;gBACnB,UAAU,KAAG,MAAM;CAChC,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAKrE;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,sBAAsB;AACtB,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI3E;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,KAAK,GAAE,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAsB,GAC3D,OAAO,CAAC,SAAS,CAAC,CAQpB;AAED,yBAAyB;AACzB,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAC/C,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,IAAI,UAAU,CAIjD"}
|