@pwfabric/runtime 0.0.0-stage → 1.0.0-rc.1
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/LICENSE +90 -0
- package/README.md +43 -2
- package/dist/a11y/announcer.d.ts +65 -0
- package/dist/a11y/announcer.js +140 -0
- package/dist/a11y/announcer.js.map +1 -0
- package/dist/a11y/contrast.d.ts +54 -0
- package/dist/a11y/contrast.js +93 -0
- package/dist/a11y/contrast.js.map +1 -0
- package/dist/a11y/focus.d.ts +123 -0
- package/dist/a11y/focus.js +282 -0
- package/dist/a11y/focus.js.map +1 -0
- package/dist/a11y/index.d.ts +21 -0
- package/dist/a11y/index.js +18 -0
- package/dist/a11y/index.js.map +1 -0
- package/dist/a11y/keyboard.d.ts +144 -0
- package/dist/a11y/keyboard.js +317 -0
- package/dist/a11y/keyboard.js.map +1 -0
- package/dist/adapters/default-image.d.ts +25 -0
- package/dist/adapters/default-image.js +37 -0
- package/dist/adapters/default-image.js.map +1 -0
- package/dist/adapters/index.d.ts +27 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/next-image.d.ts +38 -0
- package/dist/adapters/next-image.js +124 -0
- package/dist/adapters/next-image.js.map +1 -0
- package/dist/adapters/types.d.ts +61 -0
- package/dist/adapters/types.js +11 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/analytics/index.d.ts +14 -0
- package/dist/analytics/index.js +15 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +65 -0
- package/dist/analytics/tracker.js +251 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/analytics/types.d.ts +130 -0
- package/dist/analytics/types.js +11 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/provider.d.ts +132 -0
- package/dist/auth/provider.js +473 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/types.d.ts +117 -0
- package/dist/auth/types.js +9 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/binding/collection.d.ts +190 -0
- package/dist/binding/collection.js +358 -0
- package/dist/binding/collection.js.map +1 -0
- package/dist/binding/datasource.d.ts +319 -0
- package/dist/binding/datasource.js +556 -0
- package/dist/binding/datasource.js.map +1 -0
- package/dist/binding/engine.d.ts +65 -0
- package/dist/binding/engine.js +268 -0
- package/dist/binding/engine.js.map +1 -0
- package/dist/binding/expression.d.ts +150 -0
- package/dist/binding/expression.js +787 -0
- package/dist/binding/expression.js.map +1 -0
- package/dist/binding/index.d.ts +19 -0
- package/dist/binding/index.js +14 -0
- package/dist/binding/index.js.map +1 -0
- package/dist/binding/two-way.d.ts +149 -0
- package/dist/binding/two-way.js +462 -0
- package/dist/binding/two-way.js.map +1 -0
- package/dist/binding/types.d.ts +119 -0
- package/dist/binding/types.js +9 -0
- package/dist/binding/types.js.map +1 -0
- package/dist/blocks/component-types.d.ts +81 -0
- package/dist/blocks/component-types.js +11 -0
- package/dist/blocks/component-types.js.map +1 -0
- package/dist/blocks/composition-rules.d.ts +168 -0
- package/dist/blocks/composition-rules.js +391 -0
- package/dist/blocks/composition-rules.js.map +1 -0
- package/dist/blocks/hooks.d.ts +31 -0
- package/dist/blocks/hooks.js +42 -0
- package/dist/blocks/hooks.js.map +1 -0
- package/dist/blocks/index.d.ts +14 -0
- package/dist/blocks/index.js +23 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/registry.d.ts +84 -0
- package/dist/blocks/registry.js +136 -0
- package/dist/blocks/registry.js.map +1 -0
- package/dist/blocks/rule-engine.d.ts +131 -0
- package/dist/blocks/rule-engine.js +321 -0
- package/dist/blocks/rule-engine.js.map +1 -0
- package/dist/blocks/surface-event-context.d.ts +13 -0
- package/dist/blocks/surface-event-context.js +14 -0
- package/dist/blocks/surface-event-context.js.map +1 -0
- package/dist/blocks/surface-id-context.d.ts +13 -0
- package/dist/blocks/surface-id-context.js +15 -0
- package/dist/blocks/surface-id-context.js.map +1 -0
- package/dist/bus.d.ts +41 -0
- package/dist/bus.js +158 -0
- package/dist/bus.js.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.js +10 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory.d.ts +32 -0
- package/dist/cache/memory.js +138 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/types.d.ts +62 -0
- package/dist/cache/types.js +9 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/capability/index.d.ts +72 -0
- package/dist/capability/index.js +87 -0
- package/dist/capability/index.js.map +1 -0
- package/dist/capability/kernel-capabilities.d.ts +31 -0
- package/dist/capability/kernel-capabilities.js +36 -0
- package/dist/capability/kernel-capabilities.js.map +1 -0
- package/dist/capability/platform-capabilities.d.ts +71 -0
- package/dist/capability/platform-capabilities.js +267 -0
- package/dist/capability/platform-capabilities.js.map +1 -0
- package/dist/capability/type-mapping.d.ts +70 -0
- package/dist/capability/type-mapping.js +107 -0
- package/dist/capability/type-mapping.js.map +1 -0
- package/dist/capability/validation.d.ts +46 -0
- package/dist/capability/validation.js +54 -0
- package/dist/capability/validation.js.map +1 -0
- package/dist/connectors/declared-connector.d.ts +48 -0
- package/dist/connectors/declared-connector.js +333 -0
- package/dist/connectors/declared-connector.js.map +1 -0
- package/dist/connectors/engine-registry.d.ts +50 -0
- package/dist/connectors/engine-registry.js +135 -0
- package/dist/connectors/engine-registry.js.map +1 -0
- package/dist/connectors/index.d.ts +14 -0
- package/dist/connectors/index.js +14 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/module-loader.d.ts +70 -0
- package/dist/connectors/module-loader.js +143 -0
- package/dist/connectors/module-loader.js.map +1 -0
- package/dist/connectors/types.d.ts +174 -0
- package/dist/connectors/types.js +23 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/data/DataCapabilityProvider.d.ts +39 -0
- package/dist/data/DataCapabilityProvider.js +58 -0
- package/dist/data/DataCapabilityProvider.js.map +1 -0
- package/dist/data/index.d.ts +17 -0
- package/dist/data/index.js +18 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/manager.d.ts +40 -0
- package/dist/data/manager.js +442 -0
- package/dist/data/manager.js.map +1 -0
- package/dist/data/types.d.ts +218 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/entity/aggregate.d.ts +8 -0
- package/dist/entity/aggregate.js +24 -0
- package/dist/entity/aggregate.js.map +1 -0
- package/dist/entity/apply-query.d.ts +58 -0
- package/dist/entity/apply-query.js +264 -0
- package/dist/entity/apply-query.js.map +1 -0
- package/dist/entity/behavior.d.ts +94 -0
- package/dist/entity/behavior.js +78 -0
- package/dist/entity/behavior.js.map +1 -0
- package/dist/entity/connector.d.ts +141 -0
- package/dist/entity/connector.js +89 -0
- package/dist/entity/connector.js.map +1 -0
- package/dist/entity/connectors/index.d.ts +12 -0
- package/dist/entity/connectors/index.js +11 -0
- package/dist/entity/connectors/index.js.map +1 -0
- package/dist/entity/connectors/static.d.ts +51 -0
- package/dist/entity/connectors/static.js +245 -0
- package/dist/entity/connectors/static.js.map +1 -0
- package/dist/entity/entity-datasource.d.ts +50 -0
- package/dist/entity/entity-datasource.js +33 -0
- package/dist/entity/entity-datasource.js.map +1 -0
- package/dist/entity/facade.d.ts +70 -0
- package/dist/entity/facade.js +70 -0
- package/dist/entity/facade.js.map +1 -0
- package/dist/entity/http-connector.d.ts +123 -0
- package/dist/entity/http-connector.js +295 -0
- package/dist/entity/http-connector.js.map +1 -0
- package/dist/entity/index.d.ts +38 -0
- package/dist/entity/index.js +31 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/postgres-connector.d.ts +64 -0
- package/dist/entity/postgres-connector.js +239 -0
- package/dist/entity/postgres-connector.js.map +1 -0
- package/dist/entity/registry.d.ts +59 -0
- package/dist/entity/registry.js +90 -0
- package/dist/entity/registry.js.map +1 -0
- package/dist/entity/store.d.ts +66 -0
- package/dist/entity/store.js +349 -0
- package/dist/entity/store.js.map +1 -0
- package/dist/entity/types.d.ts +180 -0
- package/dist/entity/types.js +10 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/execution-context.d.ts +88 -0
- package/dist/execution-context.js +146 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/executor.d.ts +27 -0
- package/dist/executor.js +33 -0
- package/dist/executor.js.map +1 -0
- package/dist/forms/form-entity-bridge.d.ts +94 -0
- package/dist/forms/form-entity-bridge.js +96 -0
- package/dist/forms/form-entity-bridge.js.map +1 -0
- package/dist/forms/form-write-target.d.ts +34 -0
- package/dist/forms/form-write-target.js +81 -0
- package/dist/forms/form-write-target.js.map +1 -0
- package/dist/forms/index.d.ts +22 -0
- package/dist/forms/index.js +25 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/named-control-values.d.ts +27 -0
- package/dist/forms/named-control-values.js +42 -0
- package/dist/forms/named-control-values.js.map +1 -0
- package/dist/forms/processor.d.ts +55 -0
- package/dist/forms/processor.js +154 -0
- package/dist/forms/processor.js.map +1 -0
- package/dist/forms/types.d.ts +174 -0
- package/dist/forms/types.js +33 -0
- package/dist/forms/types.js.map +1 -0
- package/dist/forms/validator.d.ts +61 -0
- package/dist/forms/validator.js +218 -0
- package/dist/forms/validator.js.map +1 -0
- package/dist/graph/index.d.ts +10 -0
- package/dist/graph/index.js +9 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/resolver.d.ts +66 -0
- package/dist/graph/resolver.js +243 -0
- package/dist/graph/resolver.js.map +1 -0
- package/dist/graph/types.d.ts +125 -0
- package/dist/graph/types.js +9 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/hooks/useInstalledAtoms.d.ts +96 -0
- package/dist/hooks/useInstalledAtoms.js +92 -0
- package/dist/hooks/useInstalledAtoms.js.map +1 -0
- package/dist/i18n/index.d.ts +15 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/translator.d.ts +76 -0
- package/dist/i18n/translator.js +357 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/i18n/types.d.ts +93 -0
- package/dist/i18n/types.js +9 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +47 -0
- package/dist/kernel.js +258 -0
- package/dist/kernel.js.map +1 -0
- package/dist/perf/budget.d.ts +92 -0
- package/dist/perf/budget.js +122 -0
- package/dist/perf/budget.js.map +1 -0
- package/dist/perf/index.d.ts +16 -0
- package/dist/perf/index.js +13 -0
- package/dist/perf/index.js.map +1 -0
- package/dist/perf/render-timer.d.ts +90 -0
- package/dist/perf/render-timer.js +136 -0
- package/dist/perf/render-timer.js.map +1 -0
- package/dist/perf/reporter.d.ts +126 -0
- package/dist/perf/reporter.js +241 -0
- package/dist/perf/reporter.js.map +1 -0
- package/dist/perf/web-vitals.d.ts +111 -0
- package/dist/perf/web-vitals.js +268 -0
- package/dist/perf/web-vitals.js.map +1 -0
- package/dist/registry.d.ts +63 -0
- package/dist/registry.js +126 -0
- package/dist/registry.js.map +1 -0
- package/dist/render/BehaviorSurfaceProvider.d.ts +65 -0
- package/dist/render/BehaviorSurfaceProvider.js +185 -0
- package/dist/render/BehaviorSurfaceProvider.js.map +1 -0
- package/dist/render/BlockErrorBoundary.d.ts +26 -0
- package/dist/render/BlockErrorBoundary.js +41 -0
- package/dist/render/BlockErrorBoundary.js.map +1 -0
- package/dist/render/DataBoundSurfaceRenderer.d.ts +78 -0
- package/dist/render/DataBoundSurfaceRenderer.js +998 -0
- package/dist/render/DataBoundSurfaceRenderer.js.map +1 -0
- package/dist/render/DynamicBlockWrapper.d.ts +23 -0
- package/dist/render/DynamicBlockWrapper.js +117 -0
- package/dist/render/DynamicBlockWrapper.js.map +1 -0
- package/dist/render/appearance-resolver.d.ts +50 -0
- package/dist/render/appearance-resolver.js +78 -0
- package/dist/render/appearance-resolver.js.map +1 -0
- package/dist/render/capability-gate.d.ts +69 -0
- package/dist/render/capability-gate.js +94 -0
- package/dist/render/capability-gate.js.map +1 -0
- package/dist/render/conditional-states-css.d.ts +41 -0
- package/dist/render/conditional-states-css.js +82 -0
- package/dist/render/conditional-states-css.js.map +1 -0
- package/dist/render/connections-context.d.ts +31 -0
- package/dist/render/connections-context.js +34 -0
- package/dist/render/connections-context.js.map +1 -0
- package/dist/render/dark-theme-css.d.ts +36 -0
- package/dist/render/dark-theme-css.js +67 -0
- package/dist/render/dark-theme-css.js.map +1 -0
- package/dist/render/data-binding-types.d.ts +191 -0
- package/dist/render/data-binding-types.js +11 -0
- package/dist/render/data-binding-types.js.map +1 -0
- package/dist/render/data-cache.d.ts +30 -0
- package/dist/render/data-cache.js +37 -0
- package/dist/render/data-cache.js.map +1 -0
- package/dist/render/derive-dark-theme.d.ts +17 -0
- package/dist/render/derive-dark-theme.js +18 -0
- package/dist/render/derive-dark-theme.js.map +1 -0
- package/dist/render/dynamic-artifact-context.d.ts +77 -0
- package/dist/render/dynamic-artifact-context.js +89 -0
- package/dist/render/dynamic-artifact-context.js.map +1 -0
- package/dist/render/dynamic-block-loader.d.ts +80 -0
- package/dist/render/dynamic-block-loader.js +197 -0
- package/dist/render/dynamic-block-loader.js.map +1 -0
- package/dist/render/endpoint.d.ts +18 -0
- package/dist/render/endpoint.js +109 -0
- package/dist/render/endpoint.js.map +1 -0
- package/dist/render/entity-facade-context.d.ts +34 -0
- package/dist/render/entity-facade-context.js +37 -0
- package/dist/render/entity-facade-context.js.map +1 -0
- package/dist/render/group-states-css.d.ts +41 -0
- package/dist/render/group-states-css.js +73 -0
- package/dist/render/group-states-css.js.map +1 -0
- package/dist/render/hooks/useSurfaceEvents.d.ts +8 -0
- package/dist/render/hooks/useSurfaceEvents.js +9 -0
- package/dist/render/hooks/useSurfaceEvents.js.map +1 -0
- package/dist/render/hooks/useSurfaceId.d.ts +8 -0
- package/dist/render/hooks/useSurfaceId.js +9 -0
- package/dist/render/hooks/useSurfaceId.js.map +1 -0
- package/dist/render/index.d.ts +48 -0
- package/dist/render/index.js +61 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/interaction-rule-engine.d.ts +12 -0
- package/dist/render/interaction-rule-engine.js +47 -0
- package/dist/render/interaction-rule-engine.js.map +1 -0
- package/dist/render/keyframes-css.d.ts +31 -0
- package/dist/render/keyframes-css.js +44 -0
- package/dist/render/keyframes-css.js.map +1 -0
- package/dist/render/query-state.d.ts +3 -0
- package/dist/render/query-state.js +70 -0
- package/dist/render/query-state.js.map +1 -0
- package/dist/render/renderer.d.ts +44 -0
- package/dist/render/renderer.js +937 -0
- package/dist/render/renderer.js.map +1 -0
- package/dist/render/resolve-expressions.d.ts +37 -0
- package/dist/render/resolve-expressions.js +309 -0
- package/dist/render/resolve-expressions.js.map +1 -0
- package/dist/render/responsive-style-css.d.ts +42 -0
- package/dist/render/responsive-style-css.js +123 -0
- package/dist/render/responsive-style-css.js.map +1 -0
- package/dist/render/responsive.d.ts +49 -0
- package/dist/render/responsive.js +99 -0
- package/dist/render/responsive.js.map +1 -0
- package/dist/render/scoped-css.d.ts +71 -0
- package/dist/render/scoped-css.js +102 -0
- package/dist/render/scoped-css.js.map +1 -0
- package/dist/render/shell-selection.d.ts +69 -0
- package/dist/render/shell-selection.js +117 -0
- package/dist/render/shell-selection.js.map +1 -0
- package/dist/render/states-css.d.ts +32 -0
- package/dist/render/states-css.js +63 -0
- package/dist/render/states-css.js.map +1 -0
- package/dist/render/surface-data-context.d.ts +18 -0
- package/dist/render/surface-data-context.js +21 -0
- package/dist/render/surface-data-context.js.map +1 -0
- package/dist/render/surface-event-bus.d.ts +19 -0
- package/dist/render/surface-event-bus.js +68 -0
- package/dist/render/surface-event-bus.js.map +1 -0
- package/dist/render/surface-event-context.d.ts +11 -0
- package/dist/render/surface-event-context.js +12 -0
- package/dist/render/surface-event-context.js.map +1 -0
- package/dist/render/surface-id-context.d.ts +8 -0
- package/dist/render/surface-id-context.js +9 -0
- package/dist/render/surface-id-context.js.map +1 -0
- package/dist/render/theme-utils.d.ts +14 -0
- package/dist/render/theme-utils.js +15 -0
- package/dist/render/theme-utils.js.map +1 -0
- package/dist/render/types.d.ts +282 -0
- package/dist/render/types.js +9 -0
- package/dist/render/types.js.map +1 -0
- package/dist/render/visibility-css.d.ts +42 -0
- package/dist/render/visibility-css.js +119 -0
- package/dist/render/visibility-css.js.map +1 -0
- package/dist/render/width-scope.d.ts +34 -0
- package/dist/render/width-scope.js +44 -0
- package/dist/render/width-scope.js.map +1 -0
- package/dist/render/write-only-sources.d.ts +33 -0
- package/dist/render/write-only-sources.js +99 -0
- package/dist/render/write-only-sources.js.map +1 -0
- package/dist/routing/index.d.ts +14 -0
- package/dist/routing/index.js +15 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/router.d.ts +42 -0
- package/dist/routing/router.js +218 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/routing/types.d.ts +124 -0
- package/dist/routing/types.js +9 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/seo/generator.d.ts +39 -0
- package/dist/seo/generator.js +236 -0
- package/dist/seo/generator.js.map +1 -0
- package/dist/seo/index.d.ts +14 -0
- package/dist/seo/index.js +15 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/types.d.ts +181 -0
- package/dist/seo/types.js +9 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/state/index.d.ts +15 -0
- package/dist/state/index.js +16 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/manager.d.ts +33 -0
- package/dist/state/manager.js +81 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/store.d.ts +40 -0
- package/dist/state/store.js +145 -0
- package/dist/state/store.js.map +1 -0
- package/dist/state/types.d.ts +107 -0
- package/dist/state/types.js +9 -0
- package/dist/state/types.js.map +1 -0
- package/dist/surface/expression.d.ts +65 -0
- package/dist/surface/expression.js +179 -0
- package/dist/surface/expression.js.map +1 -0
- package/dist/surface/index.d.ts +32 -0
- package/dist/surface/index.js +25 -0
- package/dist/surface/index.js.map +1 -0
- package/dist/surface/interpreter.d.ts +96 -0
- package/dist/surface/interpreter.js +231 -0
- package/dist/surface/interpreter.js.map +1 -0
- package/dist/surface/layout.d.ts +54 -0
- package/dist/surface/layout.js +288 -0
- package/dist/surface/layout.js.map +1 -0
- package/dist/surface/output.d.ts +90 -0
- package/dist/surface/output.js +104 -0
- package/dist/surface/output.js.map +1 -0
- package/dist/surface/primitives.d.ts +180 -0
- package/dist/surface/primitives.js +339 -0
- package/dist/surface/primitives.js.map +1 -0
- package/dist/surface/renderer.d.ts +96 -0
- package/dist/surface/renderer.js +190 -0
- package/dist/surface/renderer.js.map +1 -0
- package/dist/surface/schemas.d.ts +181 -0
- package/dist/surface/schemas.js +142 -0
- package/dist/surface/schemas.js.map +1 -0
- package/dist/surface/transforms.d.ts +144 -0
- package/dist/surface/transforms.js +120 -0
- package/dist/surface/transforms.js.map +1 -0
- package/dist/surface/types.d.ts +160 -0
- package/dist/surface/types.js +51 -0
- package/dist/surface/types.js.map +1 -0
- package/dist/surface/validation.d.ts +123 -0
- package/dist/surface/validation.js +147 -0
- package/dist/surface/validation.js.map +1 -0
- package/dist/validator.d.ts +55 -0
- package/dist/validator.js +100 -0
- package/dist/validator.js.map +1 -0
- package/package.json +106 -3
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Provider
|
|
3
|
+
*
|
|
4
|
+
* Authentication provider interface and implementations
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/auth/provider
|
|
7
|
+
*/
|
|
8
|
+
import type { AuthProviderType, AuthProviderConfig, MsalConfig, OAuth2Config, ApiKeyConfig, AuthSession, AuthResult, TokenResult, UserIdentity } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Authentication provider interface
|
|
11
|
+
*/
|
|
12
|
+
export interface AuthProvider {
|
|
13
|
+
readonly type: AuthProviderType;
|
|
14
|
+
readonly config: AuthProviderConfig;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the provider
|
|
17
|
+
*/
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Start authentication flow
|
|
21
|
+
*/
|
|
22
|
+
login(options?: LoginOptions): Promise<AuthResult>;
|
|
23
|
+
/**
|
|
24
|
+
* End authentication session
|
|
25
|
+
*/
|
|
26
|
+
logout(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Get current session
|
|
29
|
+
*/
|
|
30
|
+
getSession(): AuthSession | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Acquire token silently
|
|
33
|
+
*/
|
|
34
|
+
acquireTokenSilent(scopes?: readonly string[]): Promise<TokenResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if authenticated
|
|
37
|
+
*/
|
|
38
|
+
isAuthenticated(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get current user
|
|
41
|
+
*/
|
|
42
|
+
getUser(): UserIdentity | undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Login options
|
|
46
|
+
*/
|
|
47
|
+
export interface LoginOptions {
|
|
48
|
+
readonly scopes?: readonly string[];
|
|
49
|
+
readonly prompt?: 'login' | 'consent' | 'select_account' | 'none';
|
|
50
|
+
readonly loginHint?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* MSAL authentication provider
|
|
54
|
+
*
|
|
55
|
+
* Note: This is a stub implementation. In production, this would
|
|
56
|
+
* integrate with @azure/msal-browser or @azure/msal-node.
|
|
57
|
+
*/
|
|
58
|
+
export declare class MsalAuthProvider implements AuthProvider {
|
|
59
|
+
readonly type: AuthProviderType;
|
|
60
|
+
readonly config: MsalConfig;
|
|
61
|
+
private session;
|
|
62
|
+
private initialized;
|
|
63
|
+
constructor(config: MsalConfig);
|
|
64
|
+
initialize(): Promise<void>;
|
|
65
|
+
login(options?: LoginOptions): Promise<AuthResult>;
|
|
66
|
+
logout(): Promise<void>;
|
|
67
|
+
getSession(): AuthSession | undefined;
|
|
68
|
+
acquireTokenSilent(_scopes?: readonly string[]): Promise<TokenResult>;
|
|
69
|
+
isAuthenticated(): boolean;
|
|
70
|
+
getUser(): UserIdentity | undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* OAuth2 PKCE authentication provider
|
|
74
|
+
*
|
|
75
|
+
* Implements the Authorization Code flow with PKCE (RFC 7636)
|
|
76
|
+
* for secure authentication without client secrets.
|
|
77
|
+
*/
|
|
78
|
+
export declare class OAuth2PkceAuthProvider implements AuthProvider {
|
|
79
|
+
readonly type: AuthProviderType;
|
|
80
|
+
readonly config: OAuth2Config;
|
|
81
|
+
private session;
|
|
82
|
+
private codeVerifier;
|
|
83
|
+
private initialized;
|
|
84
|
+
constructor(config: OAuth2Config);
|
|
85
|
+
initialize(): Promise<void>;
|
|
86
|
+
login(options?: LoginOptions): Promise<AuthResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Exchange authorization code for tokens (PKCE Step 2)
|
|
89
|
+
*
|
|
90
|
+
* Called after the user completes the OAuth flow and the authorization
|
|
91
|
+
* code is received via the redirect URI.
|
|
92
|
+
*/
|
|
93
|
+
exchangeCode(code: string): Promise<AuthResult>;
|
|
94
|
+
logout(): Promise<void>;
|
|
95
|
+
getSession(): AuthSession | undefined;
|
|
96
|
+
acquireTokenSilent(_scopes?: readonly string[]): Promise<TokenResult>;
|
|
97
|
+
isAuthenticated(): boolean;
|
|
98
|
+
getUser(): UserIdentity | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Refresh the access token using a refresh token
|
|
101
|
+
*/
|
|
102
|
+
private refreshToken;
|
|
103
|
+
/**
|
|
104
|
+
* Decode user identity from JWT token claims
|
|
105
|
+
*/
|
|
106
|
+
private decodeUserFromToken;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* API Key authentication provider
|
|
110
|
+
*/
|
|
111
|
+
export declare class ApiKeyAuthProvider implements AuthProvider {
|
|
112
|
+
readonly type: AuthProviderType;
|
|
113
|
+
readonly config: ApiKeyConfig;
|
|
114
|
+
private session;
|
|
115
|
+
private apiKey;
|
|
116
|
+
constructor(config: ApiKeyConfig);
|
|
117
|
+
initialize(): Promise<void>;
|
|
118
|
+
login(_options?: LoginOptions): Promise<AuthResult>;
|
|
119
|
+
logout(): Promise<void>;
|
|
120
|
+
getSession(): AuthSession | undefined;
|
|
121
|
+
acquireTokenSilent(): Promise<TokenResult>;
|
|
122
|
+
isAuthenticated(): boolean;
|
|
123
|
+
getUser(): UserIdentity | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Set the API key
|
|
126
|
+
*/
|
|
127
|
+
setApiKey(key: string): void;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create an authentication provider
|
|
131
|
+
*/
|
|
132
|
+
export declare function createAuthProvider(config: AuthProviderConfig): AuthProvider;
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Provider
|
|
3
|
+
*
|
|
4
|
+
* Authentication provider interface and implementations
|
|
5
|
+
*
|
|
6
|
+
* @module @pwfabric/runtime/auth/provider
|
|
7
|
+
*/
|
|
8
|
+
// ============================================================
|
|
9
|
+
// MSAL AUTH PROVIDER (Stub)
|
|
10
|
+
// ============================================================
|
|
11
|
+
/**
|
|
12
|
+
* MSAL authentication provider
|
|
13
|
+
*
|
|
14
|
+
* Note: This is a stub implementation. In production, this would
|
|
15
|
+
* integrate with @azure/msal-browser or @azure/msal-node.
|
|
16
|
+
*/
|
|
17
|
+
export class MsalAuthProvider {
|
|
18
|
+
type = 'msal';
|
|
19
|
+
config;
|
|
20
|
+
session;
|
|
21
|
+
initialized = false;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
}
|
|
25
|
+
async initialize() {
|
|
26
|
+
// In production: Initialize MSAL instance
|
|
27
|
+
this.initialized = true;
|
|
28
|
+
}
|
|
29
|
+
async login(options) {
|
|
30
|
+
if (!this.initialized) {
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: {
|
|
34
|
+
type: 'invalid_config',
|
|
35
|
+
message: 'Provider not initialized',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Stub: Create mock session
|
|
40
|
+
const scopes = options?.scopes ?? this.config.scopes;
|
|
41
|
+
const token = {
|
|
42
|
+
accessToken: 'mock_access_token',
|
|
43
|
+
idToken: 'mock_id_token',
|
|
44
|
+
expiresAt: Date.now() + 3600000, // 1 hour
|
|
45
|
+
scopes,
|
|
46
|
+
};
|
|
47
|
+
const user = {
|
|
48
|
+
id: 'mock_user_id',
|
|
49
|
+
name: 'Mock User',
|
|
50
|
+
email: 'mock@example.com',
|
|
51
|
+
...(this.config.worldId !== undefined ? { worldId: this.config.worldId } : {}),
|
|
52
|
+
};
|
|
53
|
+
this.session = {
|
|
54
|
+
id: `session_${Date.now()}`,
|
|
55
|
+
state: 'authenticated',
|
|
56
|
+
user,
|
|
57
|
+
token,
|
|
58
|
+
provider: 'msal',
|
|
59
|
+
createdAt: Date.now(),
|
|
60
|
+
expiresAt: token.expiresAt,
|
|
61
|
+
};
|
|
62
|
+
return { success: true, session: this.session };
|
|
63
|
+
}
|
|
64
|
+
async logout() {
|
|
65
|
+
this.session = undefined;
|
|
66
|
+
}
|
|
67
|
+
getSession() {
|
|
68
|
+
return this.session;
|
|
69
|
+
}
|
|
70
|
+
async acquireTokenSilent(_scopes) {
|
|
71
|
+
if (!this.session?.token) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: {
|
|
75
|
+
type: 'token_expired',
|
|
76
|
+
message: 'No active session',
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Check if token is expired
|
|
81
|
+
if (this.session.token.expiresAt < Date.now()) {
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: {
|
|
85
|
+
type: 'token_expired',
|
|
86
|
+
message: 'Token has expired',
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return { success: true, token: this.session.token };
|
|
91
|
+
}
|
|
92
|
+
isAuthenticated() {
|
|
93
|
+
return this.session?.state === 'authenticated';
|
|
94
|
+
}
|
|
95
|
+
getUser() {
|
|
96
|
+
return this.session?.user;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ============================================================
|
|
100
|
+
// OAUTH2 PKCE AUTH PROVIDER
|
|
101
|
+
// ============================================================
|
|
102
|
+
/**
|
|
103
|
+
* Generate a cryptographically random code verifier for PKCE
|
|
104
|
+
*/
|
|
105
|
+
function generateCodeVerifier() {
|
|
106
|
+
const buffer = new Uint8Array(32);
|
|
107
|
+
crypto.getRandomValues(buffer);
|
|
108
|
+
return Array.from(buffer, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate a code challenge from a code verifier (S256 method)
|
|
112
|
+
*/
|
|
113
|
+
async function generateCodeChallenge(verifier) {
|
|
114
|
+
const encoder = new TextEncoder();
|
|
115
|
+
const data = encoder.encode(verifier);
|
|
116
|
+
const digest = await crypto.subtle.digest('SHA-256', data);
|
|
117
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest)))
|
|
118
|
+
.replace(/\+/g, '-')
|
|
119
|
+
.replace(/\//g, '_')
|
|
120
|
+
.replace(/=+$/, '');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* OAuth2 PKCE authentication provider
|
|
124
|
+
*
|
|
125
|
+
* Implements the Authorization Code flow with PKCE (RFC 7636)
|
|
126
|
+
* for secure authentication without client secrets.
|
|
127
|
+
*/
|
|
128
|
+
export class OAuth2PkceAuthProvider {
|
|
129
|
+
type = 'oauth2';
|
|
130
|
+
config;
|
|
131
|
+
session;
|
|
132
|
+
codeVerifier;
|
|
133
|
+
initialized = false;
|
|
134
|
+
constructor(config) {
|
|
135
|
+
this.config = config;
|
|
136
|
+
}
|
|
137
|
+
async initialize() {
|
|
138
|
+
this.initialized = true;
|
|
139
|
+
}
|
|
140
|
+
async login(options) {
|
|
141
|
+
if (!this.initialized) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: { type: 'invalid_config', message: 'Provider not initialized' },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
// Step 1: Generate PKCE code verifier and challenge
|
|
149
|
+
this.codeVerifier = generateCodeVerifier();
|
|
150
|
+
const codeChallenge = await generateCodeChallenge(this.codeVerifier);
|
|
151
|
+
const state = generateCodeVerifier().slice(0, 32);
|
|
152
|
+
const scopes = options?.scopes ?? this.config.scopes;
|
|
153
|
+
// Step 2: Build authorization URL
|
|
154
|
+
const authUrl = new URL(this.config.authorizationEndpoint);
|
|
155
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
156
|
+
authUrl.searchParams.set('client_id', this.config.clientId);
|
|
157
|
+
authUrl.searchParams.set('redirect_uri', this.config.redirectUri);
|
|
158
|
+
authUrl.searchParams.set('scope', scopes.join(' '));
|
|
159
|
+
authUrl.searchParams.set('state', state);
|
|
160
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
161
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
162
|
+
if (options?.prompt) {
|
|
163
|
+
authUrl.searchParams.set('prompt', options.prompt);
|
|
164
|
+
}
|
|
165
|
+
if (options?.loginHint) {
|
|
166
|
+
authUrl.searchParams.set('login_hint', options.loginHint);
|
|
167
|
+
}
|
|
168
|
+
// Step 3: Return the authorization URL for the caller to open
|
|
169
|
+
// In browser context, this would redirect. In CLI, the caller
|
|
170
|
+
// starts a local server to capture the callback.
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
error: {
|
|
174
|
+
type: 'provider_error',
|
|
175
|
+
message: 'PKCE_REDIRECT_REQUIRED',
|
|
176
|
+
code: authUrl.toString(),
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
error: {
|
|
184
|
+
type: 'provider_error',
|
|
185
|
+
message: error instanceof Error ? error.message : 'OAuth2 login failed',
|
|
186
|
+
cause: error,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Exchange authorization code for tokens (PKCE Step 2)
|
|
193
|
+
*
|
|
194
|
+
* Called after the user completes the OAuth flow and the authorization
|
|
195
|
+
* code is received via the redirect URI.
|
|
196
|
+
*/
|
|
197
|
+
async exchangeCode(code) {
|
|
198
|
+
if (!this.codeVerifier) {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
error: { type: 'invalid_config', message: 'No PKCE flow in progress. Call login() first.' },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const response = await fetch(this.config.tokenEndpoint, {
|
|
206
|
+
method: 'POST',
|
|
207
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
208
|
+
body: new URLSearchParams({
|
|
209
|
+
grant_type: 'authorization_code',
|
|
210
|
+
code,
|
|
211
|
+
redirect_uri: this.config.redirectUri,
|
|
212
|
+
client_id: this.config.clientId,
|
|
213
|
+
code_verifier: this.codeVerifier,
|
|
214
|
+
}),
|
|
215
|
+
});
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
const errorBody = await response.text();
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
error: {
|
|
221
|
+
type: 'provider_error',
|
|
222
|
+
message: `Token exchange failed: ${response.status}`,
|
|
223
|
+
code: errorBody,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
const tokenData = (await response.json());
|
|
228
|
+
const token = {
|
|
229
|
+
accessToken: tokenData.access_token,
|
|
230
|
+
...(tokenData.refresh_token !== undefined ? { refreshToken: tokenData.refresh_token } : {}),
|
|
231
|
+
...(tokenData.id_token !== undefined ? { idToken: tokenData.id_token } : {}),
|
|
232
|
+
expiresAt: Date.now() + tokenData.expires_in * 1000,
|
|
233
|
+
scopes: tokenData.scope?.split(' ') ?? this.config.scopes,
|
|
234
|
+
};
|
|
235
|
+
// Decode user info from ID token or access token claims
|
|
236
|
+
const user = this.decodeUserFromToken(token);
|
|
237
|
+
this.session = {
|
|
238
|
+
id: `session_${Date.now()}`,
|
|
239
|
+
state: 'authenticated',
|
|
240
|
+
...(user !== undefined ? { user } : {}),
|
|
241
|
+
token,
|
|
242
|
+
provider: 'oauth2',
|
|
243
|
+
createdAt: Date.now(),
|
|
244
|
+
expiresAt: token.expiresAt,
|
|
245
|
+
};
|
|
246
|
+
// Clear the code verifier after successful exchange
|
|
247
|
+
this.codeVerifier = undefined;
|
|
248
|
+
return { success: true, session: this.session };
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
return {
|
|
252
|
+
success: false,
|
|
253
|
+
error: {
|
|
254
|
+
type: 'network_error',
|
|
255
|
+
message: error instanceof Error ? error.message : 'Token exchange failed',
|
|
256
|
+
cause: error,
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async logout() {
|
|
262
|
+
this.session = undefined;
|
|
263
|
+
this.codeVerifier = undefined;
|
|
264
|
+
}
|
|
265
|
+
getSession() {
|
|
266
|
+
return this.session;
|
|
267
|
+
}
|
|
268
|
+
async acquireTokenSilent(_scopes) {
|
|
269
|
+
if (!this.session?.token) {
|
|
270
|
+
return {
|
|
271
|
+
success: false,
|
|
272
|
+
error: { type: 'token_expired', message: 'No active session' },
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Check if token is expired
|
|
276
|
+
if (this.session.token.expiresAt < Date.now()) {
|
|
277
|
+
// Try refresh if refresh token available
|
|
278
|
+
if (this.session.token.refreshToken) {
|
|
279
|
+
return this.refreshToken(this.session.token.refreshToken);
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
error: {
|
|
284
|
+
type: 'token_expired',
|
|
285
|
+
message: 'Token has expired and no refresh token available',
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
return { success: true, token: this.session.token };
|
|
290
|
+
}
|
|
291
|
+
isAuthenticated() {
|
|
292
|
+
if (this.session?.state !== 'authenticated')
|
|
293
|
+
return false;
|
|
294
|
+
if (this.session.token && this.session.token.expiresAt < Date.now())
|
|
295
|
+
return false;
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
getUser() {
|
|
299
|
+
return this.session?.user;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Refresh the access token using a refresh token
|
|
303
|
+
*/
|
|
304
|
+
async refreshToken(refreshToken) {
|
|
305
|
+
try {
|
|
306
|
+
const response = await fetch(this.config.tokenEndpoint, {
|
|
307
|
+
method: 'POST',
|
|
308
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
309
|
+
body: new URLSearchParams({
|
|
310
|
+
grant_type: 'refresh_token',
|
|
311
|
+
refresh_token: refreshToken,
|
|
312
|
+
client_id: this.config.clientId,
|
|
313
|
+
}),
|
|
314
|
+
});
|
|
315
|
+
if (!response.ok) {
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
error: { type: 'token_expired', message: `Refresh failed: ${response.status}` },
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const tokenData = (await response.json());
|
|
322
|
+
const newRefreshToken = tokenData.refresh_token ?? refreshToken;
|
|
323
|
+
const token = {
|
|
324
|
+
accessToken: tokenData.access_token,
|
|
325
|
+
refreshToken: newRefreshToken,
|
|
326
|
+
...(tokenData.id_token !== undefined ? { idToken: tokenData.id_token } : {}),
|
|
327
|
+
expiresAt: Date.now() + tokenData.expires_in * 1000,
|
|
328
|
+
scopes: tokenData.scope?.split(' ') ?? this.config.scopes,
|
|
329
|
+
};
|
|
330
|
+
// Update session with new token
|
|
331
|
+
const user = this.decodeUserFromToken(token) ?? this.session?.user;
|
|
332
|
+
this.session = {
|
|
333
|
+
id: this.session?.id ?? `session_${Date.now()}`,
|
|
334
|
+
state: 'authenticated',
|
|
335
|
+
...(user !== undefined ? { user } : {}),
|
|
336
|
+
token,
|
|
337
|
+
provider: 'oauth2',
|
|
338
|
+
createdAt: this.session?.createdAt ?? Date.now(),
|
|
339
|
+
expiresAt: token.expiresAt,
|
|
340
|
+
};
|
|
341
|
+
return { success: true, token };
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
return {
|
|
345
|
+
success: false,
|
|
346
|
+
error: {
|
|
347
|
+
type: 'network_error',
|
|
348
|
+
message: error instanceof Error ? error.message : 'Token refresh failed',
|
|
349
|
+
cause: error,
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Decode user identity from JWT token claims
|
|
356
|
+
*/
|
|
357
|
+
decodeUserFromToken(token) {
|
|
358
|
+
const jwtToDecode = token.idToken ?? token.accessToken;
|
|
359
|
+
try {
|
|
360
|
+
const parts = jwtToDecode.split('.');
|
|
361
|
+
if (parts.length !== 3)
|
|
362
|
+
return undefined;
|
|
363
|
+
const encodedPayload = parts[1];
|
|
364
|
+
if (!encodedPayload)
|
|
365
|
+
return undefined;
|
|
366
|
+
const payload = JSON.parse(atob(encodedPayload.replace(/-/g, '+').replace(/_/g, '/')));
|
|
367
|
+
return {
|
|
368
|
+
id: payload.sub ?? 'unknown',
|
|
369
|
+
...(payload.name !== undefined ? { name: payload.name } : {}),
|
|
370
|
+
...(payload.email !== undefined ? { email: payload.email } : {}),
|
|
371
|
+
...(payload.wid !== undefined ? { worldId: payload.wid } : {}),
|
|
372
|
+
...(payload.roles !== undefined ? { roles: payload.roles } : {}),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// ============================================================
|
|
381
|
+
// API KEY AUTH PROVIDER
|
|
382
|
+
// ============================================================
|
|
383
|
+
/**
|
|
384
|
+
* API Key authentication provider
|
|
385
|
+
*/
|
|
386
|
+
export class ApiKeyAuthProvider {
|
|
387
|
+
type = 'api-key';
|
|
388
|
+
config;
|
|
389
|
+
session;
|
|
390
|
+
apiKey;
|
|
391
|
+
constructor(config) {
|
|
392
|
+
this.config = config;
|
|
393
|
+
}
|
|
394
|
+
async initialize() {
|
|
395
|
+
// No initialization needed
|
|
396
|
+
}
|
|
397
|
+
async login(_options) {
|
|
398
|
+
// API key auth doesn't have a login flow
|
|
399
|
+
// The key is typically set via setApiKey()
|
|
400
|
+
if (!this.apiKey) {
|
|
401
|
+
return {
|
|
402
|
+
success: false,
|
|
403
|
+
error: {
|
|
404
|
+
type: 'invalid_credentials',
|
|
405
|
+
message: 'API key not set',
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
const token = {
|
|
410
|
+
accessToken: this.apiKey,
|
|
411
|
+
expiresAt: Date.now() + 86400000, // 24 hours
|
|
412
|
+
scopes: [],
|
|
413
|
+
};
|
|
414
|
+
this.session = {
|
|
415
|
+
id: `session_${Date.now()}`,
|
|
416
|
+
state: 'authenticated',
|
|
417
|
+
token,
|
|
418
|
+
provider: 'api-key',
|
|
419
|
+
createdAt: Date.now(),
|
|
420
|
+
};
|
|
421
|
+
return { success: true, session: this.session };
|
|
422
|
+
}
|
|
423
|
+
async logout() {
|
|
424
|
+
this.session = undefined;
|
|
425
|
+
this.apiKey = undefined;
|
|
426
|
+
}
|
|
427
|
+
getSession() {
|
|
428
|
+
return this.session;
|
|
429
|
+
}
|
|
430
|
+
async acquireTokenSilent() {
|
|
431
|
+
if (!this.session?.token) {
|
|
432
|
+
return {
|
|
433
|
+
success: false,
|
|
434
|
+
error: {
|
|
435
|
+
type: 'token_expired',
|
|
436
|
+
message: 'No active session',
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
return { success: true, token: this.session.token };
|
|
441
|
+
}
|
|
442
|
+
isAuthenticated() {
|
|
443
|
+
return this.session?.state === 'authenticated';
|
|
444
|
+
}
|
|
445
|
+
getUser() {
|
|
446
|
+
return undefined; // API key auth typically doesn't have user identity
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Set the API key
|
|
450
|
+
*/
|
|
451
|
+
setApiKey(key) {
|
|
452
|
+
this.apiKey = key;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// ============================================================
|
|
456
|
+
// AUTH PROVIDER FACTORY
|
|
457
|
+
// ============================================================
|
|
458
|
+
/**
|
|
459
|
+
* Create an authentication provider
|
|
460
|
+
*/
|
|
461
|
+
export function createAuthProvider(config) {
|
|
462
|
+
switch (config.type) {
|
|
463
|
+
case 'msal':
|
|
464
|
+
return new MsalAuthProvider(config);
|
|
465
|
+
case 'oauth2':
|
|
466
|
+
return new OAuth2PkceAuthProvider(config);
|
|
467
|
+
case 'api-key':
|
|
468
|
+
return new ApiKeyAuthProvider(config);
|
|
469
|
+
default:
|
|
470
|
+
throw new Error(`Unknown auth provider type: ${config.type}`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/auth/provider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Authentication Provider\n *\n * Authentication provider interface and implementations\n *\n * @module @pwfabric/runtime/auth/provider\n */\n\nimport type {\n AuthProviderType,\n AuthProviderConfig,\n MsalConfig,\n OAuth2Config,\n ApiKeyConfig,\n AuthSession,\n AuthResult,\n TokenResult,\n AuthToken,\n UserIdentity,\n} from './types.js'\n\n// ============================================================\n// AUTH PROVIDER INTERFACE\n// ============================================================\n\n/**\n * Authentication provider interface\n */\nexport interface AuthProvider {\n readonly type: AuthProviderType\n readonly config: AuthProviderConfig\n\n /**\n * Initialize the provider\n */\n initialize(): Promise<void>\n\n /**\n * Start authentication flow\n */\n login(options?: LoginOptions): Promise<AuthResult>\n\n /**\n * End authentication session\n */\n logout(): Promise<void>\n\n /**\n * Get current session\n */\n getSession(): AuthSession | undefined\n\n /**\n * Acquire token silently\n */\n acquireTokenSilent(scopes?: readonly string[]): Promise<TokenResult>\n\n /**\n * Check if authenticated\n */\n isAuthenticated(): boolean\n\n /**\n * Get current user\n */\n getUser(): UserIdentity | undefined\n}\n\n/**\n * Login options\n */\nexport interface LoginOptions {\n readonly scopes?: readonly string[]\n readonly prompt?: 'login' | 'consent' | 'select_account' | 'none'\n readonly loginHint?: string\n}\n\n// ============================================================\n// MSAL AUTH PROVIDER (Stub)\n// ============================================================\n\n/**\n * MSAL authentication provider\n *\n * Note: This is a stub implementation. In production, this would\n * integrate with @azure/msal-browser or @azure/msal-node.\n */\nexport class MsalAuthProvider implements AuthProvider {\n readonly type: AuthProviderType = 'msal'\n readonly config: MsalConfig\n\n private session: AuthSession | undefined\n private initialized = false\n\n constructor(config: MsalConfig) {\n this.config = config\n }\n\n async initialize(): Promise<void> {\n // In production: Initialize MSAL instance\n this.initialized = true\n }\n\n async login(options?: LoginOptions): Promise<AuthResult> {\n if (!this.initialized) {\n return {\n success: false,\n error: {\n type: 'invalid_config',\n message: 'Provider not initialized',\n },\n }\n }\n\n // Stub: Create mock session\n const scopes = options?.scopes ?? this.config.scopes\n const token: AuthToken = {\n accessToken: 'mock_access_token',\n idToken: 'mock_id_token',\n expiresAt: Date.now() + 3600000, // 1 hour\n scopes,\n }\n\n const user: UserIdentity = {\n id: 'mock_user_id',\n name: 'Mock User',\n email: 'mock@example.com',\n ...(this.config.worldId !== undefined ? { worldId: this.config.worldId } : {}),\n }\n\n this.session = {\n id: `session_${Date.now()}`,\n state: 'authenticated',\n user,\n token,\n provider: 'msal',\n createdAt: Date.now(),\n expiresAt: token.expiresAt,\n }\n\n return { success: true, session: this.session }\n }\n\n async logout(): Promise<void> {\n this.session = undefined\n }\n\n getSession(): AuthSession | undefined {\n return this.session\n }\n\n async acquireTokenSilent(_scopes?: readonly string[]): Promise<TokenResult> {\n if (!this.session?.token) {\n return {\n success: false,\n error: {\n type: 'token_expired',\n message: 'No active session',\n },\n }\n }\n\n // Check if token is expired\n if (this.session.token.expiresAt < Date.now()) {\n return {\n success: false,\n error: {\n type: 'token_expired',\n message: 'Token has expired',\n },\n }\n }\n\n return { success: true, token: this.session.token }\n }\n\n isAuthenticated(): boolean {\n return this.session?.state === 'authenticated'\n }\n\n getUser(): UserIdentity | undefined {\n return this.session?.user\n }\n}\n\n// ============================================================\n// OAUTH2 PKCE AUTH PROVIDER\n// ============================================================\n\n/**\n * Generate a cryptographically random code verifier for PKCE\n */\nfunction generateCodeVerifier(): string {\n const buffer = new Uint8Array(32)\n crypto.getRandomValues(buffer)\n return Array.from(buffer, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Generate a code challenge from a code verifier (S256 method)\n */\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '')\n}\n\n/**\n * OAuth2 PKCE authentication provider\n *\n * Implements the Authorization Code flow with PKCE (RFC 7636)\n * for secure authentication without client secrets.\n */\nexport class OAuth2PkceAuthProvider implements AuthProvider {\n readonly type: AuthProviderType = 'oauth2'\n readonly config: OAuth2Config\n\n private session: AuthSession | undefined\n private codeVerifier: string | undefined\n private initialized = false\n\n constructor(config: OAuth2Config) {\n this.config = config\n }\n\n async initialize(): Promise<void> {\n this.initialized = true\n }\n\n async login(options?: LoginOptions): Promise<AuthResult> {\n if (!this.initialized) {\n return {\n success: false,\n error: { type: 'invalid_config', message: 'Provider not initialized' },\n }\n }\n\n try {\n // Step 1: Generate PKCE code verifier and challenge\n this.codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(this.codeVerifier)\n const state = generateCodeVerifier().slice(0, 32)\n\n const scopes = options?.scopes ?? this.config.scopes\n\n // Step 2: Build authorization URL\n const authUrl = new URL(this.config.authorizationEndpoint)\n authUrl.searchParams.set('response_type', 'code')\n authUrl.searchParams.set('client_id', this.config.clientId)\n authUrl.searchParams.set('redirect_uri', this.config.redirectUri)\n authUrl.searchParams.set('scope', scopes.join(' '))\n authUrl.searchParams.set('state', state)\n authUrl.searchParams.set('code_challenge', codeChallenge)\n authUrl.searchParams.set('code_challenge_method', 'S256')\n\n if (options?.prompt) {\n authUrl.searchParams.set('prompt', options.prompt)\n }\n if (options?.loginHint) {\n authUrl.searchParams.set('login_hint', options.loginHint)\n }\n\n // Step 3: Return the authorization URL for the caller to open\n // In browser context, this would redirect. In CLI, the caller\n // starts a local server to capture the callback.\n return {\n success: false,\n error: {\n type: 'provider_error',\n message: 'PKCE_REDIRECT_REQUIRED',\n code: authUrl.toString(),\n },\n }\n } catch (error) {\n return {\n success: false,\n error: {\n type: 'provider_error',\n message: error instanceof Error ? error.message : 'OAuth2 login failed',\n cause: error,\n },\n }\n }\n }\n\n /**\n * Exchange authorization code for tokens (PKCE Step 2)\n *\n * Called after the user completes the OAuth flow and the authorization\n * code is received via the redirect URI.\n */\n async exchangeCode(code: string): Promise<AuthResult> {\n if (!this.codeVerifier) {\n return {\n success: false,\n error: { type: 'invalid_config', message: 'No PKCE flow in progress. Call login() first.' },\n }\n }\n\n try {\n const response = await fetch(this.config.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n code_verifier: this.codeVerifier,\n }),\n })\n\n if (!response.ok) {\n const errorBody = await response.text()\n return {\n success: false,\n error: {\n type: 'provider_error',\n message: `Token exchange failed: ${response.status}`,\n code: errorBody,\n },\n }\n }\n\n const tokenData = (await response.json()) as {\n access_token: string\n refresh_token?: string\n id_token?: string\n expires_in: number\n scope?: string\n }\n\n const token: AuthToken = {\n accessToken: tokenData.access_token,\n ...(tokenData.refresh_token !== undefined ? { refreshToken: tokenData.refresh_token } : {}),\n ...(tokenData.id_token !== undefined ? { idToken: tokenData.id_token } : {}),\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n scopes: tokenData.scope?.split(' ') ?? this.config.scopes,\n }\n\n // Decode user info from ID token or access token claims\n const user = this.decodeUserFromToken(token)\n\n this.session = {\n id: `session_${Date.now()}`,\n state: 'authenticated',\n ...(user !== undefined ? { user } : {}),\n token,\n provider: 'oauth2',\n createdAt: Date.now(),\n expiresAt: token.expiresAt,\n }\n\n // Clear the code verifier after successful exchange\n this.codeVerifier = undefined\n\n return { success: true, session: this.session }\n } catch (error) {\n return {\n success: false,\n error: {\n type: 'network_error',\n message: error instanceof Error ? error.message : 'Token exchange failed',\n cause: error,\n },\n }\n }\n }\n\n async logout(): Promise<void> {\n this.session = undefined\n this.codeVerifier = undefined\n }\n\n getSession(): AuthSession | undefined {\n return this.session\n }\n\n async acquireTokenSilent(_scopes?: readonly string[]): Promise<TokenResult> {\n if (!this.session?.token) {\n return {\n success: false,\n error: { type: 'token_expired', message: 'No active session' },\n }\n }\n\n // Check if token is expired\n if (this.session.token.expiresAt < Date.now()) {\n // Try refresh if refresh token available\n if (this.session.token.refreshToken) {\n return this.refreshToken(this.session.token.refreshToken)\n }\n return {\n success: false,\n error: {\n type: 'token_expired',\n message: 'Token has expired and no refresh token available',\n },\n }\n }\n\n return { success: true, token: this.session.token }\n }\n\n isAuthenticated(): boolean {\n if (this.session?.state !== 'authenticated') return false\n if (this.session.token && this.session.token.expiresAt < Date.now()) return false\n return true\n }\n\n getUser(): UserIdentity | undefined {\n return this.session?.user\n }\n\n /**\n * Refresh the access token using a refresh token\n */\n private async refreshToken(refreshToken: string): Promise<TokenResult> {\n try {\n const response = await fetch(this.config.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.config.clientId,\n }),\n })\n\n if (!response.ok) {\n return {\n success: false,\n error: { type: 'token_expired', message: `Refresh failed: ${response.status}` },\n }\n }\n\n const tokenData = (await response.json()) as {\n access_token: string\n refresh_token?: string\n id_token?: string\n expires_in: number\n scope?: string\n }\n\n const newRefreshToken = tokenData.refresh_token ?? refreshToken\n const token: AuthToken = {\n accessToken: tokenData.access_token,\n refreshToken: newRefreshToken,\n ...(tokenData.id_token !== undefined ? { idToken: tokenData.id_token } : {}),\n expiresAt: Date.now() + tokenData.expires_in * 1000,\n scopes: tokenData.scope?.split(' ') ?? this.config.scopes,\n }\n\n // Update session with new token\n const user = this.decodeUserFromToken(token) ?? this.session?.user\n this.session = {\n id: this.session?.id ?? `session_${Date.now()}`,\n state: 'authenticated',\n ...(user !== undefined ? { user } : {}),\n token,\n provider: 'oauth2',\n createdAt: this.session?.createdAt ?? Date.now(),\n expiresAt: token.expiresAt,\n }\n\n return { success: true, token }\n } catch (error) {\n return {\n success: false,\n error: {\n type: 'network_error',\n message: error instanceof Error ? error.message : 'Token refresh failed',\n cause: error,\n },\n }\n }\n }\n\n /**\n * Decode user identity from JWT token claims\n */\n private decodeUserFromToken(token: AuthToken): UserIdentity | undefined {\n const jwtToDecode = token.idToken ?? token.accessToken\n try {\n const parts = jwtToDecode.split('.')\n if (parts.length !== 3) return undefined\n\n const encodedPayload = parts[1]\n if (!encodedPayload) return undefined\n const payload = JSON.parse(atob(encodedPayload.replace(/-/g, '+').replace(/_/g, '/'))) as {\n sub?: string\n name?: string\n email?: string\n wid?: string\n roles?: string[]\n }\n\n return {\n id: payload.sub ?? 'unknown',\n ...(payload.name !== undefined ? { name: payload.name } : {}),\n ...(payload.email !== undefined ? { email: payload.email } : {}),\n ...(payload.wid !== undefined ? { worldId: payload.wid } : {}),\n ...(payload.roles !== undefined ? { roles: payload.roles } : {}),\n }\n } catch {\n return undefined\n }\n }\n}\n\n// ============================================================\n// API KEY AUTH PROVIDER\n// ============================================================\n\n/**\n * API Key authentication provider\n */\nexport class ApiKeyAuthProvider implements AuthProvider {\n readonly type: AuthProviderType = 'api-key'\n readonly config: ApiKeyConfig\n\n private session: AuthSession | undefined\n private apiKey: string | undefined\n\n constructor(config: ApiKeyConfig) {\n this.config = config\n }\n\n async initialize(): Promise<void> {\n // No initialization needed\n }\n\n async login(_options?: LoginOptions): Promise<AuthResult> {\n // API key auth doesn't have a login flow\n // The key is typically set via setApiKey()\n if (!this.apiKey) {\n return {\n success: false,\n error: {\n type: 'invalid_credentials',\n message: 'API key not set',\n },\n }\n }\n\n const token: AuthToken = {\n accessToken: this.apiKey,\n expiresAt: Date.now() + 86400000, // 24 hours\n scopes: [],\n }\n\n this.session = {\n id: `session_${Date.now()}`,\n state: 'authenticated',\n token,\n provider: 'api-key',\n createdAt: Date.now(),\n }\n\n return { success: true, session: this.session }\n }\n\n async logout(): Promise<void> {\n this.session = undefined\n this.apiKey = undefined\n }\n\n getSession(): AuthSession | undefined {\n return this.session\n }\n\n async acquireTokenSilent(): Promise<TokenResult> {\n if (!this.session?.token) {\n return {\n success: false,\n error: {\n type: 'token_expired',\n message: 'No active session',\n },\n }\n }\n\n return { success: true, token: this.session.token }\n }\n\n isAuthenticated(): boolean {\n return this.session?.state === 'authenticated'\n }\n\n getUser(): UserIdentity | undefined {\n return undefined // API key auth typically doesn't have user identity\n }\n\n /**\n * Set the API key\n */\n setApiKey(key: string): void {\n this.apiKey = key\n }\n}\n\n// ============================================================\n// AUTH PROVIDER FACTORY\n// ============================================================\n\n/**\n * Create an authentication provider\n */\nexport function createAuthProvider(config: AuthProviderConfig): AuthProvider {\n switch (config.type) {\n case 'msal':\n return new MsalAuthProvider(config as MsalConfig)\n case 'oauth2':\n return new OAuth2PkceAuthProvider(config as OAuth2Config)\n case 'api-key':\n return new ApiKeyAuthProvider(config as ApiKeyConfig)\n default:\n throw new Error(`Unknown auth provider type: ${config.type}`)\n }\n}\n"]}
|