@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,35 @@
|
|
|
1
|
+
import { ErrorCode } from "../../shared/codes.js";
|
|
2
|
+
import { envOptionalNumber, readConfigSync } from "../env.js";
|
|
3
|
+
import { maybeRedact } from "../log.js";
|
|
4
|
+
import { ConvexError } from "convex/values";
|
|
5
|
+
|
|
6
|
+
//#region src/server/token/refresh.ts
|
|
7
|
+
const REFRESH_TOKEN_DIVIDER = "|";
|
|
8
|
+
/** @internal Encode the `(refreshTokenId, sessionId)` pair into a refresh token. */
|
|
9
|
+
const encodeRefreshToken = (refreshTokenId, sessionId) => `${refreshTokenId}${REFRESH_TOKEN_DIVIDER}${sessionId}`;
|
|
10
|
+
const DEFAULT_SESSION_INACTIVE_DURATION_MS = 1e3 * 60 * 60 * 24 * 30;
|
|
11
|
+
/** @internal */
|
|
12
|
+
const REFRESH_TOKEN_REUSE_WINDOW_MS = 10 * 1e3;
|
|
13
|
+
const refreshTokenExpirationTime = (config, now = Date.now()) => now + (config.session?.inactiveDurationMs ?? readConfigSync(envOptionalNumber("AUTH_SESSION_INACTIVE_DURATION_MS")) ?? DEFAULT_SESSION_INACTIVE_DURATION_MS);
|
|
14
|
+
/** @internal */
|
|
15
|
+
const parseRefreshToken = (refreshToken) => {
|
|
16
|
+
const parts = refreshToken.split(REFRESH_TOKEN_DIVIDER);
|
|
17
|
+
const message = `Can't parse refresh token: ${maybeRedact(refreshToken)}`;
|
|
18
|
+
if (parts.length !== 2) throw new ConvexError({
|
|
19
|
+
code: ErrorCode.INVALID_REFRESH_TOKEN,
|
|
20
|
+
message
|
|
21
|
+
});
|
|
22
|
+
const [refreshTokenId, sessionId] = parts;
|
|
23
|
+
if (refreshTokenId == null || sessionId == null) throw new ConvexError({
|
|
24
|
+
code: ErrorCode.INVALID_REFRESH_TOKEN,
|
|
25
|
+
message
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
refreshTokenId,
|
|
29
|
+
sessionId
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
export { REFRESH_TOKEN_REUSE_WINDOW_MS, encodeRefreshToken, parseRefreshToken, refreshTokenExpirationTime };
|
|
35
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { envOptionalString, requireEnv } from "./env.js";
|
|
2
|
+
import { authUrlFromEnv } from "./url.js";
|
|
3
|
+
import { generateRandomString } from "./random.js";
|
|
4
|
+
import { withSpan } from "./utils/span.js";
|
|
5
|
+
import { SignJWT, createLocalJWKSet, importPKCS8, jwtVerify } from "jose";
|
|
6
|
+
|
|
7
|
+
//#region src/server/tokens.ts
|
|
8
|
+
const DEFAULT_JWT_DURATION_MS = 1e3 * 60 * 60;
|
|
9
|
+
const TOKEN_JTI_LENGTH = 24;
|
|
10
|
+
const TOKEN_JTI_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
11
|
+
let cachedPrivateKeyPromise = null;
|
|
12
|
+
const cachedIssuers = /* @__PURE__ */ new Map();
|
|
13
|
+
const JWT_ALG = "EdDSA";
|
|
14
|
+
function normalizePkcs8Pem(value) {
|
|
15
|
+
const trimmed = value.trim();
|
|
16
|
+
if (!trimmed.includes("-----BEGIN PRIVATE KEY-----")) return trimmed;
|
|
17
|
+
const withEscapedNewlines = trimmed.replace(/\\n/g, "\n");
|
|
18
|
+
if (withEscapedNewlines.includes("\n")) return withEscapedNewlines;
|
|
19
|
+
const beginMarker = "-----BEGIN PRIVATE KEY-----";
|
|
20
|
+
const endMarker = "-----END PRIVATE KEY-----";
|
|
21
|
+
const body = trimmed.replace(beginMarker, "").replace(endMarker, "").trim().replace(/\s+/g, "");
|
|
22
|
+
if (body.length === 0) return trimmed;
|
|
23
|
+
return `${beginMarker}\n${body.match(/.{1,64}/g)?.join("\n") ?? body}\n${endMarker}`;
|
|
24
|
+
}
|
|
25
|
+
const getPrivateKey = () => {
|
|
26
|
+
if (cachedPrivateKeyPromise === null) try {
|
|
27
|
+
cachedPrivateKeyPromise = importPKCS8(normalizePkcs8Pem(requireEnv("JWT_PRIVATE_KEY")), JWT_ALG).catch((error) => {
|
|
28
|
+
cachedPrivateKeyPromise = null;
|
|
29
|
+
throw error;
|
|
30
|
+
});
|
|
31
|
+
} catch (error) {
|
|
32
|
+
cachedPrivateKeyPromise = null;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
return cachedPrivateKeyPromise;
|
|
36
|
+
};
|
|
37
|
+
const getIssuer = (path) => {
|
|
38
|
+
const key = path ?? "";
|
|
39
|
+
let issuer = cachedIssuers.get(key);
|
|
40
|
+
if (issuer === void 0) {
|
|
41
|
+
issuer = authUrlFromEnv(path);
|
|
42
|
+
cachedIssuers.set(key, issuer);
|
|
43
|
+
}
|
|
44
|
+
return issuer;
|
|
45
|
+
};
|
|
46
|
+
if (envOptionalString("JWT_PRIVATE_KEY")) try {
|
|
47
|
+
getPrivateKey().catch((err) => {
|
|
48
|
+
console.error("[auth] JWT private key pre-warm failed", { err });
|
|
49
|
+
});
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error("[auth] JWT private key pre-warm threw synchronously", { err });
|
|
52
|
+
}
|
|
53
|
+
if (envOptionalString("CONVEX_SITE_URL")) try {
|
|
54
|
+
getIssuer();
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.error("[auth] JWT issuer pre-warm threw", { err });
|
|
57
|
+
}
|
|
58
|
+
/** Lifetime of an issued OAuth access token, in seconds. Shared with the token endpoint's `expires_in`. */
|
|
59
|
+
const OAUTH_ACCESS_TOKEN_DURATION_S = 900;
|
|
60
|
+
/**
|
|
61
|
+
* Sign an OAuth access token (EdDSA) for the given user, client, and scopes.
|
|
62
|
+
*
|
|
63
|
+
* The `aud` claim is `"convex"` so the token is a valid Convex identity
|
|
64
|
+
* (`applicationID: "convex"`) — load-bearing: MCP tools run the user's queries
|
|
65
|
+
* via `ctx.runQuery`, which requires Convex's identity layer to accept this
|
|
66
|
+
* token. For that reason the access token must look like an ID-token-shaped JWT:
|
|
67
|
+
* it carries NO `typ: "at+jwt"` header (Convex's validator rejects that RFC 9068
|
|
68
|
+
* type), and is instead marked as an access token by a positive `token_use:
|
|
69
|
+
* "access"` claim, which `verifyOAuthToken` checks (alongside the `client_id`
|
|
70
|
+
* claim) to tell it apart from a session token. We don't issue OIDC ID tokens,
|
|
71
|
+
* so there is no id-vs-access confusion for the `at+jwt` typ to guard against.
|
|
72
|
+
*
|
|
73
|
+
* When an RFC 8707 `resource` is supplied the token carries a `resource` claim
|
|
74
|
+
* binding it to that protected resource; an MCP endpoint rejects tokens whose
|
|
75
|
+
* `resource` does not match its own canonical resource.
|
|
76
|
+
*
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
async function generateOAuthToken(args) {
|
|
80
|
+
const privateKey = await withSpan("convex-auth.tokens.import-key", { alg: JWT_ALG }, () => getPrivateKey());
|
|
81
|
+
const exp = new Date(Date.now() + OAUTH_ACCESS_TOKEN_DURATION_S * 1e3);
|
|
82
|
+
return await withSpan("convex-auth.tokens.sign-oauth", { alg: JWT_ALG }, () => new SignJWT({
|
|
83
|
+
sub: args.userId,
|
|
84
|
+
aud: "convex",
|
|
85
|
+
token_use: "access",
|
|
86
|
+
scope: args.scopes.join(" "),
|
|
87
|
+
client_id: args.clientId,
|
|
88
|
+
...args.resource !== void 0 ? { resource: args.resource } : null
|
|
89
|
+
}).setProtectedHeader({ alg: JWT_ALG }).setIssuedAt().setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET)).setIssuer(args.issuer ?? getIssuer()).setExpirationTime(exp).sign(privateKey));
|
|
90
|
+
}
|
|
91
|
+
let cachedKeySet = null;
|
|
92
|
+
/**
|
|
93
|
+
* The local JWKS keyset, built once and reused. The `JWKS` env is static per
|
|
94
|
+
* deployment, so caching also preserves jose's internal imported-key cache
|
|
95
|
+
* across requests rather than re-importing keys on every verification.
|
|
96
|
+
*/
|
|
97
|
+
function getJwkSet() {
|
|
98
|
+
if (cachedKeySet === null) cachedKeySet = createLocalJWKSet(JSON.parse(requireEnv("JWKS")));
|
|
99
|
+
return cachedKeySet;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Verify an OAuth access token against the local JWKS and issuer.
|
|
103
|
+
*
|
|
104
|
+
* When `opts.resource` is supplied, the token's RFC 8707 `resource` claim must
|
|
105
|
+
* equal it exactly — a token bound to a different (or no) resource is rejected.
|
|
106
|
+
* This is how an MCP endpoint enforces that a token was issued for *it*.
|
|
107
|
+
*
|
|
108
|
+
* @returns The token's user, client, scopes, and bound `resource`, or `null` if
|
|
109
|
+
* verification fails, the token is not an OAuth access token, or the resource
|
|
110
|
+
* assertion does not hold.
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
async function verifyOAuthToken(token, opts) {
|
|
114
|
+
try {
|
|
115
|
+
const { payload } = await jwtVerify(token, getJwkSet(), {
|
|
116
|
+
issuer: opts?.issuer ?? getIssuer(),
|
|
117
|
+
audience: "convex",
|
|
118
|
+
algorithms: [JWT_ALG],
|
|
119
|
+
clockTolerance: 30
|
|
120
|
+
});
|
|
121
|
+
if (payload.token_use !== "access") return null;
|
|
122
|
+
const userId = payload.sub;
|
|
123
|
+
const clientId = payload.client_id;
|
|
124
|
+
const scope = payload.scope ?? "";
|
|
125
|
+
if (!userId || !clientId) return null;
|
|
126
|
+
const resourceClaim = payload.resource;
|
|
127
|
+
const resource = typeof resourceClaim === "string" ? resourceClaim : null;
|
|
128
|
+
if (opts?.resource !== void 0 && resource !== opts.resource) return null;
|
|
129
|
+
return {
|
|
130
|
+
userId,
|
|
131
|
+
clientId,
|
|
132
|
+
scopes: scope ? scope.split(" ") : [],
|
|
133
|
+
resource
|
|
134
|
+
};
|
|
135
|
+
} catch {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Sign a session access token (EdDSA) carrying the identity claims, audienced to Convex.
|
|
141
|
+
*
|
|
142
|
+
* Expiry is `config.jwt.durationMs` from now, defaulting to one hour.
|
|
143
|
+
*
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
async function generateToken(args, config) {
|
|
147
|
+
const privateKey = await withSpan("convex-auth.tokens.import-key", { alg: JWT_ALG }, () => getPrivateKey());
|
|
148
|
+
const expirationTime = new Date(Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS));
|
|
149
|
+
const claims = {
|
|
150
|
+
sub: args.identity.subject,
|
|
151
|
+
sid: args.identity.sessionId,
|
|
152
|
+
...args.identity.name !== void 0 ? { name: args.identity.name } : null,
|
|
153
|
+
...args.identity.email !== void 0 ? { email: args.identity.email } : null,
|
|
154
|
+
...args.identity.emailVerified !== void 0 ? { email_verified: args.identity.emailVerified } : null,
|
|
155
|
+
...args.identity.picture !== void 0 ? { picture: args.identity.picture } : null,
|
|
156
|
+
...args.identity.phoneNumber !== void 0 ? { phone_number: args.identity.phoneNumber } : null,
|
|
157
|
+
...args.identity.phoneNumberVerified !== void 0 ? { phone_number_verified: args.identity.phoneNumberVerified } : null
|
|
158
|
+
};
|
|
159
|
+
return await withSpan("convex-auth.tokens.sign", { alg: JWT_ALG }, () => new SignJWT(claims).setProtectedHeader({ alg: JWT_ALG }).setIssuedAt().setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET)).setIssuer(getIssuer(config.path)).setAudience("convex").setExpirationTime(expirationTime).sign(privateKey));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
//#endregion
|
|
163
|
+
export { OAUTH_ACCESS_TOKEN_DURATION_S, generateOAuthToken, generateToken, verifyOAuthToken };
|
|
164
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { ErrorCode } from "../shared/codes.js";
|
|
2
|
+
import { getAuthenticatedUserIdOrNull } from "./identity/claims.js";
|
|
3
|
+
import { queueAuthEvent } from "./events.js";
|
|
4
|
+
import { encodeRefreshToken, refreshTokenExpirationTime } from "./token/refresh.js";
|
|
5
|
+
import { setActiveSpanAttributes } from "./utils/span.js";
|
|
6
|
+
import { buildSessionIdentity, finalizeSessionIssuance, getAuthSessionId, sessionExpirationTime } from "./session/lifecycle.js";
|
|
7
|
+
import { authFlowError } from "../shared/errors.js";
|
|
8
|
+
import { toConvexError } from "./errors.js";
|
|
9
|
+
import { maxSignInAttempts } from "./limits.js";
|
|
10
|
+
import { buildKnownSignInIdentityAttributes } from "./telemetry.js";
|
|
11
|
+
import { decryptSecret, encryptSecret } from "./secret.js";
|
|
12
|
+
import { ConvexError } from "convex/values";
|
|
13
|
+
import { decodeBase64urlIgnorePadding, encodeBase32LowerCaseNoPadding, encodeBase64urlNoPadding } from "@oslojs/encoding";
|
|
14
|
+
import { createTOTPKeyURI, verifyTOTPWithGracePeriod } from "@oslojs/otp";
|
|
15
|
+
|
|
16
|
+
//#region src/server/totp.ts
|
|
17
|
+
/**
|
|
18
|
+
* Server-side TOTP ceremony logic for two-factor authentication.
|
|
19
|
+
*
|
|
20
|
+
* Two single-word flows:
|
|
21
|
+
*
|
|
22
|
+
* - `setup` — generate a TOTP secret and `otpauth://` URI for enrollment.
|
|
23
|
+
* - `verify` — consume a TOTP code. Auto-detects:
|
|
24
|
+
* - first-time enrollment confirmation (caller passes `totpId`), or
|
|
25
|
+
* - 2FA sign-in challenge (no `totpId`).
|
|
26
|
+
*/
|
|
27
|
+
const TOTP_FLOWS = ["setup", "verify"];
|
|
28
|
+
const convexError = (code, message) => toConvexError(authFlowError(code, message));
|
|
29
|
+
const asConvexError = (error, code, message) => error instanceof ConvexError ? error : error instanceof Error ? toConvexError(authFlowError(code, error.message || message)) : convexError(code, message);
|
|
30
|
+
/**
|
|
31
|
+
* Encrypt a raw TOTP secret for storage. The secret bytes are base64url-encoded
|
|
32
|
+
* and sealed with the server's {@link encryptSecret} (AES-GCM); the resulting
|
|
33
|
+
* ciphertext string is stored UTF-8-encoded in the `TotpFactor.secret` bytes
|
|
34
|
+
* field. Runs server-side because component functions cannot read
|
|
35
|
+
* `AUTH_SECRET_ENCRYPTION_KEY`.
|
|
36
|
+
*/
|
|
37
|
+
async function encryptTotpSecret(secret) {
|
|
38
|
+
const ciphertext = await encryptSecret(encodeBase64urlNoPadding(secret));
|
|
39
|
+
const encoded = new TextEncoder().encode(ciphertext);
|
|
40
|
+
return encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reverse {@link encryptTotpSecret}: decode the stored ciphertext bytes, decrypt
|
|
44
|
+
* to the base64url secret, and return the raw secret bytes for verification.
|
|
45
|
+
*/
|
|
46
|
+
async function decryptTotpSecret(stored) {
|
|
47
|
+
return decodeBase64urlIgnorePadding(await decryptSecret(new TextDecoder().decode(stored)));
|
|
48
|
+
}
|
|
49
|
+
function resolveTotpFlow(params) {
|
|
50
|
+
const flow = params.flow;
|
|
51
|
+
if (typeof flow === "string" && TOTP_FLOWS.includes(flow)) return flow;
|
|
52
|
+
throw convexError(ErrorCode.TOTP_MISSING_FLOW, "Missing `flow` parameter. Expected one of: " + TOTP_FLOWS.join(", "));
|
|
53
|
+
}
|
|
54
|
+
function requireTotpVerifier(verifier) {
|
|
55
|
+
if (verifier != null) return verifier;
|
|
56
|
+
throw convexError(ErrorCode.TOTP_MISSING_VERIFIER, "Missing verifier for TOTP operation.");
|
|
57
|
+
}
|
|
58
|
+
function requireTotpCode(params) {
|
|
59
|
+
if (typeof params.code === "string") return params.code;
|
|
60
|
+
throw convexError(ErrorCode.TOTP_MISSING_CODE, "Missing TOTP code.");
|
|
61
|
+
}
|
|
62
|
+
function resolveTotpDispatch(params, verifier) {
|
|
63
|
+
if (resolveTotpFlow(params) === "setup") return {
|
|
64
|
+
flow: "setup",
|
|
65
|
+
params
|
|
66
|
+
};
|
|
67
|
+
const resolvedVerifier = requireTotpVerifier(verifier);
|
|
68
|
+
const code = requireTotpCode(params);
|
|
69
|
+
if (typeof params.totpId === "string" && params.totpId.length > 0) return {
|
|
70
|
+
flow: "verify",
|
|
71
|
+
code,
|
|
72
|
+
totpId: params.totpId,
|
|
73
|
+
verifier: resolvedVerifier,
|
|
74
|
+
intent: "enrollment"
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
flow: "verify",
|
|
78
|
+
code,
|
|
79
|
+
verifier: resolvedVerifier,
|
|
80
|
+
intent: "challenge"
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function requireAuthenticatedUserId(ctx) {
|
|
84
|
+
try {
|
|
85
|
+
const userId = await getAuthenticatedUserIdOrNull(ctx);
|
|
86
|
+
if (userId === null) throw convexError(ErrorCode.TOTP_AUTH_REQUIRED, "Sign in first, then set up two-factor authentication.");
|
|
87
|
+
return userId;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (error instanceof ConvexError) throw error;
|
|
90
|
+
throw asConvexError(error, ErrorCode.INTERNAL_ERROR, String(error));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Drive the TOTP provider's `setup` / `verify` flow.
|
|
95
|
+
*
|
|
96
|
+
* `setup` issues an enrollment secret and `otpauth://` URI; `verify` either
|
|
97
|
+
* confirms a first-time enrollment (when `params.totpId` is present) or
|
|
98
|
+
* completes a 2FA challenge during sign-in.
|
|
99
|
+
*
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
const handleTotp = async (ctx, provider, args) => {
|
|
103
|
+
const dispatch = resolveTotpDispatch(args.params ?? {}, args.verifier);
|
|
104
|
+
const flowHandlers = {
|
|
105
|
+
setup: async () => {
|
|
106
|
+
const { params: setupParams } = dispatch;
|
|
107
|
+
const userId = await requireAuthenticatedUserId(ctx);
|
|
108
|
+
const secret = new Uint8Array(20);
|
|
109
|
+
crypto.getRandomValues(secret);
|
|
110
|
+
const base32Secret = encodeBase32LowerCaseNoPadding(secret);
|
|
111
|
+
let enrollment;
|
|
112
|
+
try {
|
|
113
|
+
enrollment = await ctx.runMutation(ctx.auth.config.component.factor.totp.createEnrollment, {
|
|
114
|
+
userId,
|
|
115
|
+
secret: await encryptTotpSecret(secret),
|
|
116
|
+
digits: provider.options.digits,
|
|
117
|
+
period: provider.options.period,
|
|
118
|
+
name: typeof setupParams.name === "string" ? setupParams.name : void 0,
|
|
119
|
+
createdAt: Date.now()
|
|
120
|
+
});
|
|
121
|
+
} catch (error) {
|
|
122
|
+
throw asConvexError(error, ErrorCode.INTERNAL_ERROR, `TOTP setup failed: ${String(error)}`);
|
|
123
|
+
}
|
|
124
|
+
const accountName = typeof setupParams.accountName === "string" && setupParams.accountName.length > 0 ? setupParams.accountName : enrollment.user.email ?? "user";
|
|
125
|
+
return {
|
|
126
|
+
kind: "totpSetup",
|
|
127
|
+
totpSetup: {
|
|
128
|
+
uri: createTOTPKeyURI(provider.options.issuer, accountName, secret, provider.options.period, provider.options.digits),
|
|
129
|
+
secret: base32Secret,
|
|
130
|
+
totpId: enrollment.totpId
|
|
131
|
+
},
|
|
132
|
+
verifier: enrollment.verifierId
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
verify: async () => {
|
|
136
|
+
if (dispatch.flow !== "verify") throw convexError(ErrorCode.TOTP_MISSING_FLOW, `Unexpected dispatch: ${dispatch.flow}`);
|
|
137
|
+
if (dispatch.intent === "enrollment") return await confirmEnrollment(dispatch.code, dispatch.totpId, dispatch.verifier);
|
|
138
|
+
return await verifyChallenge(dispatch.code, dispatch.verifier);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* `verify` with `totpId`: completes a first-time enrollment after `setup`.
|
|
143
|
+
* Marks the TOTP factor as verified and signs the user in.
|
|
144
|
+
*/
|
|
145
|
+
async function confirmEnrollment(code, totpId, verifier) {
|
|
146
|
+
const userId = await requireAuthenticatedUserId(ctx);
|
|
147
|
+
const result = await verifyTotp({
|
|
148
|
+
code,
|
|
149
|
+
verifier,
|
|
150
|
+
intent: "enrollment",
|
|
151
|
+
authenticatedUserId: userId,
|
|
152
|
+
totpId
|
|
153
|
+
});
|
|
154
|
+
await queueAuthEvent(ctx, ctx.auth.config, {
|
|
155
|
+
kind: "totp.enrolled",
|
|
156
|
+
actor: {
|
|
157
|
+
type: "user",
|
|
158
|
+
id: userId
|
|
159
|
+
},
|
|
160
|
+
subject: {
|
|
161
|
+
type: "totp",
|
|
162
|
+
id: totpId
|
|
163
|
+
},
|
|
164
|
+
targets: [{
|
|
165
|
+
kind: "user",
|
|
166
|
+
id: userId
|
|
167
|
+
}],
|
|
168
|
+
outcome: "success",
|
|
169
|
+
data: { totpId }
|
|
170
|
+
});
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* `verify` without `totpId`: completes a 2FA challenge during sign-in.
|
|
175
|
+
* Looks up the user's verified TOTP factor, validates the code, signs in.
|
|
176
|
+
*/
|
|
177
|
+
async function verifyChallenge(code, verifier) {
|
|
178
|
+
return await verifyTotp({
|
|
179
|
+
code,
|
|
180
|
+
verifier,
|
|
181
|
+
intent: "challenge"
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
async function verifyTotp(input) {
|
|
185
|
+
const begun = await ctx.runMutation(ctx.auth.config.component.factor.totp.beginVerification, {
|
|
186
|
+
verifierId: input.verifier,
|
|
187
|
+
intent: input.intent,
|
|
188
|
+
authenticatedUserId: input.authenticatedUserId,
|
|
189
|
+
totpId: input.totpId,
|
|
190
|
+
maxAttemptsPerHour: maxSignInAttempts(ctx.auth.config)
|
|
191
|
+
});
|
|
192
|
+
if (begun.status === "invalid_verifier") throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, "Invalid or expired TOTP verifier.");
|
|
193
|
+
if (begun.status === "limited") throw convexError(ErrorCode.RATE_LIMITED, "Too many TOTP attempts. Try again later.");
|
|
194
|
+
if (begun.status === "already_verified") throw convexError(ErrorCode.TOTP_ALREADY_VERIFIED, "TOTP enrollment is already verified.");
|
|
195
|
+
if (begun.status === "not_found") throw convexError(input.intent === "enrollment" ? ErrorCode.TOTP_NOT_FOUND : ErrorCode.TOTP_NO_ENROLLMENT, input.intent === "enrollment" ? "TOTP enrollment not found." : "No verified TOTP enrollment found.");
|
|
196
|
+
if (begun.status !== "ready") throw convexError(ErrorCode.INTERNAL_ERROR, "Unexpected TOTP verification state.");
|
|
197
|
+
if (!verifyTOTPWithGracePeriod(await decryptTotpSecret(begun.factor.secret), begun.factor.period, begun.factor.digits, input.code, 30)) throw convexError(ErrorCode.TOTP_INVALID_CODE, "Invalid TOTP code.");
|
|
198
|
+
const replaceSessionId = await getAuthSessionId(ctx) ?? void 0;
|
|
199
|
+
const completed = await ctx.runMutation(ctx.auth.config.component.factor.totp.completeVerification, {
|
|
200
|
+
verifierId: input.verifier,
|
|
201
|
+
intent: input.intent,
|
|
202
|
+
authenticatedUserId: input.authenticatedUserId,
|
|
203
|
+
totpId: input.totpId,
|
|
204
|
+
replaceSessionId,
|
|
205
|
+
sessionExpirationTime: sessionExpirationTime(ctx.auth.config),
|
|
206
|
+
refreshTokenExpirationTime: refreshTokenExpirationTime(ctx.auth.config),
|
|
207
|
+
now: Date.now()
|
|
208
|
+
});
|
|
209
|
+
if (completed.status !== "accepted") throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, "Invalid or expired TOTP verifier.");
|
|
210
|
+
const userId = completed.user._id;
|
|
211
|
+
const sessionId = completed.sessionId;
|
|
212
|
+
setActiveSpanAttributes({
|
|
213
|
+
"auth.signin.result": "success",
|
|
214
|
+
...buildKnownSignInIdentityAttributes(ctx.auth.config, {
|
|
215
|
+
userId,
|
|
216
|
+
sessionId
|
|
217
|
+
}, completed.user.email)
|
|
218
|
+
});
|
|
219
|
+
if (completed.replacedSessionId !== void 0) {
|
|
220
|
+
const replacedSessionId = completed.replacedSessionId;
|
|
221
|
+
await queueAuthEvent(ctx, ctx.auth.config, {
|
|
222
|
+
kind: "session.invalidated",
|
|
223
|
+
actor: { type: "system" },
|
|
224
|
+
subject: {
|
|
225
|
+
type: "session",
|
|
226
|
+
id: replacedSessionId
|
|
227
|
+
},
|
|
228
|
+
targets: [{
|
|
229
|
+
kind: "user",
|
|
230
|
+
id: userId
|
|
231
|
+
}, {
|
|
232
|
+
kind: "session",
|
|
233
|
+
id: replacedSessionId
|
|
234
|
+
}],
|
|
235
|
+
outcome: "success",
|
|
236
|
+
data: {
|
|
237
|
+
userId,
|
|
238
|
+
reason: "replaced"
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
await queueAuthEvent(ctx, ctx.auth.config, {
|
|
243
|
+
kind: "session.signed_in",
|
|
244
|
+
actor: {
|
|
245
|
+
type: "user",
|
|
246
|
+
id: userId
|
|
247
|
+
},
|
|
248
|
+
subject: {
|
|
249
|
+
type: "session",
|
|
250
|
+
id: sessionId
|
|
251
|
+
},
|
|
252
|
+
targets: [{
|
|
253
|
+
kind: "user",
|
|
254
|
+
id: userId
|
|
255
|
+
}, {
|
|
256
|
+
kind: "session",
|
|
257
|
+
id: sessionId
|
|
258
|
+
}],
|
|
259
|
+
outcome: "success",
|
|
260
|
+
data: {
|
|
261
|
+
provider: "session",
|
|
262
|
+
method: provider.id
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
return {
|
|
266
|
+
kind: "signedIn",
|
|
267
|
+
session: await finalizeSessionIssuance(ctx.auth.config, {
|
|
268
|
+
userId,
|
|
269
|
+
sessionId,
|
|
270
|
+
identity: buildSessionIdentity(userId, sessionId, completed.user),
|
|
271
|
+
refreshToken: encodeRefreshToken(completed.refreshTokenId, sessionId)
|
|
272
|
+
})
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
const handler = flowHandlers[dispatch.flow];
|
|
276
|
+
if (!handler) throw convexError(ErrorCode.TOTP_MISSING_FLOW, `Unknown TOTP flow: ${dispatch.flow}`);
|
|
277
|
+
return handler();
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
//#endregion
|
|
281
|
+
export { handleTotp };
|
|
282
|
+
//# sourceMappingURL=totp.js.map
|