@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,210 @@
|
|
|
1
|
+
import { LOG_LEVELS } from "../../../shared/log.js";
|
|
2
|
+
import { queueAuthEvent } from "../../events.js";
|
|
3
|
+
import { log, maybeRedact } from "../../log.js";
|
|
4
|
+
import { encodeRefreshToken, refreshTokenExpirationTime } from "../../token/refresh.js";
|
|
5
|
+
import { setActiveSpanAttributes, withSpan } from "../../utils/span.js";
|
|
6
|
+
import { buildSessionIdentity, getAuthSessionId, sessionExpirationTime } from "../../session/lifecycle.js";
|
|
7
|
+
import { verify } from "../../crypto.js";
|
|
8
|
+
import { AUTH_STORE_REF } from "../store/refs.js";
|
|
9
|
+
import { maxSignInAttempts } from "../../limits.js";
|
|
10
|
+
import { buildKnownSignInIdentityAttributes } from "../../telemetry.js";
|
|
11
|
+
import { v } from "convex/values";
|
|
12
|
+
|
|
13
|
+
//#region src/server/mutations/credentials/signin.ts
|
|
14
|
+
/**
|
|
15
|
+
* A well-formed but intentionally unmatchable password hash. Verifying any
|
|
16
|
+
* secret against it runs the provider's full (scrypt) work and always fails.
|
|
17
|
+
* Used on the missing-account branch so sign-in spends comparable time whether
|
|
18
|
+
* or not the account exists — closing the user-enumeration timing oracle.
|
|
19
|
+
*
|
|
20
|
+
* The prefix and params mirror the default password provider's scrypt format so
|
|
21
|
+
* that provider performs a real scrypt hash; the salt and digest are all zero,
|
|
22
|
+
* a digest scrypt can never actually produce, so verification never succeeds.
|
|
23
|
+
*/
|
|
24
|
+
const DUMMY_PASSWORD_HASH = `scrypt:N=16384,r=16,p=1,dkLen=64$${"0".repeat(64)}$${"0".repeat(128)}`;
|
|
25
|
+
/**
|
|
26
|
+
* Run a throwaway secret verification purely to equalize timing on branches
|
|
27
|
+
* that reject before the real verify would run. Never authenticates: it
|
|
28
|
+
* verifies against {@link DUMMY_PASSWORD_HASH} (which cannot match) and swallows
|
|
29
|
+
* any error, so a misconfigured or non-credentials provider still yields the
|
|
30
|
+
* unified rejection rather than a distinguishable error or timing.
|
|
31
|
+
*/
|
|
32
|
+
async function burnVerifyForTiming(getProviderOrThrow, providerId, secret) {
|
|
33
|
+
try {
|
|
34
|
+
await verify(getProviderOrThrow(providerId), secret, DUMMY_PASSWORD_HASH);
|
|
35
|
+
} catch {}
|
|
36
|
+
}
|
|
37
|
+
/** Argument validator for the combined credentials-verify + session-issue mutation. */
|
|
38
|
+
const vCredentialsSignInArgs = v.object({
|
|
39
|
+
provider: v.string(),
|
|
40
|
+
account: v.object({
|
|
41
|
+
id: v.string(),
|
|
42
|
+
secret: v.string()
|
|
43
|
+
}),
|
|
44
|
+
generateTokens: v.boolean(),
|
|
45
|
+
requireVerifiedEmail: v.boolean(),
|
|
46
|
+
enforceTotp: v.boolean()
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Verify credentials and issue a session through one app mutation.
|
|
50
|
+
*
|
|
51
|
+
* Enforces sign-in rate limiting, optional verified-email and TOTP gates, and
|
|
52
|
+
* returns a discriminated result (`invalidAccount`, `tooManyAttempts`,
|
|
53
|
+
* `invalidSecret`, `emailVerificationRequired`, `totpRequired`, or `signedIn`).
|
|
54
|
+
*
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
async function credentialsSignInImpl(ctx, args, getProviderOrThrow, config) {
|
|
58
|
+
return withSpan("convex-auth.mutations.credentialsSignIn", {
|
|
59
|
+
provider: args.provider,
|
|
60
|
+
generateTokens: args.generateTokens
|
|
61
|
+
}, () => credentialsSignInInner(ctx, args, getProviderOrThrow, config));
|
|
62
|
+
}
|
|
63
|
+
async function credentialsSignInInner(ctx, args, getProviderOrThrow, config) {
|
|
64
|
+
const { provider: providerId, account, generateTokens, requireVerifiedEmail, enforceTotp } = args;
|
|
65
|
+
log(LOG_LEVELS.DEBUG, "credentialsSignInImpl args:", {
|
|
66
|
+
provider: providerId,
|
|
67
|
+
account: {
|
|
68
|
+
id: account.id,
|
|
69
|
+
secret: maybeRedact(account.secret)
|
|
70
|
+
},
|
|
71
|
+
generateTokens,
|
|
72
|
+
requireVerifiedEmail,
|
|
73
|
+
enforceTotp
|
|
74
|
+
});
|
|
75
|
+
const begun = await ctx.runMutation(config.component.account.beginCredentialsSignIn, {
|
|
76
|
+
provider: providerId,
|
|
77
|
+
providerAccountId: account.id,
|
|
78
|
+
maxAttemptsPerHour: maxSignInAttempts(config),
|
|
79
|
+
reserveAttempt: true,
|
|
80
|
+
includeTotp: enforceTotp
|
|
81
|
+
});
|
|
82
|
+
if (begun.status === "invalid") {
|
|
83
|
+
await burnVerifyForTiming(getProviderOrThrow, providerId, account.secret);
|
|
84
|
+
return { kind: "invalidAccount" };
|
|
85
|
+
}
|
|
86
|
+
if (begun.status === "limited") return { kind: "tooManyAttempts" };
|
|
87
|
+
const existingAccount = begun.account;
|
|
88
|
+
const user = begun.user;
|
|
89
|
+
if (!await withSpan("convex-auth.credentials.verify", { providerId }, () => verify(getProviderOrThrow(providerId), account.secret, existingAccount.secret ?? ""))) return { kind: "invalidSecret" };
|
|
90
|
+
const complete = async (issueSession) => await ctx.runMutation(config.component.account.completeCredentialsSignIn, {
|
|
91
|
+
accountId: existingAccount._id,
|
|
92
|
+
issueSession,
|
|
93
|
+
generateTokens,
|
|
94
|
+
replaceSessionId: issueSession ? await getAuthSessionId(ctx) ?? void 0 : void 0,
|
|
95
|
+
sessionExpirationTime: sessionExpirationTime(config),
|
|
96
|
+
refreshTokenExpirationTime: refreshTokenExpirationTime(config)
|
|
97
|
+
});
|
|
98
|
+
if (requireVerifiedEmail && !existingAccount.emailVerified) {
|
|
99
|
+
await complete(false);
|
|
100
|
+
return {
|
|
101
|
+
kind: "emailVerificationRequired",
|
|
102
|
+
account: {
|
|
103
|
+
_id: existingAccount._id,
|
|
104
|
+
emailVerified: existingAccount.emailVerified
|
|
105
|
+
},
|
|
106
|
+
user: {
|
|
107
|
+
_id: user._id,
|
|
108
|
+
email: user.email
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (enforceTotp && begun.hasTotp) {
|
|
113
|
+
await complete(false);
|
|
114
|
+
return {
|
|
115
|
+
kind: "totpRequired",
|
|
116
|
+
account: {
|
|
117
|
+
_id: existingAccount._id,
|
|
118
|
+
emailVerified: existingAccount.emailVerified
|
|
119
|
+
},
|
|
120
|
+
user: {
|
|
121
|
+
_id: user._id,
|
|
122
|
+
email: user.email
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const completed = await complete(true);
|
|
127
|
+
if (completed.status !== "accepted") return { kind: "invalidAccount" };
|
|
128
|
+
const userId = completed.user._id;
|
|
129
|
+
const sessionId = completed.sessionId;
|
|
130
|
+
setActiveSpanAttributes({
|
|
131
|
+
"auth.signin.result": "success",
|
|
132
|
+
...buildKnownSignInIdentityAttributes(config, {
|
|
133
|
+
userId,
|
|
134
|
+
sessionId
|
|
135
|
+
}, completed.user.email)
|
|
136
|
+
});
|
|
137
|
+
if (completed.replacedSessionId !== void 0) {
|
|
138
|
+
const replacedSessionId = completed.replacedSessionId;
|
|
139
|
+
await queueAuthEvent(ctx, config, {
|
|
140
|
+
kind: "session.invalidated",
|
|
141
|
+
actor: { type: "system" },
|
|
142
|
+
subject: {
|
|
143
|
+
type: "session",
|
|
144
|
+
id: replacedSessionId
|
|
145
|
+
},
|
|
146
|
+
targets: [{
|
|
147
|
+
kind: "user",
|
|
148
|
+
id: userId
|
|
149
|
+
}, {
|
|
150
|
+
kind: "session",
|
|
151
|
+
id: replacedSessionId
|
|
152
|
+
}],
|
|
153
|
+
outcome: "success",
|
|
154
|
+
data: {
|
|
155
|
+
userId,
|
|
156
|
+
reason: "replaced"
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
await queueAuthEvent(ctx, config, {
|
|
161
|
+
kind: "session.signed_in",
|
|
162
|
+
actor: {
|
|
163
|
+
type: "user",
|
|
164
|
+
id: userId
|
|
165
|
+
},
|
|
166
|
+
subject: {
|
|
167
|
+
type: "session",
|
|
168
|
+
id: sessionId
|
|
169
|
+
},
|
|
170
|
+
targets: [{
|
|
171
|
+
kind: "user",
|
|
172
|
+
id: userId
|
|
173
|
+
}, {
|
|
174
|
+
kind: "session",
|
|
175
|
+
id: sessionId
|
|
176
|
+
}],
|
|
177
|
+
outcome: "success",
|
|
178
|
+
data: { provider: providerId }
|
|
179
|
+
});
|
|
180
|
+
const refreshTokenId = completed.refreshTokenId;
|
|
181
|
+
return {
|
|
182
|
+
kind: "signedIn",
|
|
183
|
+
issuance: {
|
|
184
|
+
userId,
|
|
185
|
+
sessionId,
|
|
186
|
+
identity: buildSessionIdentity(userId, sessionId, completed.user),
|
|
187
|
+
refreshToken: generateTokens && refreshTokenId !== void 0 ? encodeRefreshToken(refreshTokenId, sessionId) : null
|
|
188
|
+
},
|
|
189
|
+
account: {
|
|
190
|
+
_id: existingAccount._id,
|
|
191
|
+
emailVerified: existingAccount.emailVerified
|
|
192
|
+
},
|
|
193
|
+
user: {
|
|
194
|
+
_id: user._id,
|
|
195
|
+
email: user.email,
|
|
196
|
+
hasTotp: begun.hasTotp
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** @internal */
|
|
201
|
+
const callCredentialsSignIn = async (ctx, args) => {
|
|
202
|
+
return await ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
203
|
+
type: "credentialsSignIn",
|
|
204
|
+
...args
|
|
205
|
+
} });
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
//#endregion
|
|
209
|
+
export { callCredentialsSignIn, credentialsSignInImpl, vCredentialsSignInArgs };
|
|
210
|
+
//# sourceMappingURL=signin.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { LOG_LEVELS } from "../../shared/log.js";
|
|
2
|
+
import { emitAuthEvent } from "../events.js";
|
|
3
|
+
import { authDb } from "../db.js";
|
|
4
|
+
import { log } from "../log.js";
|
|
5
|
+
import { deleteSession } from "../session/lifecycle.js";
|
|
6
|
+
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
7
|
+
import { v } from "convex/values";
|
|
8
|
+
|
|
9
|
+
//#region src/server/mutations/invalidate.ts
|
|
10
|
+
const vInvalidateSessionsArgs = v.object({
|
|
11
|
+
userId: v.string(),
|
|
12
|
+
except: v.optional(v.array(v.string()))
|
|
13
|
+
});
|
|
14
|
+
const callInvalidateSessions = async (ctx, args) => {
|
|
15
|
+
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
16
|
+
type: "invalidateSessions",
|
|
17
|
+
...args
|
|
18
|
+
} });
|
|
19
|
+
};
|
|
20
|
+
async function invalidateSessionsImpl(ctx, args, config) {
|
|
21
|
+
log(LOG_LEVELS.DEBUG, "invalidateSessionsImpl args:", args);
|
|
22
|
+
const { userId, except } = args;
|
|
23
|
+
const exceptSet = new Set(except ?? []);
|
|
24
|
+
const typedUserId = userId;
|
|
25
|
+
const sessions = await authDb(ctx, config).sessions.listByUser(typedUserId);
|
|
26
|
+
const deleted = [];
|
|
27
|
+
await Promise.all(sessions.map(async (session) => {
|
|
28
|
+
if (exceptSet.has(session._id)) return;
|
|
29
|
+
await deleteSession(ctx, session, config);
|
|
30
|
+
deleted.push(session._id);
|
|
31
|
+
}));
|
|
32
|
+
for (const sessionId of deleted) await emitAuthEvent(ctx, config, {
|
|
33
|
+
kind: "session.invalidated",
|
|
34
|
+
actor: { type: "system" },
|
|
35
|
+
subject: {
|
|
36
|
+
type: "session",
|
|
37
|
+
id: sessionId
|
|
38
|
+
},
|
|
39
|
+
targets: [
|
|
40
|
+
{
|
|
41
|
+
kind: "user",
|
|
42
|
+
id: typedUserId
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
kind: "session",
|
|
46
|
+
id: sessionId
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
kind: "global",
|
|
50
|
+
id: "security"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
outcome: "success",
|
|
54
|
+
data: { userId: typedUserId }
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { callInvalidateSessions, invalidateSessionsImpl, vInvalidateSessionsArgs };
|
|
60
|
+
//# sourceMappingURL=invalidate.js.map
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { ErrorCode } from "../../shared/codes.js";
|
|
2
|
+
import { generateRandomString, sha256 } from "../random.js";
|
|
3
|
+
import { authDb } from "../db.js";
|
|
4
|
+
import { log, maybeRedact } from "../log.js";
|
|
5
|
+
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
6
|
+
import { upsertUserAndAccount } from "../user/account.js";
|
|
7
|
+
import { getGroup, getGroupConnection } from "../contract.js";
|
|
8
|
+
import { vAccountExtend, vPayloadRecord } from "../payloads.js";
|
|
9
|
+
import { vProfileEmail } from "../../component/model.js";
|
|
10
|
+
import { single } from "../component/api.js";
|
|
11
|
+
import { GROUP_OIDC_PROVIDER_PREFIX, GROUP_SAML_PROVIDER_PREFIX, isGroupProviderId } from "../connection/shared.js";
|
|
12
|
+
import { createSyntheticOAuthMaterializedConfig } from "../connection/oidc.js";
|
|
13
|
+
import { normalizeGroupConnectionPolicy, resolveProvisionedRoleIds } from "../connection/policy.js";
|
|
14
|
+
import { ConvexError, v } from "convex/values";
|
|
15
|
+
|
|
16
|
+
//#region src/server/mutations/oauth.ts
|
|
17
|
+
const OAUTH_SIGN_IN_EXPIRATION_MS = 1e3 * 60 * 2;
|
|
18
|
+
/**
|
|
19
|
+
* Length and alphabet of the short-lived OAuth sign-in handoff code minted
|
|
20
|
+
* below. Matches the 32-char alphanumeric convention used for OAuth
|
|
21
|
+
* authorization codes elsewhere (`server/oauth/code.ts`): ~190 bits of entropy,
|
|
22
|
+
* versus ~26.6 bits for the previous 8-digit numeric code — which was
|
|
23
|
+
* brute-forceable within this handoff's 2-minute TTL.
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
const OAUTH_SIGN_IN_CODE_LENGTH = 32;
|
|
27
|
+
/** @internal */
|
|
28
|
+
const OAUTH_SIGN_IN_CODE_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
29
|
+
/** Argument validator for the OAuth/Connection user provisioning mutation. */
|
|
30
|
+
const vUserOAuthArgs = v.object({
|
|
31
|
+
provider: v.string(),
|
|
32
|
+
providerAccountId: v.string(),
|
|
33
|
+
profile: vPayloadRecord,
|
|
34
|
+
emails: v.optional(v.array(vProfileEmail)),
|
|
35
|
+
signature: v.string(),
|
|
36
|
+
accountExtend: v.optional(vAccountExtend)
|
|
37
|
+
});
|
|
38
|
+
function normalizeAccountExtend(provider, providerAccountId, accountExtend) {
|
|
39
|
+
const baseIdentity = {
|
|
40
|
+
type: "oauth",
|
|
41
|
+
provider,
|
|
42
|
+
providerAccountId
|
|
43
|
+
};
|
|
44
|
+
if (provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX)) {
|
|
45
|
+
baseIdentity.type = "group-connection-oidc";
|
|
46
|
+
baseIdentity.connectionId = provider.slice(GROUP_OIDC_PROVIDER_PREFIX.length);
|
|
47
|
+
}
|
|
48
|
+
if (provider.startsWith(GROUP_SAML_PROVIDER_PREFIX)) {
|
|
49
|
+
baseIdentity.type = "group-connection-saml";
|
|
50
|
+
baseIdentity.connectionId = provider.slice(GROUP_SAML_PROVIDER_PREFIX.length);
|
|
51
|
+
}
|
|
52
|
+
const provided = accountExtend;
|
|
53
|
+
const providedIdentity = provided?.identity;
|
|
54
|
+
return {
|
|
55
|
+
...provided,
|
|
56
|
+
identity: {
|
|
57
|
+
...baseIdentity,
|
|
58
|
+
...providedIdentity
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read a free-form string-array claim (e.g. `groups`, `roles`) from an IdP
|
|
64
|
+
* profile. The value arrives as untyped wire data; the array branch is
|
|
65
|
+
* re-narrowed to `string[]` at this single boundary.
|
|
66
|
+
*/
|
|
67
|
+
function readStringArrayClaim(profile, key) {
|
|
68
|
+
const value = profile[key];
|
|
69
|
+
return Array.isArray(value) ? value : void 0;
|
|
70
|
+
}
|
|
71
|
+
/** Lowercased registrable domain of an email address, or `null` when unparseable. */
|
|
72
|
+
function emailDomain(email) {
|
|
73
|
+
if (typeof email !== "string") return null;
|
|
74
|
+
const at = email.lastIndexOf("@");
|
|
75
|
+
if (at === -1 || at === email.length - 1) return null;
|
|
76
|
+
return email.slice(at + 1).toLowerCase();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether a SAML-asserted email may be treated as verified: true only when its
|
|
80
|
+
* domain matches a verified (`verifiedAt` set) domain attached to the
|
|
81
|
+
* connection. SAML carries no `email_verified` claim, so a domain-ownership
|
|
82
|
+
* proof is the only signal that lets a SAML email drive `verifiedEmail`
|
|
83
|
+
* account-linking — without it a malicious IdP could assert `victim@other.com`.
|
|
84
|
+
*/
|
|
85
|
+
async function isSamlEmailDomainVerified(ctx, config, connectionId, email) {
|
|
86
|
+
const domain = emailDomain(email);
|
|
87
|
+
if (domain === null) return false;
|
|
88
|
+
return (await ctx.runQuery(config.component.connection.domain.list, { connectionId })).some((row) => row.verifiedAt !== void 0 && row.domain.toLowerCase() === domain);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Just-in-time membership provisioning for a connection-owned group on SSO
|
|
92
|
+
* login, reconcile-to-set on roles.
|
|
93
|
+
*
|
|
94
|
+
* @remarks
|
|
95
|
+
* The IdP assertion is authoritative for a connection-owned membership's roles:
|
|
96
|
+
* an existing membership's `roleIds` are overwritten with exactly the mapped
|
|
97
|
+
* set even when that shrinks (or empties) it, so a demotion at the IdP drops the
|
|
98
|
+
* local roles rather than leaving them (the previous additive-only behavior).
|
|
99
|
+
* The membership itself is never removed here — the user just authenticated
|
|
100
|
+
* through this connection's IdP, so JIT keeps them a member; full
|
|
101
|
+
* de-provisioning (and session revocation) is SCIM's responsibility.
|
|
102
|
+
*/
|
|
103
|
+
async function jitProvisionMembership(ctx, config, connectionPolicy, connection, userId, profile) {
|
|
104
|
+
if (connectionPolicy?.provisioning.jit.mode !== "createUserAndMembership") return;
|
|
105
|
+
const groupId = connection?.groupId;
|
|
106
|
+
if (!groupId) return;
|
|
107
|
+
const definedRoleIds = new Set(Object.keys(config.permissions?.roles ?? {}));
|
|
108
|
+
const provisionedRoleIds = resolveProvisionedRoleIds({
|
|
109
|
+
policy: connectionPolicy,
|
|
110
|
+
groups: readStringArrayClaim(profile, "groups"),
|
|
111
|
+
roles: readStringArrayClaim(profile, "roles")
|
|
112
|
+
}).filter((roleId) => definedRoleIds.has(roleId));
|
|
113
|
+
const existingMembership = single(await ctx.runQuery(config.component.group.member.get, {
|
|
114
|
+
userId,
|
|
115
|
+
groupId
|
|
116
|
+
}));
|
|
117
|
+
if (existingMembership === null) {
|
|
118
|
+
await ctx.runMutation(config.component.group.member.create, {
|
|
119
|
+
groupId,
|
|
120
|
+
userId,
|
|
121
|
+
roleIds: provisionedRoleIds,
|
|
122
|
+
status: "active"
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const currentRoleIds = existingMembership.roleIds ?? [];
|
|
127
|
+
const nextRoleSet = new Set(provisionedRoleIds);
|
|
128
|
+
if (!(currentRoleIds.length === nextRoleSet.size && currentRoleIds.every((roleId) => nextRoleSet.has(roleId)))) await ctx.runMutation(config.component.group.member.update, {
|
|
129
|
+
id: existingMembership._id,
|
|
130
|
+
patch: { roleIds: provisionedRoleIds }
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Redact secret-bearing fields (the OAuth state `signature`) from the
|
|
135
|
+
* provisioning args before they reach a DEBUG log line, so enabling DEBUG never
|
|
136
|
+
* writes the verifier signature to logs.
|
|
137
|
+
* @internal
|
|
138
|
+
*/
|
|
139
|
+
function redactUserOAuthArgsForLog(args) {
|
|
140
|
+
return {
|
|
141
|
+
...args,
|
|
142
|
+
signature: maybeRedact(args.signature)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Provision a user and account from a verified OAuth/Connection profile.
|
|
147
|
+
*
|
|
148
|
+
* Resolves any group connection (OIDC/SAML) and its policy, runs the
|
|
149
|
+
* profile/provision hooks, upserts the user and account, performs JIT
|
|
150
|
+
* membership provisioning, and mints a short-lived single-use sign-in code.
|
|
151
|
+
*
|
|
152
|
+
* @returns The numeric sign-in code the action side exchanges for tokens.
|
|
153
|
+
*/
|
|
154
|
+
async function userOAuthImpl(ctx, args, getProviderOrThrow, config) {
|
|
155
|
+
log("DEBUG", "userOAuthImpl args:", redactUserOAuthArgsForLog(args));
|
|
156
|
+
const { profile, provider, providerAccountId, signature, accountExtend } = args;
|
|
157
|
+
const typedProfile = profile;
|
|
158
|
+
const db = authDb(ctx, config);
|
|
159
|
+
const connectionId = provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX) ? provider.slice(GROUP_OIDC_PROVIDER_PREFIX.length) : provider.startsWith(GROUP_SAML_PROVIDER_PREFIX) ? provider.slice(GROUP_SAML_PROVIDER_PREFIX.length) : null;
|
|
160
|
+
const connectionProtocol = provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX) ? "oidc" : provider.startsWith(GROUP_SAML_PROVIDER_PREFIX) ? "saml" : null;
|
|
161
|
+
const existingAccount = await db.accounts.get({
|
|
162
|
+
provider,
|
|
163
|
+
providerAccountId
|
|
164
|
+
});
|
|
165
|
+
const connection = connectionId !== null ? await getGroupConnection(ctx, config.component.connection, connectionId) : null;
|
|
166
|
+
const group = connection !== null ? await getGroup(ctx, config.component.group, connection.groupId) : null;
|
|
167
|
+
const connectionPolicy = connection ? normalizeGroupConnectionPolicy(group?.policy) : null;
|
|
168
|
+
/**
|
|
169
|
+
* SCIM identity `userId` crosses the component boundary as `string`; re-brand
|
|
170
|
+
* to the server's `Id<"User">` here — the one legitimate cast at the boundary.
|
|
171
|
+
*/
|
|
172
|
+
const existingScimUserId = (connectionId !== null && existingAccount === null && connectionPolicy?.provisioning.scimReuse.user === "externalId" ? single(await ctx.runQuery(config.component.connection.scim.identity.get, {
|
|
173
|
+
connectionId,
|
|
174
|
+
resourceType: "user",
|
|
175
|
+
externalId: providerAccountId
|
|
176
|
+
})) : null)?.userId;
|
|
177
|
+
let verifier;
|
|
178
|
+
try {
|
|
179
|
+
verifier = await db.verifiers.get({ signature });
|
|
180
|
+
} catch (err) {
|
|
181
|
+
console.error("[auth] OAuth verifier lookup failed", { err });
|
|
182
|
+
throw new ConvexError({
|
|
183
|
+
code: ErrorCode.OAUTH_INVALID_STATE,
|
|
184
|
+
message: "Invalid OAuth state. Please try signing in again."
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (verifier === null) throw new ConvexError({
|
|
188
|
+
code: ErrorCode.OAUTH_INVALID_STATE,
|
|
189
|
+
message: "Invalid OAuth state. Please try signing in again."
|
|
190
|
+
});
|
|
191
|
+
const profileResolved = (config.connection?.hooks?.profileResolved ? await config.connection.hooks.profileResolved({
|
|
192
|
+
protocol: connectionProtocol ?? "oidc",
|
|
193
|
+
connectionId: connectionId ?? void 0,
|
|
194
|
+
profile: typedProfile
|
|
195
|
+
}) : void 0) ?? typedProfile;
|
|
196
|
+
const profileForProvisioning = (config.connection?.hooks?.beforeProvision ? await config.connection.hooks.beforeProvision({
|
|
197
|
+
protocol: connectionProtocol ?? "oidc",
|
|
198
|
+
connectionId: connectionId ?? void 0,
|
|
199
|
+
profile: profileResolved
|
|
200
|
+
}) : void 0) ?? profileResolved;
|
|
201
|
+
const provisioningProfile = connectionProtocol === "saml" && connectionId !== null ? {
|
|
202
|
+
...profileForProvisioning,
|
|
203
|
+
emailVerified: await isSamlEmailDomainVerified(ctx, config, connectionId, profileForProvisioning.email)
|
|
204
|
+
} : profileForProvisioning;
|
|
205
|
+
const { accountId } = await upsertUserAndAccount(ctx, verifier.sessionId ?? null, existingAccount !== null ? { existingAccount } : { providerAccountId }, {
|
|
206
|
+
type: "oauth",
|
|
207
|
+
provider: isGroupProviderId(provider) ? createSyntheticOAuthMaterializedConfig(provider, { accountLinking: connectionProtocol === "oidc" ? connectionPolicy?.identity.accountLinking.oidc : connectionProtocol === "saml" ? connectionPolicy?.identity.accountLinking.saml : void 0 }) : getProviderOrThrow(provider),
|
|
208
|
+
profile: provisioningProfile,
|
|
209
|
+
emails: args.emails,
|
|
210
|
+
accountExtend: normalizeAccountExtend(provider, providerAccountId, accountExtend)
|
|
211
|
+
}, config, connectionPolicy?.provisioning.user ? {
|
|
212
|
+
existingUserId: existingScimUserId,
|
|
213
|
+
provisioningUser: connectionPolicy.provisioning.user,
|
|
214
|
+
source: "login"
|
|
215
|
+
} : existingScimUserId ? { existingUserId: existingScimUserId } : void 0);
|
|
216
|
+
if (connectionId !== null) {
|
|
217
|
+
const userId = (await db.accounts.get({ id: accountId }))?.userId;
|
|
218
|
+
if (userId) {
|
|
219
|
+
await jitProvisionMembership(ctx, config, connectionPolicy, connection, userId, typedProfile);
|
|
220
|
+
if (config.connection?.hooks?.afterProvision) await config.connection.hooks.afterProvision({
|
|
221
|
+
protocol: connectionProtocol ?? "oidc",
|
|
222
|
+
connectionId,
|
|
223
|
+
profile: profileForProvisioning,
|
|
224
|
+
userId
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const code = generateRandomString(OAUTH_SIGN_IN_CODE_LENGTH, OAUTH_SIGN_IN_CODE_ALPHABET);
|
|
229
|
+
await db.verifiers.delete(verifier._id);
|
|
230
|
+
const existingVerificationCode = await db.verificationCodes.get({ accountId });
|
|
231
|
+
if (existingVerificationCode !== null) await db.verificationCodes.delete(existingVerificationCode._id);
|
|
232
|
+
await db.verificationCodes.create({
|
|
233
|
+
code: await sha256(code),
|
|
234
|
+
accountId,
|
|
235
|
+
provider,
|
|
236
|
+
expirationTime: Date.now() + OAUTH_SIGN_IN_EXPIRATION_MS,
|
|
237
|
+
verifier: verifier._id
|
|
238
|
+
});
|
|
239
|
+
return code;
|
|
240
|
+
}
|
|
241
|
+
/** Action-side wrapper that runs {@link userOAuthImpl} through the auth store. */
|
|
242
|
+
const callUserOAuth = async (ctx, args) => {
|
|
243
|
+
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
244
|
+
type: "userOAuth",
|
|
245
|
+
...args
|
|
246
|
+
} });
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
//#endregion
|
|
250
|
+
export { callUserOAuth, userOAuthImpl, vUserOAuthArgs };
|
|
251
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { emitAuthEvent, queueAuthEvent } from "../events.js";
|
|
2
|
+
import { authDb } from "../db.js";
|
|
3
|
+
import { log, maybeRedact } from "../log.js";
|
|
4
|
+
import { REFRESH_TOKEN_REUSE_WINDOW_MS, encodeRefreshToken, parseRefreshToken, refreshTokenExpirationTime } from "../token/refresh.js";
|
|
5
|
+
import { setActiveSpanAttributes, withSpan } from "../utils/span.js";
|
|
6
|
+
import { buildSessionIdentity, finalizeSessionIssuance } from "../session/lifecycle.js";
|
|
7
|
+
import { AUTH_STORE_REF } from "./store/refs.js";
|
|
8
|
+
import { buildKnownRefreshIdentityAttributes } from "../telemetry.js";
|
|
9
|
+
import { v } from "convex/values";
|
|
10
|
+
|
|
11
|
+
//#region src/server/mutations/refresh.ts
|
|
12
|
+
const vRefreshSessionArgs = v.object({ refreshToken: v.string() });
|
|
13
|
+
/**
|
|
14
|
+
* Exchange a refresh token and mint the next pair of session IDs + refresh
|
|
15
|
+
* token string. The RSA-2048 JWT signing used to live here; it has been
|
|
16
|
+
* moved to the action wrapper ({@link callRefreshSession}) so the mutation
|
|
17
|
+
* can commit without paying 5–30ms of CPU per refresh.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
async function refreshSessionImpl(ctx, args, config) {
|
|
22
|
+
const db = authDb(ctx, config);
|
|
23
|
+
return withSpan("convex-auth.refresh.session", {
|
|
24
|
+
hasRefreshToken: true,
|
|
25
|
+
"auth.flow": "refresh"
|
|
26
|
+
}, async () => {
|
|
27
|
+
try {
|
|
28
|
+
let refreshTokenId;
|
|
29
|
+
let sessionId;
|
|
30
|
+
try {
|
|
31
|
+
({refreshTokenId, sessionId} = parseRefreshToken(args.refreshToken));
|
|
32
|
+
} catch {
|
|
33
|
+
throw new RefreshFailure("parse_failure", "Failed to parse refresh token");
|
|
34
|
+
}
|
|
35
|
+
log("DEBUG", `refreshSessionImpl args: Token ID: ${maybeRedact(refreshTokenId)} Session ID: ${maybeRedact(sessionId)}`);
|
|
36
|
+
let exchanged;
|
|
37
|
+
try {
|
|
38
|
+
exchanged = await db.refreshTokens.exchange({
|
|
39
|
+
refreshTokenId,
|
|
40
|
+
sessionId,
|
|
41
|
+
now: Date.now(),
|
|
42
|
+
refreshTokenExpirationTime: refreshTokenExpirationTime(config),
|
|
43
|
+
reuseWindowMs: REFRESH_TOKEN_REUSE_WINDOW_MS
|
|
44
|
+
});
|
|
45
|
+
} catch {
|
|
46
|
+
throw new RefreshFailure("exchange_failure", "Failed to exchange refresh token");
|
|
47
|
+
}
|
|
48
|
+
if (exchanged.status === "reuse_detected") {
|
|
49
|
+
setActiveSpanAttributes({ "auth.refresh.result": "reuse_detected" });
|
|
50
|
+
await emitAuthEvent(ctx, config, {
|
|
51
|
+
kind: "session.refresh_reuse_detected",
|
|
52
|
+
actor: { type: "system" },
|
|
53
|
+
subject: {
|
|
54
|
+
type: "session",
|
|
55
|
+
id: sessionId
|
|
56
|
+
},
|
|
57
|
+
targets: [
|
|
58
|
+
{
|
|
59
|
+
kind: "user",
|
|
60
|
+
id: exchanged.userId
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
kind: "session",
|
|
64
|
+
id: sessionId
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
kind: "global",
|
|
68
|
+
id: "security"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
outcome: "failure",
|
|
72
|
+
data: {
|
|
73
|
+
userId: exchanged.userId,
|
|
74
|
+
refreshTokenId: exchanged.refreshTokenId
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (exchanged.status === "invalid") {
|
|
80
|
+
setActiveSpanAttributes({ "auth.refresh.result": "null" });
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
setActiveSpanAttributes({
|
|
84
|
+
"auth.refresh.result": "success",
|
|
85
|
+
...buildKnownRefreshIdentityAttributes(config, {
|
|
86
|
+
userId: exchanged.userId,
|
|
87
|
+
sessionId: exchanged.sessionId,
|
|
88
|
+
refreshTokenId: exchanged.refreshTokenId
|
|
89
|
+
}, exchanged.user.email)
|
|
90
|
+
});
|
|
91
|
+
await queueAuthEvent(ctx, config, {
|
|
92
|
+
kind: "session.refresh_exchanged",
|
|
93
|
+
actor: { type: "system" },
|
|
94
|
+
subject: {
|
|
95
|
+
type: "session",
|
|
96
|
+
id: exchanged.sessionId
|
|
97
|
+
},
|
|
98
|
+
targets: [{
|
|
99
|
+
kind: "user",
|
|
100
|
+
id: exchanged.userId
|
|
101
|
+
}, {
|
|
102
|
+
kind: "session",
|
|
103
|
+
id: exchanged.sessionId
|
|
104
|
+
}],
|
|
105
|
+
outcome: "success",
|
|
106
|
+
data: { sessionId: exchanged.sessionId }
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
userId: exchanged.userId,
|
|
110
|
+
sessionId: exchanged.sessionId,
|
|
111
|
+
identity: buildSessionIdentity(exchanged.userId, exchanged.sessionId, exchanged.user),
|
|
112
|
+
refreshToken: encodeRefreshToken(exchanged.refreshTokenId, exchanged.sessionId)
|
|
113
|
+
};
|
|
114
|
+
} catch (e) {
|
|
115
|
+
if (e instanceof RefreshFailure) {
|
|
116
|
+
setActiveSpanAttributes({
|
|
117
|
+
"auth.refresh.result": e.code,
|
|
118
|
+
"auth.refresh.failure_reason": e.reason
|
|
119
|
+
});
|
|
120
|
+
log("DEBUG", e.reason);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
var RefreshFailure = class extends Error {
|
|
128
|
+
constructor(code, reason) {
|
|
129
|
+
super(reason);
|
|
130
|
+
this.code = code;
|
|
131
|
+
this.reason = reason;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Action-side wrapper: exchange the refresh token via the mutation, then
|
|
136
|
+
* sign the next JWT outside the mutation transaction. See
|
|
137
|
+
* {@link refreshSessionImpl} for the rationale.
|
|
138
|
+
*
|
|
139
|
+
* @internal
|
|
140
|
+
*/
|
|
141
|
+
const callRefreshSession = async (ctx, args) => {
|
|
142
|
+
const issuance = await ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
143
|
+
type: "refreshSession",
|
|
144
|
+
...args
|
|
145
|
+
} });
|
|
146
|
+
if (issuance === null || issuance.refreshToken === null) return null;
|
|
147
|
+
return await finalizeSessionIssuance(ctx.auth.config, issuance);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
//#endregion
|
|
151
|
+
export { callRefreshSession, refreshSessionImpl, vRefreshSessionArgs };
|
|
152
|
+
//# sourceMappingURL=refresh.js.map
|