@_mustachio/openauth 0.9.1 → 0.10.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 +82 -0
- package/dist/esm/adapters/memory/token-store.js +91 -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 +26 -10
- package/dist/esm/domain/audit.js +13 -0
- package/dist/esm/domain/authorize.js +212 -0
- package/dist/esm/domain/callback.js +173 -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 +41 -0
- package/dist/esm/domain/introspect.js +51 -0
- package/dist/esm/domain/jwt.js +43 -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 +108 -0
- package/dist/esm/domain/pkce.js +16 -0
- package/dist/esm/domain/refresh.js +91 -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 +101 -0
- package/dist/esm/domain/token.js +205 -0
- package/dist/esm/domain/userinfo.js +27 -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 +163 -0
- package/dist/esm/http/handlers/callback.js +53 -0
- package/dist/esm/http/handlers/metadata.js +34 -0
- package/dist/esm/http/handlers/method-route.js +87 -0
- package/dist/esm/http/handlers/revocation.js +98 -0
- package/dist/esm/http/handlers/token.js +167 -0
- package/dist/esm/http/handlers/userinfo.js +54 -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 +35 -0
- package/dist/esm/http/schemas/authorize.js +24 -0
- package/dist/esm/http/schemas/revocation.js +18 -0
- package/dist/esm/http/schemas/token.js +57 -0
- package/dist/esm/index.js +121 -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 +65 -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 +19 -0
- package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/token-store.d.ts +28 -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 +1 -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 +52 -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 +44 -0
- package/dist/types/domain/discovery.d.ts.map +1 -0
- package/dist/types/domain/introspect.d.ts +71 -0
- package/dist/types/domain/introspect.d.ts.map +1 -0
- package/dist/types/domain/jwt.d.ts +48 -0
- package/dist/types/domain/jwt.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/pkce.d.ts +15 -0
- package/dist/types/domain/pkce.d.ts.map +1 -0
- package/dist/types/domain/refresh.d.ts +43 -0
- package/dist/types/domain/refresh.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 +67 -0
- package/dist/types/domain/token-exchange.d.ts.map +1 -0
- package/dist/types/domain/token.d.ts +100 -0
- package/dist/types/domain/token.d.ts.map +1 -0
- package/dist/types/domain/userinfo.d.ts +22 -0
- package/dist/types/domain/userinfo.d.ts.map +1 -0
- package/dist/types/http/context.d.ts +63 -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/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/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 +52 -0
- package/dist/types/http/schemas/authorize.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 +139 -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 +82 -0
- package/dist/types/ports/session-store.d.ts.map +1 -0
- package/dist/types/ports/token-store.d.ts +93 -0
- package/dist/types/ports/token-store.d.ts.map +1 -0
- package/dist/types/types/authorization.d.ts +52 -0
- package/dist/types/types/authorization.d.ts.map +1 -0
- package/dist/types/types/error.d.ts +92 -0
- package/dist/types/types/error.d.ts.map +1 -0
- package/dist/types/types/flow.d.ts +87 -0
- package/dist/types/types/flow.d.ts.map +1 -0
- package/dist/types/types/idp.d.ts +234 -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 +239 -0
- package/dist/types/types/tenant.d.ts.map +1 -0
- package/dist/types/types/token.d.ts +103 -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 +128 -0
- package/src/adapters/memory/token-store.ts +165 -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 +50 -16
- package/src/domain/audit.ts +28 -0
- package/src/domain/authorize.ts +405 -0
- package/src/domain/callback.ts +263 -0
- package/src/domain/client-auth.ts +116 -0
- package/src/domain/client-credentials.ts +178 -0
- package/src/domain/crypto.ts +168 -0
- package/src/domain/discovery.ts +83 -0
- package/src/domain/introspect.ts +145 -0
- package/src/domain/jwt.ts +106 -0
- package/src/domain/method-cache.ts +220 -0
- package/src/domain/method-dispatch.ts +95 -0
- package/src/domain/method-route.ts +208 -0
- package/src/domain/pkce.ts +37 -0
- package/src/domain/refresh.ts +169 -0
- package/src/domain/revoke.ts +161 -0
- package/src/domain/state-envelope.ts +142 -0
- package/src/domain/token-exchange.ts +232 -0
- package/src/domain/token.ts +357 -0
- package/src/domain/userinfo.ts +56 -0
- package/src/http/context.ts +86 -0
- package/src/http/cookies.ts +167 -0
- package/src/http/errors.ts +98 -0
- package/src/http/handlers/authorize.ts +221 -0
- package/src/http/handlers/callback.ts +77 -0
- package/src/http/handlers/metadata.ts +44 -0
- package/src/http/handlers/method-route.ts +115 -0
- package/src/http/handlers/revocation.ts +151 -0
- package/src/http/handlers/token.ts +244 -0
- package/src/http/handlers/userinfo.ts +66 -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 +66 -0
- package/src/http/schemas/authorize.ts +58 -0
- package/src/http/schemas/revocation.ts +23 -0
- package/src/http/schemas/token.ts +85 -0
- package/src/index.ts +266 -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 +88 -0
- package/src/ports/audit-log.ts +148 -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 +98 -0
- package/src/ports/token-store.ts +103 -0
- package/src/types/authorization.ts +53 -0
- package/src/types/error.ts +123 -0
- package/src/types/flow.ts +89 -0
- package/src/types/idp.ts +269 -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 +248 -0
- package/src/types/token.ts +101 -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,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level crypto + encoding helpers used across the domain.
|
|
3
|
+
*
|
|
4
|
+
* Web Crypto only. No `node:*` imports — domain code runs on every runtime
|
|
5
|
+
* we target (Node 18+, Bun, Workers, Lambda).
|
|
6
|
+
*/
|
|
7
|
+
import { base64url as joseB64u, CompactEncrypt, compactDecrypt } from "jose"
|
|
8
|
+
|
|
9
|
+
/** 256-bit random token, base64url-encoded. ~43 chars. */
|
|
10
|
+
export function randomToken(): string {
|
|
11
|
+
const buf = new Uint8Array(32)
|
|
12
|
+
crypto.getRandomValues(buf)
|
|
13
|
+
return joseB64u.encode(buf)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** 128-bit random id, base64url-encoded. ~22 chars. */
|
|
17
|
+
export function randomId(): string {
|
|
18
|
+
const buf = new Uint8Array(16)
|
|
19
|
+
crypto.getRandomValues(buf)
|
|
20
|
+
return joseB64u.encode(buf)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Cryptographic random hex string of `bytes` length. */
|
|
24
|
+
export function randomHex(bytes: number): string {
|
|
25
|
+
const buf = new Uint8Array(bytes)
|
|
26
|
+
crypto.getRandomValues(buf)
|
|
27
|
+
return Array.from(buf, (b) => b.toString(16).padStart(2, "0")).join("")
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Cryptographic random `Uint8Array` of `bytes` length. */
|
|
31
|
+
export function randomBytes(bytes: number): Uint8Array {
|
|
32
|
+
const buf = new Uint8Array(bytes)
|
|
33
|
+
crypto.getRandomValues(buf)
|
|
34
|
+
return buf
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Base64url encode raw bytes (jose alias for downstream consistency). */
|
|
38
|
+
export const base64url = {
|
|
39
|
+
encode: (data: Uint8Array | string): string => joseB64u.encode(data),
|
|
40
|
+
decode: (s: string): Uint8Array => joseB64u.decode(s),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** UTF-8 helpers. */
|
|
44
|
+
export const utf8 = {
|
|
45
|
+
encode: (s: string): Uint8Array => new TextEncoder().encode(s),
|
|
46
|
+
decode: (b: Uint8Array): string => new TextDecoder().decode(b),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Constant-time byte-array compare. Returns false fast on length mismatch
|
|
51
|
+
* (length itself is not secret), then XORs every byte to avoid early exit.
|
|
52
|
+
*/
|
|
53
|
+
export function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {
|
|
54
|
+
if (a.length !== b.length) return false
|
|
55
|
+
let diff = 0
|
|
56
|
+
for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!
|
|
57
|
+
return diff === 0
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Constant-time string compare (UTF-8 bytes). */
|
|
61
|
+
export function timingSafeEqualStr(a: string, b: string): boolean {
|
|
62
|
+
return timingSafeEqual(utf8.encode(a), utf8.encode(b))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** SHA-256 digest. */
|
|
66
|
+
export async function sha256(data: Uint8Array | string): Promise<Uint8Array> {
|
|
67
|
+
const bytes = typeof data === "string" ? utf8.encode(data) : data
|
|
68
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes)
|
|
69
|
+
return new Uint8Array(digest)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Import a 32-byte HMAC-SHA-256 key for sign/verify use. */
|
|
73
|
+
export async function importHmacKey(
|
|
74
|
+
raw: Uint8Array,
|
|
75
|
+
usage: ReadonlyArray<"sign" | "verify"> = ["sign", "verify"],
|
|
76
|
+
): Promise<CryptoKey> {
|
|
77
|
+
return crypto.subtle.importKey(
|
|
78
|
+
"raw",
|
|
79
|
+
raw,
|
|
80
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
81
|
+
false,
|
|
82
|
+
[...usage],
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** HMAC-SHA-256 sign. */
|
|
87
|
+
export async function hmacSign(
|
|
88
|
+
key: CryptoKey,
|
|
89
|
+
message: Uint8Array,
|
|
90
|
+
): Promise<Uint8Array> {
|
|
91
|
+
const sig = await crypto.subtle.sign("HMAC", key, message)
|
|
92
|
+
return new Uint8Array(sig)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* HMAC-SHA-256 verify. `crypto.subtle.verify` is timing-safe by spec, which
|
|
97
|
+
* is why we use it instead of recomputing + comparing manually.
|
|
98
|
+
*/
|
|
99
|
+
export async function hmacVerify(
|
|
100
|
+
key: CryptoKey,
|
|
101
|
+
signature: Uint8Array,
|
|
102
|
+
message: Uint8Array,
|
|
103
|
+
): Promise<boolean> {
|
|
104
|
+
return crypto.subtle.verify("HMAC", key, signature, message)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Encrypt a JSON-serializable payload with AES-256-GCM under the supplied
|
|
109
|
+
* 256-bit key. Output is a compact JWE string (`{header}.{enc-key}.{iv}.{ct}.{tag}`).
|
|
110
|
+
*
|
|
111
|
+
* Used for `TokenStore.saveCode` — the auth-code payload is encrypted at
|
|
112
|
+
* rest. The compact-JWE format embeds the `kid` so `consumeCode` can pick
|
|
113
|
+
* the right key during overlap rotation.
|
|
114
|
+
*
|
|
115
|
+
* For symmetric direct encryption we use `dir` with `A256GCM`, so the
|
|
116
|
+
* supplied `keyBytes` is the content-encryption key itself.
|
|
117
|
+
*/
|
|
118
|
+
export async function encryptPayload(
|
|
119
|
+
payload: unknown,
|
|
120
|
+
kid: string,
|
|
121
|
+
keyBytes: Uint8Array,
|
|
122
|
+
): Promise<string> {
|
|
123
|
+
if (keyBytes.byteLength !== 32) {
|
|
124
|
+
throw new Error(
|
|
125
|
+
`encryptPayload: keyBytes must be 32 bytes (A256GCM); got ${keyBytes.byteLength}`,
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
const cek = await crypto.subtle.importKey(
|
|
129
|
+
"raw",
|
|
130
|
+
keyBytes,
|
|
131
|
+
{ name: "AES-GCM", length: 256 },
|
|
132
|
+
false,
|
|
133
|
+
["encrypt"],
|
|
134
|
+
)
|
|
135
|
+
const json = utf8.encode(JSON.stringify(payload))
|
|
136
|
+
return new CompactEncrypt(json)
|
|
137
|
+
.setProtectedHeader({ alg: "dir", enc: "A256GCM", kid })
|
|
138
|
+
.encrypt(cek)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Inverse of {@link encryptPayload}. Returns the parsed JSON payload. */
|
|
142
|
+
export async function decryptPayload<T = unknown>(
|
|
143
|
+
jwe: string,
|
|
144
|
+
resolveKey: (kid: string) => Promise<Uint8Array>,
|
|
145
|
+
): Promise<T> {
|
|
146
|
+
const { plaintext } = await compactDecrypt(jwe, async (header) => {
|
|
147
|
+
const kid = header.kid
|
|
148
|
+
if (typeof kid !== "string") {
|
|
149
|
+
throw new Error("decryptPayload: missing kid in JWE header")
|
|
150
|
+
}
|
|
151
|
+
const raw = await resolveKey(kid)
|
|
152
|
+
return crypto.subtle.importKey(
|
|
153
|
+
"raw",
|
|
154
|
+
raw,
|
|
155
|
+
{ name: "AES-GCM", length: 256 },
|
|
156
|
+
false,
|
|
157
|
+
["decrypt"],
|
|
158
|
+
)
|
|
159
|
+
})
|
|
160
|
+
return JSON.parse(utf8.decode(plaintext)) as T
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Generate a fresh 32-byte AES-256 / HMAC-SHA-256 key. */
|
|
164
|
+
export function generateSymmetricKey(): Uint8Array {
|
|
165
|
+
const buf = new Uint8Array(32)
|
|
166
|
+
crypto.getRandomValues(buf)
|
|
167
|
+
return buf
|
|
168
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 { err, isErr, ok } from "../types/result"
|
|
11
|
+
|
|
12
|
+
import { buildJwksDocument } from "./jwt"
|
|
13
|
+
|
|
14
|
+
export type DiscoveryDocument = {
|
|
15
|
+
issuer: string
|
|
16
|
+
authorization_endpoint: string
|
|
17
|
+
token_endpoint: string
|
|
18
|
+
userinfo_endpoint: string
|
|
19
|
+
jwks_uri: string
|
|
20
|
+
revocation_endpoint: string
|
|
21
|
+
introspection_endpoint: string
|
|
22
|
+
response_types_supported: string[]
|
|
23
|
+
grant_types_supported: string[]
|
|
24
|
+
subject_types_supported: string[]
|
|
25
|
+
id_token_signing_alg_values_supported: string[]
|
|
26
|
+
scopes_supported: string[]
|
|
27
|
+
token_endpoint_auth_methods_supported: string[]
|
|
28
|
+
code_challenge_methods_supported: string[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type DiscoveryDeps = {
|
|
32
|
+
issuerUrl: string
|
|
33
|
+
/** Override path defaults if mounted under a non-root prefix. */
|
|
34
|
+
paths?: Partial<{
|
|
35
|
+
authorize: string
|
|
36
|
+
token: string
|
|
37
|
+
userinfo: string
|
|
38
|
+
jwks: string
|
|
39
|
+
revoke: string
|
|
40
|
+
introspect: string
|
|
41
|
+
}>
|
|
42
|
+
/** Advertised scopes. Defaults to `["openid", "email", "profile"]`. */
|
|
43
|
+
scopes?: string[]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function buildDiscoveryDocument(deps: DiscoveryDeps): DiscoveryDocument {
|
|
47
|
+
const base = deps.issuerUrl.replace(/\/+$/, "")
|
|
48
|
+
const p = deps.paths ?? {}
|
|
49
|
+
return {
|
|
50
|
+
issuer: deps.issuerUrl,
|
|
51
|
+
authorization_endpoint: `${base}${p.authorize ?? "/authorize"}`,
|
|
52
|
+
token_endpoint: `${base}${p.token ?? "/token"}`,
|
|
53
|
+
userinfo_endpoint: `${base}${p.userinfo ?? "/userinfo"}`,
|
|
54
|
+
jwks_uri: `${base}${p.jwks ?? "/.well-known/jwks.json"}`,
|
|
55
|
+
revocation_endpoint: `${base}${p.revoke ?? "/revoke"}`,
|
|
56
|
+
introspection_endpoint: `${base}${p.introspect ?? "/introspect"}`,
|
|
57
|
+
response_types_supported: ["code"],
|
|
58
|
+
grant_types_supported: [
|
|
59
|
+
"authorization_code",
|
|
60
|
+
"refresh_token",
|
|
61
|
+
"client_credentials",
|
|
62
|
+
],
|
|
63
|
+
subject_types_supported: ["public"],
|
|
64
|
+
id_token_signing_alg_values_supported: ["ES256", "EdDSA"],
|
|
65
|
+
scopes_supported: deps.scopes ?? ["openid", "email", "profile"],
|
|
66
|
+
token_endpoint_auth_methods_supported: [
|
|
67
|
+
"client_secret_basic",
|
|
68
|
+
"client_secret_post",
|
|
69
|
+
"none",
|
|
70
|
+
],
|
|
71
|
+
code_challenge_methods_supported: ["S256"],
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export type JwksDoc = ReturnType<typeof buildJwksDocument>
|
|
76
|
+
|
|
77
|
+
export async function buildJwks(
|
|
78
|
+
keyStore: KeyStore,
|
|
79
|
+
): Promise<Result<JwksDoc, AuthError>> {
|
|
80
|
+
const res = await keyStore.signingKeys()
|
|
81
|
+
if (isErr(res)) return err(res.error)
|
|
82
|
+
return ok(buildJwksDocument(res.value))
|
|
83
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
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 { authError } from "../types/error"
|
|
34
|
+
import type { Result } from "../types/result"
|
|
35
|
+
import { err, isErr, ok } from "../types/result"
|
|
36
|
+
import type { AccessTokenClaims } from "../types/token"
|
|
37
|
+
import type { TenantId } from "../types/tenant"
|
|
38
|
+
|
|
39
|
+
import { verifyClientCredentials } from "./client-auth"
|
|
40
|
+
import { verifyAccessToken } from "./jwt"
|
|
41
|
+
|
|
42
|
+
export type IntrospectResponse =
|
|
43
|
+
| { active: false }
|
|
44
|
+
| {
|
|
45
|
+
active: true
|
|
46
|
+
sub: string
|
|
47
|
+
aud: string
|
|
48
|
+
iss: string
|
|
49
|
+
exp: number
|
|
50
|
+
iat: number
|
|
51
|
+
scope?: string
|
|
52
|
+
client_id?: string
|
|
53
|
+
tid: string
|
|
54
|
+
mid?: string
|
|
55
|
+
mkind?: 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
|
+
|
|
73
|
+
export type IntrospectDeps = {
|
|
74
|
+
keyStore: KeyStore
|
|
75
|
+
configStore: ConfigStore
|
|
76
|
+
/** Expected issuer for additional validation. */
|
|
77
|
+
issuerUrl?: string
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export async function introspect(
|
|
81
|
+
req: IntrospectRequest,
|
|
82
|
+
deps: IntrospectDeps,
|
|
83
|
+
): Promise<Result<IntrospectResponse, AuthError>> {
|
|
84
|
+
// 1. Authenticate the presenting client against its OWN tenant before
|
|
85
|
+
// looking at the token. Failure here = `invalid_client` (RFC 7662
|
|
86
|
+
// §2.1). The presenter's tenant is the only signal we trust until
|
|
87
|
+
// auth succeeds.
|
|
88
|
+
const presenterTenantCfg = await deps.configStore.getTenantConfig(
|
|
89
|
+
req.presenterTenantId,
|
|
90
|
+
)
|
|
91
|
+
if (isErr(presenterTenantCfg)) {
|
|
92
|
+
return err(authError.invalidClient(`unknown client "${req.clientId}"`))
|
|
93
|
+
}
|
|
94
|
+
const presenter = presenterTenantCfg.value.clients.find(
|
|
95
|
+
(c) => c.id === req.clientId,
|
|
96
|
+
)
|
|
97
|
+
if (!presenter) {
|
|
98
|
+
return err(authError.invalidClient(`unknown client "${req.clientId}"`))
|
|
99
|
+
}
|
|
100
|
+
const authErr = await verifyClientCredentials(presenter, req.clientSecret)
|
|
101
|
+
if (authErr) return err(authErr)
|
|
102
|
+
|
|
103
|
+
// 2. Try to verify the token. Unverifiable / wrong issuer / expired →
|
|
104
|
+
// `{active: false}` so a presenter cannot tell the difference
|
|
105
|
+
// between a forged token and a valid one belonging to another
|
|
106
|
+
// tenant or client.
|
|
107
|
+
const keysRes = await deps.keyStore.signingKeys()
|
|
108
|
+
if (isErr(keysRes)) return err(keysRes.error)
|
|
109
|
+
let claims: AccessTokenClaims | null
|
|
110
|
+
try {
|
|
111
|
+
claims = await verifyAccessToken(req.token, keysRes.value, {
|
|
112
|
+
...(deps.issuerUrl ? { issuer: deps.issuerUrl } : {}),
|
|
113
|
+
})
|
|
114
|
+
} catch {
|
|
115
|
+
return ok({ active: false })
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 3. Token's tenant must match the presenter's tenant. RFC 7662 lets
|
|
119
|
+
// us return `{active: false}` here — never a structured error —
|
|
120
|
+
// so a presenter can't probe across tenants. (H6 of the
|
|
121
|
+
// post-rebuild review.)
|
|
122
|
+
if ((claims.tid as TenantId) !== req.presenterTenantId) {
|
|
123
|
+
return ok({ active: false })
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 4. Audience check (RFC 7662 §2.2): only the client the token names
|
|
127
|
+
// as audience may see its claims.
|
|
128
|
+
if (claims.aud !== req.clientId) {
|
|
129
|
+
return ok({ active: false })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return ok({
|
|
133
|
+
active: true,
|
|
134
|
+
sub: claims.sub,
|
|
135
|
+
aud: claims.aud,
|
|
136
|
+
iss: claims.iss,
|
|
137
|
+
exp: claims.exp,
|
|
138
|
+
iat: claims.iat,
|
|
139
|
+
scope: claims.scope,
|
|
140
|
+
client_id: claims.aud,
|
|
141
|
+
tid: claims.tid,
|
|
142
|
+
mid: claims.mid,
|
|
143
|
+
mkind: claims.mkind,
|
|
144
|
+
})
|
|
145
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
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 { importJWK, jwtVerify, SignJWT } from "jose"
|
|
11
|
+
|
|
12
|
+
import type { AccessTokenClaims } from "../types/token"
|
|
13
|
+
import type { SigningKey } from "../ports/key-store"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Sign an access-token claim set under the supplied private key. `kid` is
|
|
17
|
+
* stamped into the JWT header so verifiers can look up the right public
|
|
18
|
+
* key from JWKS.
|
|
19
|
+
*/
|
|
20
|
+
export async function signAccessToken(
|
|
21
|
+
claims: AccessTokenClaims,
|
|
22
|
+
privateKey: KeyLike,
|
|
23
|
+
alg: string,
|
|
24
|
+
kid: string,
|
|
25
|
+
): Promise<string> {
|
|
26
|
+
return new SignJWT(claims as unknown as Record<string, unknown>)
|
|
27
|
+
.setProtectedHeader({ alg, typ: "JWT", kid })
|
|
28
|
+
.sign(privateKey)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Allow-list of asymmetric `alg` values the IdP issues + accepts. */
|
|
32
|
+
const ASYMMETRIC_ALGS: ReadonlySet<string> = new Set(["ES256", "EdDSA"])
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Verify a JWT access token using a list of trusted signing keys (from
|
|
36
|
+
* `KeyStore.signingKeys()`). Looks up by `kid` in the JWT header.
|
|
37
|
+
*
|
|
38
|
+
* Algorithm enforcement: the allow-list is derived from the loaded
|
|
39
|
+
* `SigningKey.alg` values, intersected with the asymmetric allow-list
|
|
40
|
+
* (`ES256`, `EdDSA`). Symmetric (`HS*`) and `none` are filtered out, so a
|
|
41
|
+
* symmetric key accidentally landing in the store does not open an
|
|
42
|
+
* alg-confusion path. The kid resolver also rejects `alg: "none"`
|
|
43
|
+
* explicitly as defense in depth — `jose` already refuses tokens whose
|
|
44
|
+
* header `alg` is outside `algorithms`, but a future call site that
|
|
45
|
+
* dropped the option would still be safe.
|
|
46
|
+
*
|
|
47
|
+
* Returns the typed claims on success. Throws (via `jose`) on any
|
|
48
|
+
* signature, expiry, or alg-mismatch failure — callers wrap in `try` and
|
|
49
|
+
* convert to `Result`.
|
|
50
|
+
*/
|
|
51
|
+
export async function verifyAccessToken(
|
|
52
|
+
token: string,
|
|
53
|
+
keys: ReadonlyArray<SigningKey>,
|
|
54
|
+
options: { issuer?: string; audience?: string } = {},
|
|
55
|
+
): Promise<AccessTokenClaims> {
|
|
56
|
+
const algorithms = Array.from(
|
|
57
|
+
new Set(keys.map((k) => k.alg).filter((a) => ASYMMETRIC_ALGS.has(a))),
|
|
58
|
+
)
|
|
59
|
+
const { payload } = await jwtVerify<AccessTokenClaims>(
|
|
60
|
+
token,
|
|
61
|
+
async (header) => {
|
|
62
|
+
if (!header.alg || header.alg === "none") {
|
|
63
|
+
throw new Error(`verifyAccessToken: refusing alg "${header.alg ?? ""}"`)
|
|
64
|
+
}
|
|
65
|
+
const match = keys.find((k) => k.kid === header.kid)
|
|
66
|
+
if (!match) {
|
|
67
|
+
throw new Error(`verifyAccessToken: unknown kid "${header.kid}"`)
|
|
68
|
+
}
|
|
69
|
+
if (match.alg !== header.alg) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`verifyAccessToken: header.alg "${header.alg}" does not match key alg "${match.alg}"`,
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
const imported = await importJWK(
|
|
75
|
+
match.publicJwk as unknown as JWK,
|
|
76
|
+
match.alg,
|
|
77
|
+
)
|
|
78
|
+
return imported as KeyLike
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
algorithms,
|
|
82
|
+
...(options.issuer ? { issuer: options.issuer } : {}),
|
|
83
|
+
...(options.audience ? { audience: options.audience } : {}),
|
|
84
|
+
},
|
|
85
|
+
)
|
|
86
|
+
return payload
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Build the JWKS document for `/.well-known/jwks.json`. Includes active +
|
|
91
|
+
* recently-rotated keys (the overlap window) so consumers caching JWKS
|
|
92
|
+
* continue to verify tokens signed under a just-retired key until they
|
|
93
|
+
* refresh.
|
|
94
|
+
*/
|
|
95
|
+
export function buildJwksDocument(keys: ReadonlyArray<SigningKey>): {
|
|
96
|
+
keys: JWK[]
|
|
97
|
+
} {
|
|
98
|
+
return {
|
|
99
|
+
keys: keys.map((k) => ({
|
|
100
|
+
...k.publicJwk,
|
|
101
|
+
kid: k.kid,
|
|
102
|
+
alg: k.alg,
|
|
103
|
+
use: "sig",
|
|
104
|
+
})) as JWK[],
|
|
105
|
+
}
|
|
106
|
+
}
|