@estifanos-sh/convex-auth 0.0.1-preview.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/README.md +52 -0
- package/dist/_generated/component.d.ts +2981 -0
- package/dist/bin.js +7194 -0
- package/dist/browser/index.d.ts +22 -0
- package/dist/browser/index.js +61 -0
- package/dist/browser/locks.js +20 -0
- package/dist/browser/navigation.js +14 -0
- package/dist/browser/runtime.js +90 -0
- package/dist/browser/webauthn.js +99 -0
- package/dist/client/core/types.d.ts +615 -0
- package/dist/client/core/types.js +23 -0
- package/dist/client/errors.js +30 -0
- package/dist/client/factors/device.js +100 -0
- package/dist/client/factors/totp.js +111 -0
- package/dist/client/factors/webauthn.js +69 -0
- package/dist/client/index.d.ts +60 -0
- package/dist/client/index.js +976 -0
- package/dist/client/runtime/invite.js +50 -0
- package/dist/client/runtime/mutex.js +25 -0
- package/dist/client/runtime/proxy.js +75 -0
- package/dist/client/runtime/storage.js +65 -0
- package/dist/component/_generated/api.js +26 -0
- package/dist/component/_generated/component.d.ts +2981 -0
- package/dist/component/_generated/component.js +1 -0
- package/dist/component/_generated/dataModel.js +1 -0
- package/dist/component/_generated/server.js +74 -0
- package/dist/component/account.js +197 -0
- package/dist/component/connection/audit.js +152 -0
- package/dist/component/connection/cache.js +205 -0
- package/dist/component/connection/domain/verification.js +63 -0
- package/dist/component/connection/domain.js +108 -0
- package/dist/component/connection/saml/assertion.js +41 -0
- package/dist/component/connection/saml/request.js +61 -0
- package/dist/component/connection/scim/config.js +55 -0
- package/dist/component/connection/scim/identity.js +162 -0
- package/dist/component/connection/secret.js +65 -0
- package/dist/component/connection/webhook/delivery.js +396 -0
- package/dist/component/connection/webhook/endpoint.js +77 -0
- package/dist/component/connection.js +204 -0
- package/dist/component/convex.config.d.ts +7 -0
- package/dist/component/convex.config.js +15 -0
- package/dist/component/crons.js +27 -0
- package/dist/component/event.js +341 -0
- package/dist/component/factor/device.js +141 -0
- package/dist/component/factor/passkey.js +385 -0
- package/dist/component/factor/totp.js +253 -0
- package/dist/component/functions.js +3 -0
- package/dist/component/group/active.js +63 -0
- package/dist/component/group/invite.js +300 -0
- package/dist/component/group/member.js +188 -0
- package/dist/component/group.js +431 -0
- package/dist/component/http.js +9 -0
- package/dist/component/index.d.ts +5 -0
- package/dist/component/index.js +3 -0
- package/dist/component/limits.js +103 -0
- package/dist/component/maintenance.js +205 -0
- package/dist/component/migrations.js +277 -0
- package/dist/component/model.d.ts +384 -0
- package/dist/component/model.js +709 -0
- package/dist/component/modules.js +53 -0
- package/dist/component/oauth/client.js +196 -0
- package/dist/component/oauth/code.js +97 -0
- package/dist/component/oauth/refresh.js +230 -0
- package/dist/component/schema.d.ts +1530 -0
- package/dist/component/schema.js +401 -0
- package/dist/component/session.js +134 -0
- package/dist/component/token/pkce.js +121 -0
- package/dist/component/token/refresh.js +189 -0
- package/dist/component/token/verification.js +155 -0
- package/dist/component/user/email.js +147 -0
- package/dist/component/user/key.js +273 -0
- package/dist/component/user.js +173 -0
- package/dist/core/index.d.ts +531 -0
- package/dist/core/index.js +81 -0
- package/dist/expo/index.d.ts +43 -0
- package/dist/expo/index.js +131 -0
- package/dist/expo/webauthn.js +88 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/NoopLogger.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/index.d.ts +7 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/AnyValue.d.ts +21 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LogRecord.d.ts +36 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/Logger.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerOptions.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/propagation/W3CBaggagePropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/time.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/index.d.ts +13 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/TraceState.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/W3CTraceContextPropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/utils/configuration.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LogRecordProcessor.d.ts +24 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/config/LoggerConfigurators.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/BatchLogRecordProcessorBase.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ConsoleLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/InMemoryLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/LogRecordExporter.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ReadableLogRecord.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SdkLogRecord.d.ts +71 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SimpleLogRecordProcessor.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/BatchLogRecordProcessor.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/InstrumentDescriptor.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/MeterProvider.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Drop.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/ExponentialHistogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Histogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/LastValue.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Sum.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts +6 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts +53 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationSelector.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/CardinalitySelector.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/ConsoleMetricExporter.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/InMemoryMetricExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricData.d.ts +148 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricProducer.d.ts +27 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricReader.d.ts +138 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/PeriodicExportingMetricReader.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts +15 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/Aggregation.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AggregationOption.d.ts +41 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AttributesProcessor.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/InstrumentSelector.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/View.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/BasicTracerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/IdGenerator.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Sampler.d.ts +74 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Span.d.ts +17 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/SpanProcessor.d.ts +43 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/TimedEvent.d.ts +19 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/BatchSpanProcessorBase.d.ts +6 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ConsoleSpanExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/InMemorySpanExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/NoopSpanProcessor.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ReadableSpan.d.ts +29 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SimpleSpanProcessor.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SpanExporter.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts +18 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/BatchSpanProcessor.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOffSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOnSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/ParentBasedSampler.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/TraceIdRatioBasedSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts +66 -0
- package/dist/otel.d.ts +73 -0
- package/dist/otel.js +82 -0
- package/dist/permissions/index.d.ts +81 -0
- package/dist/permissions/index.js +18 -0
- package/dist/providers/anonymous.d.ts +35 -0
- package/dist/providers/anonymous.js +40 -0
- package/dist/providers/apple.d.ts +61 -0
- package/dist/providers/apple.js +57 -0
- package/dist/providers/connection.d.ts +30 -0
- package/dist/providers/connection.js +33 -0
- package/dist/providers/credentials.d.ts +78 -0
- package/dist/providers/credentials.js +31 -0
- package/dist/providers/custom.d.ts +96 -0
- package/dist/providers/custom.js +108 -0
- package/dist/providers/device.d.ts +33 -0
- package/dist/providers/device.js +30 -0
- package/dist/providers/email.d.ts +45 -0
- package/dist/providers/email.js +52 -0
- package/dist/providers/github.d.ts +56 -0
- package/dist/providers/github.js +79 -0
- package/dist/providers/google.d.ts +56 -0
- package/dist/providers/google.js +59 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.js +16 -0
- package/dist/providers/microsoft.d.ts +59 -0
- package/dist/providers/microsoft.js +98 -0
- package/dist/providers/password.d.ts +68 -0
- package/dist/providers/password.js +348 -0
- package/dist/providers/phone.d.ts +33 -0
- package/dist/providers/phone.js +35 -0
- package/dist/providers/redirect.d.ts +1 -0
- package/dist/providers/redirect.js +11 -0
- package/dist/providers/totp.d.ts +29 -0
- package/dist/providers/totp.js +29 -0
- package/dist/providers/webauthn/attestation.d.ts +42 -0
- package/dist/providers/webauthn/attestation.js +167 -0
- package/dist/providers/webauthn.d.ts +83 -0
- package/dist/providers/webauthn.js +57 -0
- package/dist/react/index.d.ts +55 -0
- package/dist/react/index.js +80 -0
- package/dist/server/auth.d.ts +443 -0
- package/dist/server/auth.js +178 -0
- package/dist/server/cache/context.js +94 -0
- package/dist/server/component/api.d.ts +14 -0
- package/dist/server/component/api.js +13 -0
- package/dist/server/component/context.d.ts +16 -0
- package/dist/server/component/context.js +1 -0
- package/dist/server/component/factor/db.js +71 -0
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.js +78 -0
- package/dist/server/connection/config.js +101 -0
- package/dist/server/connection/domain.d.ts +878 -0
- package/dist/server/connection/domain.js +1122 -0
- package/dist/server/connection/group/service.d.ts +25 -0
- package/dist/server/connection/group/service.js +250 -0
- package/dist/server/connection/http.js +1485 -0
- package/dist/server/connection/oidc.js +366 -0
- package/dist/server/connection/policy/domain.js +59 -0
- package/dist/server/connection/policy.d.ts +1 -0
- package/dist/server/connection/policy.js +163 -0
- package/dist/server/connection/profile.js +22 -0
- package/dist/server/connection/provision.js +182 -0
- package/dist/server/connection/saml/api.js +70 -0
- package/dist/server/connection/saml/binding/post.js +140 -0
- package/dist/server/connection/saml/binding/redirect.js +139 -0
- package/dist/server/connection/saml/binding/shared.js +18 -0
- package/dist/server/connection/saml/c14n.js +224 -0
- package/dist/server/connection/saml/constants.js +100 -0
- package/dist/server/connection/saml/crypto.js +170 -0
- package/dist/server/connection/saml/dom/select.js +299 -0
- package/dist/server/connection/saml/encoding.js +93 -0
- package/dist/server/connection/saml/encryption.js +34 -0
- package/dist/server/connection/saml/entity.js +24 -0
- package/dist/server/connection/saml/extractor.js +408 -0
- package/dist/server/connection/saml/flow.js +150 -0
- package/dist/server/connection/saml/identity/provider.js +66 -0
- package/dist/server/connection/saml/index.js +5 -0
- package/dist/server/connection/saml/metadata.js +294 -0
- package/dist/server/connection/saml/service/provider.js +117 -0
- package/dist/server/connection/saml/signature.js +214 -0
- package/dist/server/connection/saml/template.js +68 -0
- package/dist/server/connection/saml/types.js +1 -0
- package/dist/server/connection/saml/validator.js +32 -0
- package/dist/server/connection/saml/xml/builder.js +68 -0
- package/dist/server/connection/saml/xmldsig.js +598 -0
- package/dist/server/connection/saml/xmlenc.js +162 -0
- package/dist/server/connection/saml.d.ts +56 -0
- package/dist/server/connection/saml.js +762 -0
- package/dist/server/connection/scim.js +115 -0
- package/dist/server/connection/shared.js +74 -0
- package/dist/server/connection/webhook.js +163 -0
- package/dist/server/context.d.ts +137 -0
- package/dist/server/context.js +108 -0
- package/dist/server/contract.d.ts +48 -0
- package/dist/server/contract.js +107 -0
- package/dist/server/cookies.js +90 -0
- package/dist/server/core.js +163 -0
- package/dist/server/cors.d.ts +22 -0
- package/dist/server/cors.js +93 -0
- package/dist/server/crypto.js +43 -0
- package/dist/server/db.js +88 -0
- package/dist/server/device.js +140 -0
- package/dist/server/domains/access.js +29 -0
- package/dist/server/domains/account.d.ts +16 -0
- package/dist/server/domains/account.js +92 -0
- package/dist/server/domains/factor.d.ts +28 -0
- package/dist/server/domains/factor.js +115 -0
- package/dist/server/domains/group.js +87 -0
- package/dist/server/domains/invite.js +76 -0
- package/dist/server/domains/key.js +253 -0
- package/dist/server/domains/member.js +149 -0
- package/dist/server/domains/session.js +29 -0
- package/dist/server/domains/user.js +119 -0
- package/dist/server/env.d.ts +46 -0
- package/dist/server/env.js +96 -0
- package/dist/server/errors.js +38 -0
- package/dist/server/events.d.ts +880 -0
- package/dist/server/events.js +406 -0
- package/dist/server/facade.d.ts +83 -0
- package/dist/server/facade.js +124 -0
- package/dist/server/http.d.ts +125 -0
- package/dist/server/http.js +566 -0
- package/dist/server/identity/claims.js +58 -0
- package/dist/server/identity/convex.d.ts +15 -0
- package/dist/server/identity/convex.js +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.js +11 -0
- package/dist/server/keys.js +60 -0
- package/dist/server/limits.js +41 -0
- package/dist/server/log.js +28 -0
- package/dist/server/mcp.d.ts +19 -0
- package/dist/server/mcp.js +250 -0
- package/dist/server/mutations/account.js +47 -0
- package/dist/server/mutations/calls.js +16 -0
- package/dist/server/mutations/code.js +91 -0
- package/dist/server/mutations/credentials/signin.js +210 -0
- package/dist/server/mutations/invalidate.js +60 -0
- package/dist/server/mutations/oauth.js +251 -0
- package/dist/server/mutations/refresh.js +152 -0
- package/dist/server/mutations/register.js +93 -0
- package/dist/server/mutations/retrieve.js +66 -0
- package/dist/server/mutations/signature.js +36 -0
- package/dist/server/mutations/signin.js +81 -0
- package/dist/server/mutations/signout.js +61 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store.js +82 -0
- package/dist/server/mutations/verifier.js +25 -0
- package/dist/server/mutations/verify.js +199 -0
- package/dist/server/oauth/authorize.js +98 -0
- package/dist/server/oauth/client.d.ts +93 -0
- package/dist/server/oauth/client.js +115 -0
- package/dist/server/oauth/code.d.ts +63 -0
- package/dist/server/oauth/code.js +124 -0
- package/dist/server/oauth/domain.d.ts +23 -0
- package/dist/server/oauth/domain.js +1 -0
- package/dist/server/oauth/factory.js +46 -0
- package/dist/server/oauth/grant.js +46 -0
- package/dist/server/oauth/handlers.js +108 -0
- package/dist/server/oauth/manage.js +121 -0
- package/dist/server/oauth/normalize.js +27 -0
- package/dist/server/oauth/refresh.d.ts +71 -0
- package/dist/server/oauth/refresh.js +132 -0
- package/dist/server/oauth/register.js +147 -0
- package/dist/server/oauth/runtime.js +280 -0
- package/dist/server/oauth/token.js +355 -0
- package/dist/server/payloads.d.ts +16 -0
- package/dist/server/payloads.js +30 -0
- package/dist/server/preload.d.ts +249 -0
- package/dist/server/preload.js +673 -0
- package/dist/server/random.js +25 -0
- package/dist/server/redirects.js +85 -0
- package/dist/server/runtime.d.ts +845 -0
- package/dist/server/runtime.js +387 -0
- package/dist/server/secret.js +46 -0
- package/dist/server/services/factors.js +117 -0
- package/dist/server/services/providers.js +23 -0
- package/dist/server/services/resolve.js +17 -0
- package/dist/server/session/lifecycle.d.ts +23 -0
- package/dist/server/session/lifecycle.js +139 -0
- package/dist/server/signin/flow.js +359 -0
- package/dist/server/telemetry.js +68 -0
- package/dist/server/templates.js +91 -0
- package/dist/server/token/refresh.js +35 -0
- package/dist/server/tokens.js +164 -0
- package/dist/server/totp.js +282 -0
- package/dist/server/types.d.ts +1154 -0
- package/dist/server/types.js +1 -0
- package/dist/server/url.js +43 -0
- package/dist/server/user/account.js +325 -0
- package/dist/server/utils/bearer.js +24 -0
- package/dist/server/utils/cache.js +51 -0
- package/dist/server/utils/retry.js +3 -0
- package/dist/server/utils/span.js +59 -0
- package/dist/server/validators.d.ts +2061 -0
- package/dist/server/validators.js +320 -0
- package/dist/server/webauthn.js +699 -0
- package/dist/server/wellknown.d.ts +74 -0
- package/dist/server/wellknown.js +195 -0
- package/dist/shared/brand.d.ts +28 -0
- package/dist/shared/brand.js +13 -0
- package/dist/shared/codes.d.ts +99 -0
- package/dist/shared/codes.js +98 -0
- package/dist/shared/compare.js +23 -0
- package/dist/shared/errors.js +24 -0
- package/dist/shared/event/kinds.d.ts +188 -0
- package/dist/shared/event/kinds.js +103 -0
- package/dist/shared/fetch/guard.js +189 -0
- package/dist/shared/log.js +62 -0
- package/dist/shared/results.d.ts +58 -0
- package/dist/shared/retry.js +27 -0
- package/dist/shared/webauthn.js +9 -0
- package/dist/svelte/AuthLoading.svelte +13 -0
- package/dist/svelte/AuthLoading.svelte.d.ts +8 -0
- package/dist/svelte/SignedIn.svelte +14 -0
- package/dist/svelte/SignedIn.svelte.d.ts +8 -0
- package/dist/svelte/SignedOut.svelte +13 -0
- package/dist/svelte/SignedOut.svelte.d.ts +8 -0
- package/dist/svelte/context.svelte.d.ts +26 -0
- package/dist/svelte/context.svelte.js +61 -0
- package/dist/svelte/index.d.ts +5 -0
- package/dist/svelte/index.js +4 -0
- package/dist/test.d.ts +48 -0
- package/dist/test.js +54 -0
- package/package.json +247 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { checkOAuthGrant } from "./grant.js";
|
|
2
|
+
|
|
3
|
+
//#region src/server/oauth/authorize.ts
|
|
4
|
+
function jsonError(status, error, description) {
|
|
5
|
+
return new Response(JSON.stringify({
|
|
6
|
+
error,
|
|
7
|
+
error_description: description
|
|
8
|
+
}), {
|
|
9
|
+
status,
|
|
10
|
+
headers: { "Content-Type": "application/json" }
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate an RFC 8707 `resource` indicator: it must be an absolute URI with an
|
|
15
|
+
* `http`/`https` scheme and no fragment. The value is an audience identifier for
|
|
16
|
+
* the protected resource (e.g. the MCP endpoint URL), not a fetch target.
|
|
17
|
+
*
|
|
18
|
+
* @see https://www.rfc-editor.org/rfc/rfc8707
|
|
19
|
+
*/
|
|
20
|
+
function isValidResourceIndicator(resource) {
|
|
21
|
+
let url;
|
|
22
|
+
try {
|
|
23
|
+
url = new URL(resource);
|
|
24
|
+
} catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (url.hash !== "") return false;
|
|
28
|
+
return url.protocol === "https:" || url.protocol === "http:";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Redirect an OAuth error back to a registered `redirect_uri`. The parse is
|
|
32
|
+
* guarded so a malformed (yet registered) URI yields a 400 rather than a 500.
|
|
33
|
+
*/
|
|
34
|
+
function oauthError(redirectUri, error, state) {
|
|
35
|
+
try {
|
|
36
|
+
const url = new URL(redirectUri);
|
|
37
|
+
url.searchParams.set("error", error);
|
|
38
|
+
if (state) url.searchParams.set("state", state);
|
|
39
|
+
return Response.redirect(url.toString(), 302);
|
|
40
|
+
} catch {
|
|
41
|
+
return jsonError(400, "invalid_request", "Invalid redirect_uri.");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build the `GET /oauth2/authorize` request handler.
|
|
46
|
+
*
|
|
47
|
+
* The client and `redirect_uri` registration are validated before any redirect:
|
|
48
|
+
* an unknown client or unregistered `redirect_uri` yields a direct error
|
|
49
|
+
* response, never a redirect, to avoid an open redirect (RFC 6749 §3.1.2.4,
|
|
50
|
+
* RFC 9700). Only once `redirect_uri` is a registered value are subsequent
|
|
51
|
+
* validation failures surfaced back via redirect. Requires PKCE `S256`. The
|
|
52
|
+
* client-grant predicate is shared with the consent mutation and token endpoint
|
|
53
|
+
* via {@link checkOAuthGrant}; only the error formatting differs per boundary.
|
|
54
|
+
*
|
|
55
|
+
* @see https://www.rfc-editor.org/rfc/rfc6749#section-3.1.2.4
|
|
56
|
+
* @see https://www.rfc-editor.org/rfc/rfc9700
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
function createAuthorizeHandler(deps) {
|
|
60
|
+
return async (ctx, request) => {
|
|
61
|
+
const p = new URL(request.url).searchParams;
|
|
62
|
+
const clientId = p.get("client_id");
|
|
63
|
+
const redirectUri = p.get("redirect_uri");
|
|
64
|
+
const responseType = p.get("response_type");
|
|
65
|
+
const scope = p.get("scope") ?? "";
|
|
66
|
+
const state = p.get("state");
|
|
67
|
+
const codeChallenge = p.get("code_challenge");
|
|
68
|
+
const codeChallengeMethod = p.get("code_challenge_method");
|
|
69
|
+
const resource = p.get("resource");
|
|
70
|
+
if (!clientId || !redirectUri || !codeChallenge) return jsonError(400, "invalid_request", "Missing required parameter.");
|
|
71
|
+
const check = checkOAuthGrant({
|
|
72
|
+
client: await deps.getClient(ctx, clientId),
|
|
73
|
+
grantType: "authorization_code",
|
|
74
|
+
redirectUri,
|
|
75
|
+
requestedScopes: scope ? scope.split(" ").filter(Boolean) : []
|
|
76
|
+
});
|
|
77
|
+
if (!check.ok && check.denial.reason === "client_not_found") return jsonError(401, "invalid_client", "Unknown or inactive client.");
|
|
78
|
+
if (!check.ok && check.denial.reason === "redirect_uri_mismatch") return jsonError(400, "invalid_request", "redirect_uri mismatch.");
|
|
79
|
+
if (responseType !== "code") return oauthError(redirectUri, "unsupported_response_type", state);
|
|
80
|
+
if (codeChallengeMethod !== "S256") return oauthError(redirectUri, "invalid_request", state);
|
|
81
|
+
if (!check.ok && check.denial.reason === "grant_type_not_allowed") return oauthError(redirectUri, "unauthorized_client", state);
|
|
82
|
+
if (!check.ok && check.denial.reason === "scope_not_allowed") return oauthError(redirectUri, "invalid_scope", state);
|
|
83
|
+
if (resource !== null && !isValidResourceIndicator(resource)) return oauthError(redirectUri, "invalid_target", state);
|
|
84
|
+
const authorizeUrl = new URL(deps.consentPage, deps.authSiteUrl());
|
|
85
|
+
authorizeUrl.searchParams.set("client_id", clientId);
|
|
86
|
+
authorizeUrl.searchParams.set("scope", scope);
|
|
87
|
+
authorizeUrl.searchParams.set("redirect_uri", redirectUri);
|
|
88
|
+
authorizeUrl.searchParams.set("code_challenge", codeChallenge);
|
|
89
|
+
authorizeUrl.searchParams.set("code_challenge_method", "S256");
|
|
90
|
+
if (state) authorizeUrl.searchParams.set("state", state);
|
|
91
|
+
if (resource !== null) authorizeUrl.searchParams.set("resource", resource);
|
|
92
|
+
return Response.redirect(authorizeUrl.toString(), 302);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
export { createAuthorizeHandler };
|
|
98
|
+
//# sourceMappingURL=authorize.js.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { vOAuthClientDoc } from "../../component/model.js";
|
|
2
|
+
import "../component/api.js";
|
|
3
|
+
import { ComponentCtx, ComponentReadCtx } from "../component/context.js";
|
|
4
|
+
import "../config.js";
|
|
5
|
+
import { Infer } from "convex/values";
|
|
6
|
+
import { PaginationResult } from "convex/server";
|
|
7
|
+
|
|
8
|
+
//#region src/server/oauth/client.d.ts
|
|
9
|
+
/**
|
|
10
|
+
* An OAuth client document crossing the component boundary — the single source
|
|
11
|
+
* of truth is `vOAuthClientDoc`. `clientSecretHash` is present iff the client is
|
|
12
|
+
* confidential (server-side only).
|
|
13
|
+
*/
|
|
14
|
+
type OAuthClientDoc = Infer<typeof vOAuthClientDoc>;
|
|
15
|
+
/** Token-endpoint auth method stored on a client; `none` marks a public client. */
|
|
16
|
+
type OAuthTokenEndpointAuthMethod = NonNullable<OAuthClientDoc["tokenEndpointAuthMethod"]>;
|
|
17
|
+
/** Fields accepted when registering a client (the `data` payload). */
|
|
18
|
+
type OAuthClientData = {
|
|
19
|
+
name: string;
|
|
20
|
+
redirectUris: string[];
|
|
21
|
+
scopes: string[];
|
|
22
|
+
grantTypes?: string[];
|
|
23
|
+
tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;
|
|
24
|
+
createdBy?: string;
|
|
25
|
+
extend?: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
/** Mutable client metadata replaced by an RFC 7592 `PUT` (none of it secret). */
|
|
28
|
+
type OAuthClientUpdate = {
|
|
29
|
+
name?: string;
|
|
30
|
+
redirectUris?: string[];
|
|
31
|
+
scopes?: string[];
|
|
32
|
+
grantTypes?: string[];
|
|
33
|
+
tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;
|
|
34
|
+
};
|
|
35
|
+
/** Public API surface for the OAuth client sub-domain. */
|
|
36
|
+
interface OAuthClientDomain {
|
|
37
|
+
/** Register a new OAuth client. Returns the public `clientId`, the one-time
|
|
38
|
+
* `clientSecret` (`cs_*`, omitted for public `none` clients), and the
|
|
39
|
+
* one-time RFC 7592 `registrationAccessToken` (`reg_*`) used to manage it.
|
|
40
|
+
* Store the secrets securely — they cannot be retrieved later. */
|
|
41
|
+
create(ctx: ComponentCtx, args: {
|
|
42
|
+
data: OAuthClientData;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
clientId: string;
|
|
45
|
+
clientSecret?: string;
|
|
46
|
+
registrationAccessToken: string;
|
|
47
|
+
tokenEndpointAuthMethod: OAuthTokenEndpointAuthMethod;
|
|
48
|
+
}>;
|
|
49
|
+
/** Fetch a client by its public `clientId`. Returns `null` if not found. */
|
|
50
|
+
get(ctx: ComponentReadCtx, args: {
|
|
51
|
+
clientId: string;
|
|
52
|
+
}): Promise<OAuthClientDoc | null>;
|
|
53
|
+
/** Replace a client's mutable registration metadata (RFC 7592 `PUT`). The
|
|
54
|
+
* caller is responsible for validating the patch (redirect-uri rules, scope
|
|
55
|
+
* clamping) before calling. */
|
|
56
|
+
update(ctx: ComponentCtx, args: {
|
|
57
|
+
clientId: string;
|
|
58
|
+
patch: OAuthClientUpdate;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
/** Verify an RFC 7592 registration access token against the client named by
|
|
61
|
+
* `clientId`. Returns the client doc on a constant-time hash match, else
|
|
62
|
+
* `null` (unknown/revoked client, or no/again-mismatched token). */
|
|
63
|
+
verifyRegistrationToken(ctx: ComponentReadCtx, args: {
|
|
64
|
+
clientId: string;
|
|
65
|
+
token: string;
|
|
66
|
+
}): Promise<OAuthClientDoc | null>;
|
|
67
|
+
/** List clients, optionally filtered by creator. Excludes revoked by default. */
|
|
68
|
+
list(ctx: ComponentReadCtx, args?: {
|
|
69
|
+
where?: {
|
|
70
|
+
createdBy?: string;
|
|
71
|
+
includeRevoked?: boolean;
|
|
72
|
+
};
|
|
73
|
+
paginationOpts?: {
|
|
74
|
+
numItems: number;
|
|
75
|
+
cursor: string | null;
|
|
76
|
+
};
|
|
77
|
+
}): Promise<PaginationResult<OAuthClientDoc>>;
|
|
78
|
+
/** Soft-revoke a client. Revoked clients can no longer obtain tokens. */
|
|
79
|
+
revoke(ctx: ComponentCtx, args: {
|
|
80
|
+
clientId: string;
|
|
81
|
+
}): Promise<{
|
|
82
|
+
clientId: string;
|
|
83
|
+
}>;
|
|
84
|
+
/** Verify a client secret against the stored hash. Returns the client doc
|
|
85
|
+
* on success, `null` on mismatch or if the client is revoked. */
|
|
86
|
+
verify(ctx: ComponentReadCtx, args: {
|
|
87
|
+
clientId: string;
|
|
88
|
+
clientSecret: string;
|
|
89
|
+
}): Promise<OAuthClientDoc | null>;
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { OAuthClientDomain };
|
|
93
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { constantTimeEqualHex } from "../../shared/compare.js";
|
|
2
|
+
import { cached, invalidateCtxCache } from "../cache/context.js";
|
|
3
|
+
import { generateRandomString } from "../random.js";
|
|
4
|
+
import { emitAuthEvent } from "../events.js";
|
|
5
|
+
import { generateApiKey, hashApiKey } from "../keys.js";
|
|
6
|
+
|
|
7
|
+
//#region src/server/oauth/client.ts
|
|
8
|
+
const CLIENT_ID_ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
9
|
+
const CLIENT_ID_LENGTH = 24;
|
|
10
|
+
/** @internal */
|
|
11
|
+
function createOAuthClientDomain(deps) {
|
|
12
|
+
const component = deps.component;
|
|
13
|
+
return {
|
|
14
|
+
async create(ctx, { data }) {
|
|
15
|
+
const clientId = "oc_" + generateRandomString(CLIENT_ID_LENGTH, CLIENT_ID_ALPHABET);
|
|
16
|
+
const tokenEndpointAuthMethod = data.tokenEndpointAuthMethod ?? "client_secret_post";
|
|
17
|
+
const secret = tokenEndpointAuthMethod === "none" ? null : await generateApiKey("cs_");
|
|
18
|
+
const { raw: registrationAccessToken, hashedKey: registrationAccessTokenHash } = await generateApiKey("reg_");
|
|
19
|
+
await ctx.runMutation(component.oauth.client.create, {
|
|
20
|
+
clientId,
|
|
21
|
+
clientSecretHash: secret?.hashedKey,
|
|
22
|
+
tokenEndpointAuthMethod,
|
|
23
|
+
registrationAccessTokenHash,
|
|
24
|
+
name: data.name,
|
|
25
|
+
redirectUris: data.redirectUris,
|
|
26
|
+
scopes: data.scopes,
|
|
27
|
+
grantTypes: data.grantTypes ?? ["authorization_code", "refresh_token"],
|
|
28
|
+
createdBy: data.createdBy,
|
|
29
|
+
extend: data.extend
|
|
30
|
+
});
|
|
31
|
+
await emitAuthEvent(ctx, deps, {
|
|
32
|
+
kind: "oauth.client.created",
|
|
33
|
+
actor: data.createdBy ? {
|
|
34
|
+
type: "user",
|
|
35
|
+
id: data.createdBy
|
|
36
|
+
} : { type: "system" },
|
|
37
|
+
subject: {
|
|
38
|
+
type: "oauth_client",
|
|
39
|
+
id: clientId
|
|
40
|
+
},
|
|
41
|
+
targets: [{
|
|
42
|
+
kind: "oauth_client",
|
|
43
|
+
id: clientId
|
|
44
|
+
}, ...data.createdBy ? [{
|
|
45
|
+
kind: "user",
|
|
46
|
+
id: data.createdBy
|
|
47
|
+
}] : []],
|
|
48
|
+
outcome: "success",
|
|
49
|
+
data: {
|
|
50
|
+
clientId,
|
|
51
|
+
name: data.name,
|
|
52
|
+
scopes: data.scopes
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
clientId,
|
|
57
|
+
clientSecret: secret?.raw,
|
|
58
|
+
registrationAccessToken,
|
|
59
|
+
tokenEndpointAuthMethod
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
async get(ctx, { clientId }) {
|
|
63
|
+
return await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
|
|
64
|
+
},
|
|
65
|
+
async list(ctx, args) {
|
|
66
|
+
return await ctx.runQuery(component.oauth.client.list, {
|
|
67
|
+
where: args?.where,
|
|
68
|
+
paginationOpts: args?.paginationOpts ?? {
|
|
69
|
+
numItems: 50,
|
|
70
|
+
cursor: null
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
async revoke(ctx, { clientId }) {
|
|
75
|
+
await ctx.runMutation(component.oauth.client.revoke, { clientId });
|
|
76
|
+
invalidateCtxCache(ctx, `oauth-client:${clientId}`);
|
|
77
|
+
await emitAuthEvent(ctx, deps, {
|
|
78
|
+
kind: "oauth.client.revoked",
|
|
79
|
+
actor: { type: "system" },
|
|
80
|
+
subject: {
|
|
81
|
+
type: "oauth_client",
|
|
82
|
+
id: clientId
|
|
83
|
+
},
|
|
84
|
+
targets: [{
|
|
85
|
+
kind: "oauth_client",
|
|
86
|
+
id: clientId
|
|
87
|
+
}],
|
|
88
|
+
outcome: "success",
|
|
89
|
+
data: { clientId }
|
|
90
|
+
});
|
|
91
|
+
return { clientId };
|
|
92
|
+
},
|
|
93
|
+
async update(ctx, { clientId, patch }) {
|
|
94
|
+
await ctx.runMutation(component.oauth.client.update, {
|
|
95
|
+
clientId,
|
|
96
|
+
patch
|
|
97
|
+
});
|
|
98
|
+
invalidateCtxCache(ctx, `oauth-client:${clientId}`);
|
|
99
|
+
},
|
|
100
|
+
async verify(ctx, { clientId, clientSecret }) {
|
|
101
|
+
const doc = await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
|
|
102
|
+
if (!doc || doc.revoked || doc.tokenEndpointAuthMethod === "none" || !doc.clientSecretHash) return null;
|
|
103
|
+
return constantTimeEqualHex(await hashApiKey(clientSecret), doc.clientSecretHash) ? doc : null;
|
|
104
|
+
},
|
|
105
|
+
async verifyRegistrationToken(ctx, { clientId, token }) {
|
|
106
|
+
const doc = await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
|
|
107
|
+
if (!doc || doc.revoked || !doc.registrationAccessTokenHash) return null;
|
|
108
|
+
return constantTimeEqualHex(await hashApiKey(token), doc.registrationAccessTokenHash) ? doc : null;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//#endregion
|
|
114
|
+
export { createOAuthClientDomain };
|
|
115
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { vOAuthCodeDoc } from "../../component/model.js";
|
|
2
|
+
import { ComponentCtx } from "../component/context.js";
|
|
3
|
+
import { Infer } from "convex/values";
|
|
4
|
+
|
|
5
|
+
//#region src/server/oauth/code.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Stored authorization-code grant consumed at the token endpoint — derived from
|
|
8
|
+
* `vOAuthCodeDoc` (the single source of truth) so it never drifts from storage.
|
|
9
|
+
*/
|
|
10
|
+
type OAuthCodeRecord = Infer<typeof vOAuthCodeDoc>;
|
|
11
|
+
/** Public API surface for the OAuth authorization-code sub-domain. */
|
|
12
|
+
interface OAuthCodeDomain {
|
|
13
|
+
/**
|
|
14
|
+
* Record a user's approval of a client's access request and mint a single-use
|
|
15
|
+
* authorization code (plain returned, hash stored). Validates the client grant
|
|
16
|
+
* via the shared {@link checkOAuthGrant} predicate, inserts an `OAuthCode` with
|
|
17
|
+
* the PKCE challenge and TTL, and emits `oauth.code.created`.
|
|
18
|
+
*
|
|
19
|
+
* Call this from an app mutation after confirming the user's intent on the
|
|
20
|
+
* consent page. `userId` MUST be the authenticated caller resolved via
|
|
21
|
+
* `ctx.auth.getUserIdentity()` — never a value from request input, or a client
|
|
22
|
+
* could mint codes for arbitrary users.
|
|
23
|
+
*/
|
|
24
|
+
authorize(ctx: ComponentCtx, args: {
|
|
25
|
+
userId: string;
|
|
26
|
+
clientId: string;
|
|
27
|
+
scopes: string[];
|
|
28
|
+
redirectUri: string;
|
|
29
|
+
codeChallenge: string;
|
|
30
|
+
resource?: string;
|
|
31
|
+
state?: string | null;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
code: string;
|
|
34
|
+
redirectUri: string;
|
|
35
|
+
state?: string | null;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Accept (consume) a single-use authorization code by its hash, enforcing the
|
|
39
|
+
* `clientId`, `redirectUri`, and PKCE `codeChallenge` bindings in-transaction.
|
|
40
|
+
* Returns the grant, or `null` if the hash is unknown or any binding fails (the
|
|
41
|
+
* code is NOT burned). Throws `OAUTH_CODE_ALREADY_USED` on replay /
|
|
42
|
+
* `OAUTH_CODE_EXPIRED` if stale.
|
|
43
|
+
*
|
|
44
|
+
* When `refresh` is supplied, its grant + token are minted in the SAME
|
|
45
|
+
* transaction that consumes the code, so a refresh-creation failure rolls back
|
|
46
|
+
* the code consumption too (the caller can retry) instead of burning the code
|
|
47
|
+
* and returning an access token with no refresh token. The caller generates the
|
|
48
|
+
* refresh secret (CSPRNG requires an action); only its `tokenHash` is passed.
|
|
49
|
+
*/
|
|
50
|
+
accept(ctx: ComponentCtx, args: {
|
|
51
|
+
codeHash: string;
|
|
52
|
+
clientId: string;
|
|
53
|
+
redirectUri: string;
|
|
54
|
+
codeChallenge: string;
|
|
55
|
+
refresh?: {
|
|
56
|
+
tokenHash: string;
|
|
57
|
+
expiresAt: number;
|
|
58
|
+
};
|
|
59
|
+
}): Promise<OAuthCodeRecord | null>;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { OAuthCodeDomain };
|
|
63
|
+
//# sourceMappingURL=code.d.ts.map
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { ErrorCode } from "../../shared/codes.js";
|
|
2
|
+
import { cached } from "../cache/context.js";
|
|
3
|
+
import { generateRandomString, sha256 } from "../random.js";
|
|
4
|
+
import { emitAuthEvent } from "../events.js";
|
|
5
|
+
import { checkOAuthGrant } from "./grant.js";
|
|
6
|
+
import { ConvexError } from "convex/values";
|
|
7
|
+
|
|
8
|
+
//#region src/server/oauth/code.ts
|
|
9
|
+
const CODE_LENGTH = 32;
|
|
10
|
+
const CODE_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
11
|
+
const CODE_TTL_MS = 120 * 1e3;
|
|
12
|
+
/** Map a grant denial to a `ConvexError` for the post-consent (mutation) boundary. */
|
|
13
|
+
const GRANT_ERROR = {
|
|
14
|
+
client_not_found: {
|
|
15
|
+
code: ErrorCode.OAUTH_CLIENT_NOT_FOUND,
|
|
16
|
+
message: "Unknown or inactive OAuth client."
|
|
17
|
+
},
|
|
18
|
+
redirect_uri_mismatch: {
|
|
19
|
+
code: ErrorCode.OAUTH_REDIRECT_URI_MISMATCH,
|
|
20
|
+
message: "redirect_uri not registered for this client."
|
|
21
|
+
},
|
|
22
|
+
grant_type_not_allowed: {
|
|
23
|
+
code: ErrorCode.OAUTH_GRANT_TYPE_NOT_ALLOWED,
|
|
24
|
+
message: "authorization_code grant is not allowed for this client."
|
|
25
|
+
},
|
|
26
|
+
scope_not_allowed: {
|
|
27
|
+
code: ErrorCode.OAUTH_SCOPE_NOT_ALLOWED,
|
|
28
|
+
message: "Scope not permitted for this client."
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function oauthGrantConvexError(denial) {
|
|
32
|
+
return new ConvexError(GRANT_ERROR[denial.reason]);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Harden the library boundary for {@link OAuthCodeDomain.authorize}: the minted
|
|
36
|
+
* authorization code is bound to `userId`, so that id MUST be the authenticated
|
|
37
|
+
* caller — never a value taken from request input, or a client could mint codes
|
|
38
|
+
* for arbitrary users. Resolve the caller from `ctx.auth.getUserIdentity()` and
|
|
39
|
+
* reject unless its subject matches the passed `userId`.
|
|
40
|
+
*
|
|
41
|
+
* `ComponentCtx` is typed only for `runQuery`/`runMutation`, but the documented
|
|
42
|
+
* caller is an authenticated app mutation whose ctx carries `auth`; so the
|
|
43
|
+
* identity is read defensively. A ctx that exposes no identity capability, an
|
|
44
|
+
* unauthenticated caller, or a subject mismatch all fail closed.
|
|
45
|
+
*/
|
|
46
|
+
async function assertAuthorizeCallerMatchesUser(ctx, userId) {
|
|
47
|
+
const auth = ctx.auth;
|
|
48
|
+
const identity = typeof auth?.getUserIdentity === "function" ? await auth.getUserIdentity() : void 0;
|
|
49
|
+
if (!identity || identity.subject !== userId) throw new ConvexError({
|
|
50
|
+
code: ErrorCode.NOT_AUTHORIZED,
|
|
51
|
+
message: "oauth.authorize must be called by the authenticated user it authorizes; resolve `userId` from ctx.auth.getUserIdentity() rather than request input."
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** @internal */
|
|
55
|
+
function createOAuthCodeDomain(deps) {
|
|
56
|
+
const component = deps.component;
|
|
57
|
+
return {
|
|
58
|
+
async authorize(ctx, args) {
|
|
59
|
+
await assertAuthorizeCallerMatchesUser(ctx, args.userId);
|
|
60
|
+
const check = checkOAuthGrant({
|
|
61
|
+
client: await cached(ctx, `oauth-client:${args.clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId: args.clientId })),
|
|
62
|
+
grantType: "authorization_code",
|
|
63
|
+
redirectUri: args.redirectUri,
|
|
64
|
+
requestedScopes: args.scopes
|
|
65
|
+
});
|
|
66
|
+
if (!check.ok) throw oauthGrantConvexError(check.denial);
|
|
67
|
+
const rawCode = generateRandomString(CODE_LENGTH, CODE_ALPHABET);
|
|
68
|
+
const codeHash = await sha256(rawCode);
|
|
69
|
+
await ctx.runMutation(component.oauth.code.create, {
|
|
70
|
+
codeHash,
|
|
71
|
+
userId: args.userId,
|
|
72
|
+
clientId: args.clientId,
|
|
73
|
+
redirectUri: args.redirectUri,
|
|
74
|
+
scopes: args.scopes,
|
|
75
|
+
codeChallenge: args.codeChallenge,
|
|
76
|
+
resource: args.resource,
|
|
77
|
+
expiresAt: Date.now() + CODE_TTL_MS
|
|
78
|
+
});
|
|
79
|
+
await emitAuthEvent(ctx, deps, {
|
|
80
|
+
kind: "oauth.code.created",
|
|
81
|
+
actor: {
|
|
82
|
+
type: "user",
|
|
83
|
+
id: args.userId
|
|
84
|
+
},
|
|
85
|
+
subject: {
|
|
86
|
+
type: "oauth_code",
|
|
87
|
+
id: codeHash
|
|
88
|
+
},
|
|
89
|
+
targets: [{
|
|
90
|
+
kind: "oauth_client",
|
|
91
|
+
id: args.clientId
|
|
92
|
+
}, {
|
|
93
|
+
kind: "user",
|
|
94
|
+
id: args.userId
|
|
95
|
+
}],
|
|
96
|
+
outcome: "success",
|
|
97
|
+
data: {
|
|
98
|
+
clientId: args.clientId,
|
|
99
|
+
codeId: codeHash,
|
|
100
|
+
scopes: args.scopes,
|
|
101
|
+
redirectUri: args.redirectUri
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
code: rawCode,
|
|
106
|
+
redirectUri: args.redirectUri,
|
|
107
|
+
state: args.state
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
async accept(ctx, { codeHash, clientId, redirectUri, codeChallenge, refresh }) {
|
|
111
|
+
return await ctx.runMutation(component.oauth.code.accept, {
|
|
112
|
+
codeHash,
|
|
113
|
+
clientId,
|
|
114
|
+
redirectUri,
|
|
115
|
+
codeChallenge,
|
|
116
|
+
...refresh === void 0 ? {} : { refresh }
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//#endregion
|
|
123
|
+
export { createOAuthCodeDomain };
|
|
124
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OAuthClientDomain } from "./client.js";
|
|
2
|
+
import { OAuthCodeDomain } from "./code.js";
|
|
3
|
+
import { OAuthRefreshDomain } from "./refresh.js";
|
|
4
|
+
|
|
5
|
+
//#region src/server/oauth/domain.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* The full `auth.oauth` runtime surface (app-as-IdP; LEXICON §8a). Pins every
|
|
8
|
+
* namespace to its domain interface, the way `connection`/`event` are pinned in
|
|
9
|
+
* the auth runtime, so the surface is documented in one place and never drifts.
|
|
10
|
+
*/
|
|
11
|
+
interface OAuthRuntimeDomain {
|
|
12
|
+
/** OAuth client registry: `create`/`get`/`list`/`revoke`/`verify`. */
|
|
13
|
+
client: OAuthClientDomain;
|
|
14
|
+
/** Authorization-code lifecycle: `authorize` (mint) + `accept` (consume). */
|
|
15
|
+
code: OAuthCodeDomain;
|
|
16
|
+
/** Rotating refresh tokens: `create`/`exchange`/`revoke`. */
|
|
17
|
+
refresh: OAuthRefreshDomain;
|
|
18
|
+
/** Consent shortcut — alias of `code.authorize`; preserves `auth.oauth.authorize(ctx, …)`. */
|
|
19
|
+
authorize: OAuthCodeDomain["authorize"];
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { OAuthRuntimeDomain };
|
|
23
|
+
//# sourceMappingURL=domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { normalizeOAuthTokenResponse } from "./normalize.js";
|
|
2
|
+
|
|
3
|
+
//#region src/server/oauth/factory.ts
|
|
4
|
+
function normalizeTokens(tokens) {
|
|
5
|
+
return normalizeOAuthTokenResponse(tokens.data);
|
|
6
|
+
}
|
|
7
|
+
function createArcticOAuthClient(provider, options) {
|
|
8
|
+
const getProvider = (redirectUri) => typeof provider === "function" ? provider(redirectUri) : provider;
|
|
9
|
+
const pkce = options?.pkce ?? (getProvider().createAuthorizationURL.length >= 3 ? "required" : "never");
|
|
10
|
+
return {
|
|
11
|
+
pkce,
|
|
12
|
+
createAuthorizationURL({ state, codeVerifier, scopes, nonce, redirectUri }) {
|
|
13
|
+
const provider$1 = getProvider(redirectUri);
|
|
14
|
+
const url = pkce !== "never" ? provider$1.createAuthorizationURL(state, codeVerifier, scopes) : provider$1.createAuthorizationURL(state, scopes);
|
|
15
|
+
if (nonce !== void 0) url.searchParams.set("nonce", nonce);
|
|
16
|
+
return url;
|
|
17
|
+
},
|
|
18
|
+
async validateAuthorizationCode({ code, codeVerifier, redirectUri }) {
|
|
19
|
+
const provider$1 = getProvider(redirectUri);
|
|
20
|
+
return normalizeTokens(pkce !== "never" ? await provider$1.validateAuthorizationCode(code, codeVerifier) : await provider$1.validateAuthorizationCode(code));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Materialize a validated OAuth provider definition for internal auth runtime use.
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
function createOAuthProvider(config) {
|
|
30
|
+
if (!config.provider || typeof config.provider.createAuthorizationURL !== "function" || typeof config.provider.validateAuthorizationCode !== "function") throw new Error(`OAuth provider "${config.id}" must expose createAuthorizationURL() and validateAuthorizationCode().`);
|
|
31
|
+
return {
|
|
32
|
+
id: config.id,
|
|
33
|
+
type: "oauth",
|
|
34
|
+
provider: config.provider,
|
|
35
|
+
scopes: [...config.scopes],
|
|
36
|
+
profile: config.profile,
|
|
37
|
+
nonce: config.nonce,
|
|
38
|
+
validateTokens: config.validateTokens,
|
|
39
|
+
accountLinking: config.accountLinking,
|
|
40
|
+
updateProfileOnLogin: config.updateProfileOnLogin
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { createArcticOAuthClient, createOAuthProvider };
|
|
46
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/server/oauth/grant.ts
|
|
2
|
+
/**
|
|
3
|
+
* The single source of truth for "client active, redirect_uri registered, grant
|
|
4
|
+
* type allowed, requested scopes ⊆ client.scopes". Pure — the caller loads
|
|
5
|
+
* `client` through its own trust path (cached `getClient`, or `verifyClientSecret`)
|
|
6
|
+
* and formats `denial` per its boundary; the security checks are NOT collapsed,
|
|
7
|
+
* only the duplicated predicate.
|
|
8
|
+
*
|
|
9
|
+
* Check order is fixed (client → redirect_uri → grant_type → scope), matching
|
|
10
|
+
* what all three call sites already do. `redirectUri` is omitted for grants
|
|
11
|
+
* without a redirect (`client_credentials`). On success, `scopes` is the
|
|
12
|
+
* resolved effective set: the requested scopes, or — when `requestedScopes` is
|
|
13
|
+
* empty and `grantType` is `client_credentials` — the client's full set.
|
|
14
|
+
*/
|
|
15
|
+
function checkOAuthGrant(args) {
|
|
16
|
+
const { client, grantType, redirectUri, requestedScopes } = args;
|
|
17
|
+
if (!client || client.revoked) return {
|
|
18
|
+
ok: false,
|
|
19
|
+
denial: { reason: "client_not_found" }
|
|
20
|
+
};
|
|
21
|
+
if (redirectUri !== void 0 && !client.redirectUris.includes(redirectUri)) return {
|
|
22
|
+
ok: false,
|
|
23
|
+
denial: { reason: "redirect_uri_mismatch" }
|
|
24
|
+
};
|
|
25
|
+
if (!client.grantTypes.includes(grantType)) return {
|
|
26
|
+
ok: false,
|
|
27
|
+
denial: { reason: "grant_type_not_allowed" }
|
|
28
|
+
};
|
|
29
|
+
const disallowed = requestedScopes.filter((s) => !client.scopes.includes(s));
|
|
30
|
+
if (disallowed.length > 0) return {
|
|
31
|
+
ok: false,
|
|
32
|
+
denial: {
|
|
33
|
+
reason: "scope_not_allowed",
|
|
34
|
+
disallowed
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
ok: true,
|
|
39
|
+
client,
|
|
40
|
+
scopes: requestedScopes.length > 0 ? requestedScopes : grantType === "client_credentials" ? client.scopes : requestedScopes
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { checkOAuthGrant };
|
|
46
|
+
//# sourceMappingURL=grant.js.map
|