mcp-server-framework 1.0.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/CHANGELOG.md +174 -0
- package/LICENSE-GPL.md +219 -0
- package/LICENSE.md +187 -0
- package/README.md +439 -0
- package/build/config/config-cache.d.ts +120 -0
- package/build/config/config-cache.d.ts.map +1 -0
- package/build/config/config-cache.js +310 -0
- package/build/config/config-cache.js.map +1 -0
- package/build/config/env.d.ts +476 -0
- package/build/config/env.d.ts.map +1 -0
- package/build/config/env.js +441 -0
- package/build/config/env.js.map +1 -0
- package/build/config/extensions.d.ts +107 -0
- package/build/config/extensions.d.ts.map +1 -0
- package/build/config/extensions.js +152 -0
- package/build/config/extensions.js.map +1 -0
- package/build/config/file/index.d.ts +8 -0
- package/build/config/file/index.d.ts.map +1 -0
- package/build/config/file/index.js +10 -0
- package/build/config/file/index.js.map +1 -0
- package/build/config/file/loader.d.ts +31 -0
- package/build/config/file/loader.d.ts.map +1 -0
- package/build/config/file/loader.js +313 -0
- package/build/config/file/loader.js.map +1 -0
- package/build/config/file/schema.d.ts +583 -0
- package/build/config/file/schema.d.ts.map +1 -0
- package/build/config/file/schema.js +388 -0
- package/build/config/file/schema.js.map +1 -0
- package/build/config/index.d.ts +15 -0
- package/build/config/index.d.ts.map +1 -0
- package/build/config/index.js +27 -0
- package/build/config/index.js.map +1 -0
- package/build/config/startup-warnings.d.ts +46 -0
- package/build/config/startup-warnings.d.ts.map +1 -0
- package/build/config/startup-warnings.js +61 -0
- package/build/config/startup-warnings.js.map +1 -0
- package/build/connection/connection-state.d.ts +196 -0
- package/build/connection/connection-state.d.ts.map +1 -0
- package/build/connection/connection-state.js +426 -0
- package/build/connection/connection-state.js.map +1 -0
- package/build/connection/core/base.d.ts +43 -0
- package/build/connection/core/base.d.ts.map +1 -0
- package/build/connection/core/base.js +82 -0
- package/build/connection/core/base.js.map +1 -0
- package/build/connection/core/constants.d.ts +121 -0
- package/build/connection/core/constants.d.ts.map +1 -0
- package/build/connection/core/constants.js +151 -0
- package/build/connection/core/constants.js.map +1 -0
- package/build/connection/core/index.d.ts +13 -0
- package/build/connection/core/index.d.ts.map +1 -0
- package/build/connection/core/index.js +14 -0
- package/build/connection/core/index.js.map +1 -0
- package/build/connection/core/types.d.ts +102 -0
- package/build/connection/core/types.d.ts.map +1 -0
- package/build/connection/core/types.js +31 -0
- package/build/connection/core/types.js.map +1 -0
- package/build/connection/index.d.ts +19 -0
- package/build/connection/index.d.ts.map +1 -0
- package/build/connection/index.js +22 -0
- package/build/connection/index.js.map +1 -0
- package/build/connection/types.d.ts +125 -0
- package/build/connection/types.d.ts.map +1 -0
- package/build/connection/types.js +39 -0
- package/build/connection/types.js.map +1 -0
- package/build/errors/categories/auth.d.ts +59 -0
- package/build/errors/categories/auth.d.ts.map +1 -0
- package/build/errors/categories/auth.js +111 -0
- package/build/errors/categories/auth.js.map +1 -0
- package/build/errors/categories/connection.d.ts +70 -0
- package/build/errors/categories/connection.d.ts.map +1 -0
- package/build/errors/categories/connection.js +120 -0
- package/build/errors/categories/connection.js.map +1 -0
- package/build/errors/categories/index.d.ts +14 -0
- package/build/errors/categories/index.d.ts.map +1 -0
- package/build/errors/categories/index.js +20 -0
- package/build/errors/categories/index.js.map +1 -0
- package/build/errors/categories/operation.d.ts +83 -0
- package/build/errors/categories/operation.d.ts.map +1 -0
- package/build/errors/categories/operation.js +149 -0
- package/build/errors/categories/operation.js.map +1 -0
- package/build/errors/categories/protocol.d.ts +68 -0
- package/build/errors/categories/protocol.d.ts.map +1 -0
- package/build/errors/categories/protocol.js +135 -0
- package/build/errors/categories/protocol.js.map +1 -0
- package/build/errors/categories/session.d.ts +50 -0
- package/build/errors/categories/session.d.ts.map +1 -0
- package/build/errors/categories/session.js +97 -0
- package/build/errors/categories/session.js.map +1 -0
- package/build/errors/categories/system.d.ts +95 -0
- package/build/errors/categories/system.d.ts.map +1 -0
- package/build/errors/categories/system.js +190 -0
- package/build/errors/categories/system.js.map +1 -0
- package/build/errors/categories/transport.d.ts +70 -0
- package/build/errors/categories/transport.d.ts.map +1 -0
- package/build/errors/categories/transport.js +148 -0
- package/build/errors/categories/transport.js.map +1 -0
- package/build/errors/categories/validation.d.ts +140 -0
- package/build/errors/categories/validation.d.ts.map +1 -0
- package/build/errors/categories/validation.js +311 -0
- package/build/errors/categories/validation.js.map +1 -0
- package/build/errors/core/base.d.ts +103 -0
- package/build/errors/core/base.d.ts.map +1 -0
- package/build/errors/core/base.js +219 -0
- package/build/errors/core/base.js.map +1 -0
- package/build/errors/core/constants.d.ts +40 -0
- package/build/errors/core/constants.d.ts.map +1 -0
- package/build/errors/core/constants.js +49 -0
- package/build/errors/core/constants.js.map +1 -0
- package/build/errors/core/error-codes.d.ts +72 -0
- package/build/errors/core/error-codes.d.ts.map +1 -0
- package/build/errors/core/error-codes.js +88 -0
- package/build/errors/core/error-codes.js.map +1 -0
- package/build/errors/core/http.d.ts +69 -0
- package/build/errors/core/http.d.ts.map +1 -0
- package/build/errors/core/http.js +106 -0
- package/build/errors/core/http.js.map +1 -0
- package/build/errors/core/index.d.ts +23 -0
- package/build/errors/core/index.d.ts.map +1 -0
- package/build/errors/core/index.js +41 -0
- package/build/errors/core/index.js.map +1 -0
- package/build/errors/core/json-rpc.d.ts +69 -0
- package/build/errors/core/json-rpc.d.ts.map +1 -0
- package/build/errors/core/json-rpc.js +79 -0
- package/build/errors/core/json-rpc.js.map +1 -0
- package/build/errors/core/messages.d.ts +51 -0
- package/build/errors/core/messages.d.ts.map +1 -0
- package/build/errors/core/messages.js +59 -0
- package/build/errors/core/messages.js.map +1 -0
- package/build/errors/core/types.d.ts +80 -0
- package/build/errors/core/types.d.ts.map +1 -0
- package/build/errors/core/types.js +10 -0
- package/build/errors/core/types.js.map +1 -0
- package/build/errors/factory.d.ts +199 -0
- package/build/errors/factory.d.ts.map +1 -0
- package/build/errors/factory.js +244 -0
- package/build/errors/factory.js.map +1 -0
- package/build/errors/index.d.ts +35 -0
- package/build/errors/index.d.ts.map +1 -0
- package/build/errors/index.js +67 -0
- package/build/errors/index.js.map +1 -0
- package/build/index.d.ts +93 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +107 -0
- package/build/index.js.map +1 -0
- package/build/logger/core/constants.d.ts +143 -0
- package/build/logger/core/constants.d.ts.map +1 -0
- package/build/logger/core/constants.js +206 -0
- package/build/logger/core/constants.js.map +1 -0
- package/build/logger/core/context.d.ts +170 -0
- package/build/logger/core/context.d.ts.map +1 -0
- package/build/logger/core/context.js +237 -0
- package/build/logger/core/context.js.map +1 -0
- package/build/logger/core/errors.d.ts +101 -0
- package/build/logger/core/errors.d.ts.map +1 -0
- package/build/logger/core/errors.js +128 -0
- package/build/logger/core/errors.js.map +1 -0
- package/build/logger/core/format.d.ts +40 -0
- package/build/logger/core/format.d.ts.map +1 -0
- package/build/logger/core/format.js +47 -0
- package/build/logger/core/format.js.map +1 -0
- package/build/logger/core/index.d.ts +19 -0
- package/build/logger/core/index.d.ts.map +1 -0
- package/build/logger/core/index.js +47 -0
- package/build/logger/core/index.js.map +1 -0
- package/build/logger/core/trace-context.d.ts +51 -0
- package/build/logger/core/trace-context.d.ts.map +1 -0
- package/build/logger/core/trace-context.js +42 -0
- package/build/logger/core/trace-context.js.map +1 -0
- package/build/logger/core/types.d.ts +233 -0
- package/build/logger/core/types.d.ts.map +1 -0
- package/build/logger/core/types.js +10 -0
- package/build/logger/core/types.js.map +1 -0
- package/build/logger/factory.d.ts +150 -0
- package/build/logger/factory.d.ts.map +1 -0
- package/build/logger/factory.js +236 -0
- package/build/logger/factory.js.map +1 -0
- package/build/logger/formatters/index.d.ts +12 -0
- package/build/logger/formatters/index.d.ts.map +1 -0
- package/build/logger/formatters/index.js +15 -0
- package/build/logger/formatters/index.js.map +1 -0
- package/build/logger/formatters/json-formatter.d.ts +54 -0
- package/build/logger/formatters/json-formatter.d.ts.map +1 -0
- package/build/logger/formatters/json-formatter.js +80 -0
- package/build/logger/formatters/json-formatter.js.map +1 -0
- package/build/logger/formatters/schema.d.ts +230 -0
- package/build/logger/formatters/schema.d.ts.map +1 -0
- package/build/logger/formatters/schema.js +278 -0
- package/build/logger/formatters/schema.js.map +1 -0
- package/build/logger/formatters/text-formatter.d.ts +50 -0
- package/build/logger/formatters/text-formatter.d.ts.map +1 -0
- package/build/logger/formatters/text-formatter.js +93 -0
- package/build/logger/formatters/text-formatter.js.map +1 -0
- package/build/logger/index.d.ts +39 -0
- package/build/logger/index.d.ts.map +1 -0
- package/build/logger/index.js +43 -0
- package/build/logger/index.js.map +1 -0
- package/build/logger/logger.d.ts +278 -0
- package/build/logger/logger.d.ts.map +1 -0
- package/build/logger/logger.js +459 -0
- package/build/logger/logger.js.map +1 -0
- package/build/logger/mcp-logger.d.ts +177 -0
- package/build/logger/mcp-logger.d.ts.map +1 -0
- package/build/logger/mcp-logger.js +294 -0
- package/build/logger/mcp-logger.js.map +1 -0
- package/build/logger/scrubbing/index.d.ts +14 -0
- package/build/logger/scrubbing/index.d.ts.map +1 -0
- package/build/logger/scrubbing/index.js +16 -0
- package/build/logger/scrubbing/index.js.map +1 -0
- package/build/logger/scrubbing/injection-guard.d.ts +69 -0
- package/build/logger/scrubbing/injection-guard.d.ts.map +1 -0
- package/build/logger/scrubbing/injection-guard.js +102 -0
- package/build/logger/scrubbing/injection-guard.js.map +1 -0
- package/build/logger/scrubbing/secret-scrubber.d.ts +72 -0
- package/build/logger/scrubbing/secret-scrubber.d.ts.map +1 -0
- package/build/logger/scrubbing/secret-scrubber.js +177 -0
- package/build/logger/scrubbing/secret-scrubber.js.map +1 -0
- package/build/logger/writers/base-writer.d.ts +45 -0
- package/build/logger/writers/base-writer.d.ts.map +1 -0
- package/build/logger/writers/base-writer.js +41 -0
- package/build/logger/writers/base-writer.js.map +1 -0
- package/build/logger/writers/composite-writer.d.ts +83 -0
- package/build/logger/writers/composite-writer.d.ts.map +1 -0
- package/build/logger/writers/composite-writer.js +121 -0
- package/build/logger/writers/composite-writer.js.map +1 -0
- package/build/logger/writers/console-writer.d.ts +59 -0
- package/build/logger/writers/console-writer.d.ts.map +1 -0
- package/build/logger/writers/console-writer.js +73 -0
- package/build/logger/writers/console-writer.js.map +1 -0
- package/build/logger/writers/file-writer.d.ts +160 -0
- package/build/logger/writers/file-writer.d.ts.map +1 -0
- package/build/logger/writers/file-writer.js +345 -0
- package/build/logger/writers/file-writer.js.map +1 -0
- package/build/logger/writers/index.d.ts +15 -0
- package/build/logger/writers/index.d.ts.map +1 -0
- package/build/logger/writers/index.js +19 -0
- package/build/logger/writers/index.js.map +1 -0
- package/build/mcp/capabilities/apps/define-app.d.ts +68 -0
- package/build/mcp/capabilities/apps/define-app.d.ts.map +1 -0
- package/build/mcp/capabilities/apps/define-app.js +127 -0
- package/build/mcp/capabilities/apps/define-app.js.map +1 -0
- package/build/mcp/capabilities/apps/index.d.ts +10 -0
- package/build/mcp/capabilities/apps/index.d.ts.map +1 -0
- package/build/mcp/capabilities/apps/index.js +10 -0
- package/build/mcp/capabilities/apps/index.js.map +1 -0
- package/build/mcp/capabilities/capabilities.d.ts +24 -0
- package/build/mcp/capabilities/capabilities.d.ts.map +1 -0
- package/build/mcp/capabilities/capabilities.js +50 -0
- package/build/mcp/capabilities/capabilities.js.map +1 -0
- package/build/mcp/capabilities/index.d.ts +17 -0
- package/build/mcp/capabilities/index.d.ts.map +1 -0
- package/build/mcp/capabilities/index.js +20 -0
- package/build/mcp/capabilities/index.js.map +1 -0
- package/build/mcp/capabilities/prompts/define-prompt.d.ts +95 -0
- package/build/mcp/capabilities/prompts/define-prompt.d.ts.map +1 -0
- package/build/mcp/capabilities/prompts/define-prompt.js +109 -0
- package/build/mcp/capabilities/prompts/define-prompt.js.map +1 -0
- package/build/mcp/capabilities/prompts/index.d.ts +10 -0
- package/build/mcp/capabilities/prompts/index.d.ts.map +1 -0
- package/build/mcp/capabilities/prompts/index.js +10 -0
- package/build/mcp/capabilities/prompts/index.js.map +1 -0
- package/build/mcp/capabilities/registry/base-registry.d.ts +95 -0
- package/build/mcp/capabilities/registry/base-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/base-registry.js +149 -0
- package/build/mcp/capabilities/registry/base-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/index.d.ts +16 -0
- package/build/mcp/capabilities/registry/index.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/index.js +34 -0
- package/build/mcp/capabilities/registry/index.js.map +1 -0
- package/build/mcp/capabilities/registry/prompt-registry.d.ts +116 -0
- package/build/mcp/capabilities/registry/prompt-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/prompt-registry.js +232 -0
- package/build/mcp/capabilities/registry/prompt-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/reset.d.ts +30 -0
- package/build/mcp/capabilities/registry/reset.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/reset.js +48 -0
- package/build/mcp/capabilities/registry/reset.js.map +1 -0
- package/build/mcp/capabilities/registry/resource-registry.d.ts +152 -0
- package/build/mcp/capabilities/registry/resource-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/resource-registry.js +430 -0
- package/build/mcp/capabilities/registry/resource-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/scope-enforcement.d.ts +48 -0
- package/build/mcp/capabilities/registry/scope-enforcement.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/scope-enforcement.js +62 -0
- package/build/mcp/capabilities/registry/scope-enforcement.js.map +1 -0
- package/build/mcp/capabilities/registry/task-tool-registry.d.ts +96 -0
- package/build/mcp/capabilities/registry/task-tool-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/task-tool-registry.js +190 -0
- package/build/mcp/capabilities/registry/task-tool-registry.js.map +1 -0
- package/build/mcp/capabilities/registry/tool-registry.d.ts +100 -0
- package/build/mcp/capabilities/registry/tool-registry.d.ts.map +1 -0
- package/build/mcp/capabilities/registry/tool-registry.js +242 -0
- package/build/mcp/capabilities/registry/tool-registry.js.map +1 -0
- package/build/mcp/capabilities/resources/define-resource.d.ts +103 -0
- package/build/mcp/capabilities/resources/define-resource.d.ts.map +1 -0
- package/build/mcp/capabilities/resources/define-resource.js +137 -0
- package/build/mcp/capabilities/resources/define-resource.js.map +1 -0
- package/build/mcp/capabilities/resources/index.d.ts +10 -0
- package/build/mcp/capabilities/resources/index.d.ts.map +1 -0
- package/build/mcp/capabilities/resources/index.js +10 -0
- package/build/mcp/capabilities/resources/index.js.map +1 -0
- package/build/mcp/capabilities/server-capabilities.d.ts +33 -0
- package/build/mcp/capabilities/server-capabilities.d.ts.map +1 -0
- package/build/mcp/capabilities/server-capabilities.js +16 -0
- package/build/mcp/capabilities/server-capabilities.js.map +1 -0
- package/build/mcp/capabilities/tasks/define-task.d.ts +75 -0
- package/build/mcp/capabilities/tasks/define-task.d.ts.map +1 -0
- package/build/mcp/capabilities/tasks/define-task.js +93 -0
- package/build/mcp/capabilities/tasks/define-task.js.map +1 -0
- package/build/mcp/capabilities/tasks/index.d.ts +11 -0
- package/build/mcp/capabilities/tasks/index.d.ts.map +1 -0
- package/build/mcp/capabilities/tasks/index.js +11 -0
- package/build/mcp/capabilities/tasks/index.js.map +1 -0
- package/build/mcp/capabilities/tools/define-tool.d.ts +62 -0
- package/build/mcp/capabilities/tools/define-tool.d.ts.map +1 -0
- package/build/mcp/capabilities/tools/define-tool.js +73 -0
- package/build/mcp/capabilities/tools/define-tool.js.map +1 -0
- package/build/mcp/capabilities/tools/index.d.ts +10 -0
- package/build/mcp/capabilities/tools/index.d.ts.map +1 -0
- package/build/mcp/capabilities/tools/index.js +10 -0
- package/build/mcp/capabilities/tools/index.js.map +1 -0
- package/build/mcp/handlers/index.d.ts +19 -0
- package/build/mcp/handlers/index.d.ts.map +1 -0
- package/build/mcp/handlers/index.js +26 -0
- package/build/mcp/handlers/index.js.map +1 -0
- package/build/mcp/handlers/ping.d.ts +27 -0
- package/build/mcp/handlers/ping.d.ts.map +1 -0
- package/build/mcp/handlers/ping.js +61 -0
- package/build/mcp/handlers/ping.js.map +1 -0
- package/build/mcp/handlers/progress.d.ts +41 -0
- package/build/mcp/handlers/progress.d.ts.map +1 -0
- package/build/mcp/handlers/progress.js +79 -0
- package/build/mcp/handlers/progress.js.map +1 -0
- package/build/mcp/index.d.ts +28 -0
- package/build/mcp/index.d.ts.map +1 -0
- package/build/mcp/index.js +34 -0
- package/build/mcp/index.js.map +1 -0
- package/build/mcp/responses/helpers.d.ts +146 -0
- package/build/mcp/responses/helpers.d.ts.map +1 -0
- package/build/mcp/responses/helpers.js +197 -0
- package/build/mcp/responses/helpers.js.map +1 -0
- package/build/mcp/responses/index.d.ts +9 -0
- package/build/mcp/responses/index.d.ts.map +1 -0
- package/build/mcp/responses/index.js +12 -0
- package/build/mcp/responses/index.js.map +1 -0
- package/build/mcp/types/context.d.ts +371 -0
- package/build/mcp/types/context.d.ts.map +1 -0
- package/build/mcp/types/context.js +17 -0
- package/build/mcp/types/context.js.map +1 -0
- package/build/mcp/types/definition.d.ts +727 -0
- package/build/mcp/types/definition.d.ts.map +1 -0
- package/build/mcp/types/definition.js +29 -0
- package/build/mcp/types/definition.js.map +1 -0
- package/build/mcp/types/handler.d.ts +58 -0
- package/build/mcp/types/handler.d.ts.map +1 -0
- package/build/mcp/types/handler.js +10 -0
- package/build/mcp/types/handler.js.map +1 -0
- package/build/mcp/types/index.d.ts +21 -0
- package/build/mcp/types/index.d.ts.map +1 -0
- package/build/mcp/types/index.js +18 -0
- package/build/mcp/types/index.js.map +1 -0
- package/build/mcp/types/response.d.ts +79 -0
- package/build/mcp/types/response.d.ts.map +1 -0
- package/build/mcp/types/response.js +10 -0
- package/build/mcp/types/response.js.map +1 -0
- package/build/server/auth/auth-context.d.ts +52 -0
- package/build/server/auth/auth-context.d.ts.map +1 -0
- package/build/server/auth/auth-context.js +45 -0
- package/build/server/auth/auth-context.js.map +1 -0
- package/build/server/auth/guards.d.ts +72 -0
- package/build/server/auth/guards.d.ts.map +1 -0
- package/build/server/auth/guards.js +103 -0
- package/build/server/auth/guards.js.map +1 -0
- package/build/server/auth/index.d.ts +21 -0
- package/build/server/auth/index.d.ts.map +1 -0
- package/build/server/auth/index.js +20 -0
- package/build/server/auth/index.js.map +1 -0
- package/build/server/auth/oidc-discovery.d.ts +68 -0
- package/build/server/auth/oidc-discovery.d.ts.map +1 -0
- package/build/server/auth/oidc-discovery.js +234 -0
- package/build/server/auth/oidc-discovery.js.map +1 -0
- package/build/server/auth/oidc-provider.d.ts +96 -0
- package/build/server/auth/oidc-provider.d.ts.map +1 -0
- package/build/server/auth/oidc-provider.js +126 -0
- package/build/server/auth/oidc-provider.js.map +1 -0
- package/build/server/auth/types.d.ts +204 -0
- package/build/server/auth/types.d.ts.map +1 -0
- package/build/server/auth/types.js +29 -0
- package/build/server/auth/types.js.map +1 -0
- package/build/server/auth/upstream-provider.d.ts +161 -0
- package/build/server/auth/upstream-provider.d.ts.map +1 -0
- package/build/server/auth/upstream-provider.js +411 -0
- package/build/server/auth/upstream-provider.js.map +1 -0
- package/build/server/builder/constants.d.ts +45 -0
- package/build/server/builder/constants.d.ts.map +1 -0
- package/build/server/builder/constants.js +54 -0
- package/build/server/builder/constants.js.map +1 -0
- package/build/server/builder/index.d.ts +24 -0
- package/build/server/builder/index.d.ts.map +1 -0
- package/build/server/builder/index.js +25 -0
- package/build/server/builder/index.js.map +1 -0
- package/build/server/builder/primitive-collector.d.ts +24 -0
- package/build/server/builder/primitive-collector.d.ts.map +1 -0
- package/build/server/builder/primitive-collector.js +89 -0
- package/build/server/builder/primitive-collector.js.map +1 -0
- package/build/server/builder/server-builder.d.ts +53 -0
- package/build/server/builder/server-builder.d.ts.map +1 -0
- package/build/server/builder/server-builder.js +132 -0
- package/build/server/builder/server-builder.js.map +1 -0
- package/build/server/builder/types.d.ts +93 -0
- package/build/server/builder/types.d.ts.map +1 -0
- package/build/server/builder/types.js +25 -0
- package/build/server/builder/types.js.map +1 -0
- package/build/server/builder/validation.d.ts +36 -0
- package/build/server/builder/validation.d.ts.map +1 -0
- package/build/server/builder/validation.js +44 -0
- package/build/server/builder/validation.js.map +1 -0
- package/build/server/create-server.d.ts +57 -0
- package/build/server/create-server.d.ts.map +1 -0
- package/build/server/create-server.js +104 -0
- package/build/server/create-server.js.map +1 -0
- package/build/server/http/express-app.d.ts +103 -0
- package/build/server/http/express-app.d.ts.map +1 -0
- package/build/server/http/express-app.js +391 -0
- package/build/server/http/express-app.js.map +1 -0
- package/build/server/http/http-server.d.ts +67 -0
- package/build/server/http/http-server.d.ts.map +1 -0
- package/build/server/http/http-server.js +188 -0
- package/build/server/http/http-server.js.map +1 -0
- package/build/server/http/http-transport.d.ts +33 -0
- package/build/server/http/http-transport.d.ts.map +1 -0
- package/build/server/http/http-transport.js +84 -0
- package/build/server/http/http-transport.js.map +1 -0
- package/build/server/http/index.d.ts +15 -0
- package/build/server/http/index.d.ts.map +1 -0
- package/build/server/http/index.js +11 -0
- package/build/server/http/index.js.map +1 -0
- package/build/server/index.d.ts +25 -0
- package/build/server/index.d.ts.map +1 -0
- package/build/server/index.js +41 -0
- package/build/server/index.js.map +1 -0
- package/build/server/lifecycle.d.ts +114 -0
- package/build/server/lifecycle.d.ts.map +1 -0
- package/build/server/lifecycle.js +30 -0
- package/build/server/lifecycle.js.map +1 -0
- package/build/server/middleware/bearer-auth.d.ts +43 -0
- package/build/server/middleware/bearer-auth.d.ts.map +1 -0
- package/build/server/middleware/bearer-auth.js +75 -0
- package/build/server/middleware/bearer-auth.js.map +1 -0
- package/build/server/middleware/custom-header-auth.d.ts +40 -0
- package/build/server/middleware/custom-header-auth.d.ts.map +1 -0
- package/build/server/middleware/custom-header-auth.js +90 -0
- package/build/server/middleware/custom-header-auth.js.map +1 -0
- package/build/server/middleware/dns-rebinding.d.ts +25 -0
- package/build/server/middleware/dns-rebinding.d.ts.map +1 -0
- package/build/server/middleware/dns-rebinding.js +94 -0
- package/build/server/middleware/dns-rebinding.js.map +1 -0
- package/build/server/middleware/index.d.ts +69 -0
- package/build/server/middleware/index.d.ts.map +1 -0
- package/build/server/middleware/index.js +68 -0
- package/build/server/middleware/index.js.map +1 -0
- package/build/server/middleware/logging.d.ts +21 -0
- package/build/server/middleware/logging.d.ts.map +1 -0
- package/build/server/middleware/logging.js +36 -0
- package/build/server/middleware/logging.js.map +1 -0
- package/build/server/middleware/oauth-router.d.ts +50 -0
- package/build/server/middleware/oauth-router.d.ts.map +1 -0
- package/build/server/middleware/oauth-router.js +53 -0
- package/build/server/middleware/oauth-router.js.map +1 -0
- package/build/server/middleware/protocol-version.d.ts +13 -0
- package/build/server/middleware/protocol-version.d.ts.map +1 -0
- package/build/server/middleware/protocol-version.js +48 -0
- package/build/server/middleware/protocol-version.js.map +1 -0
- package/build/server/middleware/rate-limit.d.ts +47 -0
- package/build/server/middleware/rate-limit.d.ts.map +1 -0
- package/build/server/middleware/rate-limit.js +109 -0
- package/build/server/middleware/rate-limit.js.map +1 -0
- package/build/server/middleware/trust-proxy.d.ts +37 -0
- package/build/server/middleware/trust-proxy.d.ts.map +1 -0
- package/build/server/middleware/trust-proxy.js +154 -0
- package/build/server/middleware/trust-proxy.js.map +1 -0
- package/build/server/option-overrides.d.ts +25 -0
- package/build/server/option-overrides.d.ts.map +1 -0
- package/build/server/option-overrides.js +85 -0
- package/build/server/option-overrides.js.map +1 -0
- package/build/server/routes/health.d.ts +87 -0
- package/build/server/routes/health.d.ts.map +1 -0
- package/build/server/routes/health.js +183 -0
- package/build/server/routes/health.js.map +1 -0
- package/build/server/routes/index.d.ts +16 -0
- package/build/server/routes/index.d.ts.map +1 -0
- package/build/server/routes/index.js +18 -0
- package/build/server/routes/index.js.map +1 -0
- package/build/server/routes/metrics.d.ts +40 -0
- package/build/server/routes/metrics.d.ts.map +1 -0
- package/build/server/routes/metrics.js +81 -0
- package/build/server/routes/metrics.js.map +1 -0
- package/build/server/routes/oauth-router.d.ts +50 -0
- package/build/server/routes/oauth-router.d.ts.map +1 -0
- package/build/server/routes/oauth-router.js +53 -0
- package/build/server/routes/oauth-router.js.map +1 -0
- package/build/server/routes/readiness-status.d.ts +25 -0
- package/build/server/routes/readiness-status.d.ts.map +1 -0
- package/build/server/routes/readiness-status.js +27 -0
- package/build/server/routes/readiness-status.js.map +1 -0
- package/build/server/routes/sse-router.d.ts +43 -0
- package/build/server/routes/sse-router.d.ts.map +1 -0
- package/build/server/routes/sse-router.js +92 -0
- package/build/server/routes/sse-router.js.map +1 -0
- package/build/server/routes/streamable-http-router.d.ts +36 -0
- package/build/server/routes/streamable-http-router.d.ts.map +1 -0
- package/build/server/routes/streamable-http-router.js +59 -0
- package/build/server/routes/streamable-http-router.js.map +1 -0
- package/build/server/server-instance.d.ts +185 -0
- package/build/server/server-instance.d.ts.map +1 -0
- package/build/server/server-instance.js +615 -0
- package/build/server/server-instance.js.map +1 -0
- package/build/server/server-options.d.ts +411 -0
- package/build/server/server-options.d.ts.map +1 -0
- package/build/server/server-options.js +17 -0
- package/build/server/server-options.js.map +1 -0
- package/build/server/session/in-memory-store.d.ts +128 -0
- package/build/server/session/in-memory-store.d.ts.map +1 -0
- package/build/server/session/in-memory-store.js +312 -0
- package/build/server/session/in-memory-store.js.map +1 -0
- package/build/server/session/index.d.ts +43 -0
- package/build/server/session/index.d.ts.map +1 -0
- package/build/server/session/index.js +47 -0
- package/build/server/session/index.js.map +1 -0
- package/build/server/session/mcp-session.d.ts +210 -0
- package/build/server/session/mcp-session.d.ts.map +1 -0
- package/build/server/session/mcp-session.js +428 -0
- package/build/server/session/mcp-session.js.map +1 -0
- package/build/server/session/session-factory.d.ts +119 -0
- package/build/server/session/session-factory.d.ts.map +1 -0
- package/build/server/session/session-factory.js +131 -0
- package/build/server/session/session-factory.js.map +1 -0
- package/build/server/session/session-housekeeper.d.ts +100 -0
- package/build/server/session/session-housekeeper.d.ts.map +1 -0
- package/build/server/session/session-housekeeper.js +217 -0
- package/build/server/session/session-housekeeper.js.map +1 -0
- package/build/server/session/session-manager.d.ts +227 -0
- package/build/server/session/session-manager.d.ts.map +1 -0
- package/build/server/session/session-manager.js +282 -0
- package/build/server/session/session-manager.js.map +1 -0
- package/build/server/session/session-store.d.ts +95 -0
- package/build/server/session/session-store.d.ts.map +1 -0
- package/build/server/session/session-store.js +13 -0
- package/build/server/session/session-store.js.map +1 -0
- package/build/server/session/session.d.ts +132 -0
- package/build/server/session/session.d.ts.map +1 -0
- package/build/server/session/session.js +61 -0
- package/build/server/session/session.js.map +1 -0
- package/build/server/transport/constants.d.ts +85 -0
- package/build/server/transport/constants.d.ts.map +1 -0
- package/build/server/transport/constants.js +103 -0
- package/build/server/transport/constants.js.map +1 -0
- package/build/server/transport/index.d.ts +21 -0
- package/build/server/transport/index.d.ts.map +1 -0
- package/build/server/transport/index.js +28 -0
- package/build/server/transport/index.js.map +1 -0
- package/build/server/transport/sse/handler.d.ts +46 -0
- package/build/server/transport/sse/handler.d.ts.map +1 -0
- package/build/server/transport/sse/handler.js +189 -0
- package/build/server/transport/sse/handler.js.map +1 -0
- package/build/server/transport/sse/index.d.ts +15 -0
- package/build/server/transport/sse/index.d.ts.map +1 -0
- package/build/server/transport/sse/index.js +14 -0
- package/build/server/transport/sse/index.js.map +1 -0
- package/build/server/transport/sse/transport.d.ts +94 -0
- package/build/server/transport/sse/transport.d.ts.map +1 -0
- package/build/server/transport/sse/transport.js +175 -0
- package/build/server/transport/sse/transport.js.map +1 -0
- package/build/server/transport/stdio-transport.d.ts +23 -0
- package/build/server/transport/stdio-transport.d.ts.map +1 -0
- package/build/server/transport/stdio-transport.js +59 -0
- package/build/server/transport/stdio-transport.js.map +1 -0
- package/build/server/transport/streamable-http/index.d.ts +9 -0
- package/build/server/transport/streamable-http/index.d.ts.map +1 -0
- package/build/server/transport/streamable-http/index.js +9 -0
- package/build/server/transport/streamable-http/index.js.map +1 -0
- package/build/server/transport/streamable-http/stateful-handler.d.ts +41 -0
- package/build/server/transport/streamable-http/stateful-handler.d.ts.map +1 -0
- package/build/server/transport/streamable-http/stateful-handler.js +264 -0
- package/build/server/transport/streamable-http/stateful-handler.js.map +1 -0
- package/build/server/transport/streamable-http/stateless-handler.d.ts +28 -0
- package/build/server/transport/streamable-http/stateless-handler.d.ts.map +1 -0
- package/build/server/transport/streamable-http/stateless-handler.js +81 -0
- package/build/server/transport/streamable-http/stateless-handler.js.map +1 -0
- package/build/server/transport/streamable-http/transport.d.ts +110 -0
- package/build/server/transport/streamable-http/transport.d.ts.map +1 -0
- package/build/server/transport/streamable-http/transport.js +118 -0
- package/build/server/transport/streamable-http/transport.js.map +1 -0
- package/build/server/transport/transport-context.d.ts +67 -0
- package/build/server/transport/transport-context.d.ts.map +1 -0
- package/build/server/transport/transport-context.js +38 -0
- package/build/server/transport/transport-context.js.map +1 -0
- package/build/server/transport/types.d.ts +56 -0
- package/build/server/transport/types.d.ts.map +1 -0
- package/build/server/transport/types.js +11 -0
- package/build/server/transport/types.js.map +1 -0
- package/build/server/transport-options.d.ts +248 -0
- package/build/server/transport-options.d.ts.map +1 -0
- package/build/server/transport-options.js +18 -0
- package/build/server/transport-options.js.map +1 -0
- package/build/server/types.d.ts +172 -0
- package/build/server/types.d.ts.map +1 -0
- package/build/server/types.js +9 -0
- package/build/server/types.js.map +1 -0
- package/build/telemetry/connection-telemetry-bridge.d.ts +30 -0
- package/build/telemetry/connection-telemetry-bridge.d.ts.map +1 -0
- package/build/telemetry/connection-telemetry-bridge.js +54 -0
- package/build/telemetry/connection-telemetry-bridge.js.map +1 -0
- package/build/telemetry/core/config.d.ts +38 -0
- package/build/telemetry/core/config.d.ts.map +1 -0
- package/build/telemetry/core/config.js +54 -0
- package/build/telemetry/core/config.js.map +1 -0
- package/build/telemetry/core/constants.d.ts +183 -0
- package/build/telemetry/core/constants.d.ts.map +1 -0
- package/build/telemetry/core/constants.js +207 -0
- package/build/telemetry/core/constants.js.map +1 -0
- package/build/telemetry/core/diag-logger.d.ts +35 -0
- package/build/telemetry/core/diag-logger.d.ts.map +1 -0
- package/build/telemetry/core/diag-logger.js +54 -0
- package/build/telemetry/core/diag-logger.js.map +1 -0
- package/build/telemetry/core/index.d.ts +12 -0
- package/build/telemetry/core/index.d.ts.map +1 -0
- package/build/telemetry/core/index.js +32 -0
- package/build/telemetry/core/index.js.map +1 -0
- package/build/telemetry/core/types.d.ts +106 -0
- package/build/telemetry/core/types.d.ts.map +1 -0
- package/build/telemetry/core/types.js +10 -0
- package/build/telemetry/core/types.js.map +1 -0
- package/build/telemetry/index.d.ts +59 -0
- package/build/telemetry/index.d.ts.map +1 -0
- package/build/telemetry/index.js +79 -0
- package/build/telemetry/index.js.map +1 -0
- package/build/telemetry/metrics.d.ts +127 -0
- package/build/telemetry/metrics.d.ts.map +1 -0
- package/build/telemetry/metrics.js +337 -0
- package/build/telemetry/metrics.js.map +1 -0
- package/build/telemetry/sdk.d.ts +110 -0
- package/build/telemetry/sdk.d.ts.map +1 -0
- package/build/telemetry/sdk.js +547 -0
- package/build/telemetry/sdk.js.map +1 -0
- package/build/telemetry/tracing.d.ts +78 -0
- package/build/telemetry/tracing.d.ts.map +1 -0
- package/build/telemetry/tracing.js +257 -0
- package/build/telemetry/tracing.js.map +1 -0
- package/build/utils/env-helpers.d.ts +46 -0
- package/build/utils/env-helpers.d.ts.map +1 -0
- package/build/utils/env-helpers.js +54 -0
- package/build/utils/env-helpers.js.map +1 -0
- package/build/utils/index.d.ts +14 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +19 -0
- package/build/utils/index.js.map +1 -0
- package/build/utils/sensitive-keys.d.ts +48 -0
- package/build/utils/sensitive-keys.d.ts.map +1 -0
- package/build/utils/sensitive-keys.js +131 -0
- package/build/utils/sensitive-keys.js.map +1 -0
- package/build/utils/string-helpers.d.ts +126 -0
- package/build/utils/string-helpers.d.ts.map +1 -0
- package/build/utils/string-helpers.js +189 -0
- package/build/utils/string-helpers.js.map +1 -0
- package/build/utils/validation.d.ts +84 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +111 -0
- package/build/utils/validation.js.map +1 -0
- package/build/utils/zod-helpers.d.ts +92 -0
- package/build/utils/zod-helpers.d.ts.map +1 -0
- package/build/utils/zod-helpers.js +120 -0
- package/build/utils/zod-helpers.js.map +1 -0
- package/package.json +133 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC Discovery Client
|
|
3
|
+
*
|
|
4
|
+
* Fetches and caches OpenID Connect Discovery documents (RFC 8414 / OpenID Connect Discovery 1.0).
|
|
5
|
+
* Used by {@link createOidcProvider} to auto-discover upstream OAuth endpoints.
|
|
6
|
+
*
|
|
7
|
+
* The discovery document is fetched from `{issuer}/.well-known/openid-configuration`
|
|
8
|
+
* and cached with a configurable TTL (default: 1 hour). Subsequent calls to
|
|
9
|
+
* {@link getOidcDiscovery} return the cached version until the TTL expires.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const doc = await getOidcDiscovery('https://auth.example.com');
|
|
14
|
+
* console.log(doc.authorization_endpoint); // https://auth.example.com/authorize
|
|
15
|
+
* console.log(doc.token_endpoint); // https://auth.example.com/token
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @module server/auth/oidc-discovery
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Subset of an OpenID Connect Discovery document relevant for OAuth proxy flows.
|
|
22
|
+
*
|
|
23
|
+
* @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata
|
|
24
|
+
*/
|
|
25
|
+
export interface OidcDiscoveryDocument {
|
|
26
|
+
/** REQUIRED. URL of the authorization endpoint */
|
|
27
|
+
readonly authorization_endpoint: string;
|
|
28
|
+
/** REQUIRED. URL of the token endpoint */
|
|
29
|
+
readonly token_endpoint: string;
|
|
30
|
+
/** RECOMMENDED. URL of the UserInfo endpoint */
|
|
31
|
+
readonly userinfo_endpoint?: string;
|
|
32
|
+
/** URL of the token revocation endpoint (RFC 7009) */
|
|
33
|
+
readonly revocation_endpoint?: string;
|
|
34
|
+
/** JSON array of OAuth 2.0 scope values supported */
|
|
35
|
+
readonly scopes_supported?: readonly string[];
|
|
36
|
+
/** JSON array of client authentication methods supported at the token endpoint */
|
|
37
|
+
readonly token_endpoint_auth_methods_supported?: readonly string[];
|
|
38
|
+
/** The issuer identifier (must match the requested issuer URL) */
|
|
39
|
+
readonly issuer?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fetches an OIDC discovery document from the well-known endpoint.
|
|
43
|
+
*
|
|
44
|
+
* Always makes a network request — does NOT use the cache.
|
|
45
|
+
* Prefer {@link getOidcDiscovery} for cached access.
|
|
46
|
+
*
|
|
47
|
+
* @param issuerUrl - OIDC issuer URL (e.g. `https://auth.example.com`)
|
|
48
|
+
* @returns Parsed and validated discovery document
|
|
49
|
+
* @throws If the fetch fails or required fields are missing
|
|
50
|
+
*/
|
|
51
|
+
export declare function fetchOidcDiscovery(issuerUrl: string): Promise<OidcDiscoveryDocument>;
|
|
52
|
+
/**
|
|
53
|
+
* Returns an OIDC discovery document, using a TTL-based cache.
|
|
54
|
+
*
|
|
55
|
+
* If a cached document exists and is within the TTL, returns it immediately.
|
|
56
|
+
* Otherwise, fetches a fresh document and updates the cache.
|
|
57
|
+
*
|
|
58
|
+
* @param issuerUrl - OIDC issuer URL (e.g. `https://auth.example.com`)
|
|
59
|
+
* @param ttlMs - Cache TTL in milliseconds (default: 1 hour)
|
|
60
|
+
* @returns Cached or freshly fetched discovery document
|
|
61
|
+
*/
|
|
62
|
+
export declare function getOidcDiscovery(issuerUrl: string, ttlMs?: number): Promise<OidcDiscoveryDocument>;
|
|
63
|
+
/**
|
|
64
|
+
* Clears the OIDC discovery cache.
|
|
65
|
+
* Primarily for testing and hot-reload scenarios.
|
|
66
|
+
*/
|
|
67
|
+
export declare function clearOidcDiscoveryCache(): void;
|
|
68
|
+
//# sourceMappingURL=oidc-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-discovery.d.ts","sourceRoot":"","sources":["../../../src/server/auth/oidc-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmEH;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IAExC,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,gDAAgD;IAChD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC,sDAAsD;IACtD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC,qDAAqD;IACrD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9C,kFAAkF;IAClF,QAAQ,CAAC,qCAAqC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEnE,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiF1F;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAiC,GACvC,OAAO,CAAC,qBAAqB,CAAC,CAuBhC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC Discovery Client
|
|
3
|
+
*
|
|
4
|
+
* Fetches and caches OpenID Connect Discovery documents (RFC 8414 / OpenID Connect Discovery 1.0).
|
|
5
|
+
* Used by {@link createOidcProvider} to auto-discover upstream OAuth endpoints.
|
|
6
|
+
*
|
|
7
|
+
* The discovery document is fetched from `{issuer}/.well-known/openid-configuration`
|
|
8
|
+
* and cached with a configurable TTL (default: 1 hour). Subsequent calls to
|
|
9
|
+
* {@link getOidcDiscovery} return the cached version until the TTL expires.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const doc = await getOidcDiscovery('https://auth.example.com');
|
|
14
|
+
* console.log(doc.authorization_endpoint); // https://auth.example.com/authorize
|
|
15
|
+
* console.log(doc.token_endpoint); // https://auth.example.com/token
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @module server/auth/oidc-discovery
|
|
19
|
+
*/
|
|
20
|
+
import { logger as baseLogger } from "../../logger/index.js";
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Logger
|
|
23
|
+
// ============================================================================
|
|
24
|
+
const LOG_COMPONENT = "oidc-discovery";
|
|
25
|
+
const LogMessages = {
|
|
26
|
+
FETCHING: "Fetching OIDC discovery from %s",
|
|
27
|
+
CACHED: "Using cached OIDC discovery for %s (age: %ds)",
|
|
28
|
+
REFRESHING: "Refreshing expired OIDC discovery for %s (age: %ds, ttl: %ds)",
|
|
29
|
+
FETCHED: "OIDC discovery fetched: authorization=%s token=%s userinfo=%s",
|
|
30
|
+
MISSING_FIELDS: "OIDC discovery at %s missing required fields: %s",
|
|
31
|
+
FETCH_FAILED: "OIDC discovery fetch failed for %s: %s",
|
|
32
|
+
ISSUER_MISMATCH: "OIDC discovery issuer mismatch: expected %s, got %s",
|
|
33
|
+
SSRF_BLOCKED: "OIDC discovery blocked: %s — %s",
|
|
34
|
+
};
|
|
35
|
+
const logger = baseLogger.child({ component: LOG_COMPONENT });
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Constants
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/** Default TTL for cached discovery documents (1 hour) */
|
|
40
|
+
const DEFAULT_DISCOVERY_TTL_MS = 60 * 60 * 1000;
|
|
41
|
+
/** Default timeout for OIDC discovery fetch requests (10 seconds) */
|
|
42
|
+
const DEFAULT_FETCH_TIMEOUT_MS = 10_000;
|
|
43
|
+
/** Well-known path suffix for OIDC discovery */
|
|
44
|
+
const WELL_KNOWN_PATH = "/.well-known/openid-configuration";
|
|
45
|
+
/** Maximum number of cached OIDC discovery documents */
|
|
46
|
+
const MAX_DISCOVERY_CACHE_SIZE = 50;
|
|
47
|
+
/**
|
|
48
|
+
* Hostnames and IP patterns that must never be fetched (SSRF protection).
|
|
49
|
+
* Covers private IPv4 ranges (RFC 1918), link-local, loopback, and cloud metadata endpoints.
|
|
50
|
+
*/
|
|
51
|
+
const BLOCKED_HOST_PATTERNS = [
|
|
52
|
+
/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // IPv4 loopback
|
|
53
|
+
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // 10.0.0.0/8
|
|
54
|
+
/^172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}$/, // 172.16.0.0/12
|
|
55
|
+
/^192\.168\.\d{1,3}\.\d{1,3}$/, // 192.168.0.0/16
|
|
56
|
+
/^169\.254\.\d{1,3}\.\d{1,3}$/, // Link-local
|
|
57
|
+
/^0\.0\.0\.0$/, // Unspecified
|
|
58
|
+
/^\[?::1\]?$/, // IPv6 loopback
|
|
59
|
+
/^\[?::ffff:/i, // IPv6-mapped IPv4 (e.g. ::ffff:192.168.1.1)
|
|
60
|
+
/^\[?fe80:/i, // IPv6 link-local
|
|
61
|
+
/^\[?fc00:/i, // IPv6 unique local
|
|
62
|
+
/^\[?fd/i, // IPv6 unique local
|
|
63
|
+
];
|
|
64
|
+
/** Hostnames that are always blocked regardless of scheme */
|
|
65
|
+
const BLOCKED_HOSTNAMES = new Set([
|
|
66
|
+
"metadata.google.internal", // GCP metadata
|
|
67
|
+
"metadata.azure.internal", // Azure metadata (IMDS hostname variant)
|
|
68
|
+
]);
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Cache
|
|
71
|
+
// ============================================================================
|
|
72
|
+
const discoveryCache = new Map();
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// SSRF Protection
|
|
75
|
+
// ============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Validates a URL against SSRF attacks before fetching.
|
|
78
|
+
*
|
|
79
|
+
* Rules:
|
|
80
|
+
* - Only `https:` is allowed in production. `http:` is permitted only for
|
|
81
|
+
* `localhost` / `127.0.0.1` (local development).
|
|
82
|
+
* - Private IP ranges, link-local addresses, and cloud metadata endpoints are blocked.
|
|
83
|
+
* - Non-standard ports on public hosts are allowed (common for dev/staging OIDC providers).
|
|
84
|
+
*
|
|
85
|
+
* @throws If the URL is unsafe for server-side fetch
|
|
86
|
+
*/
|
|
87
|
+
function validateDiscoveryUrl(url) {
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = new URL(url);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new Error(`OIDC discovery URL is not a valid URL: ${url}`);
|
|
94
|
+
}
|
|
95
|
+
// Scheme validation: only https in production, http only for localhost
|
|
96
|
+
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "::1";
|
|
97
|
+
if (parsed.protocol === "http:" && !isLocalhost) {
|
|
98
|
+
throw new Error(`OIDC discovery URL must use HTTPS: ${url}. ` + `HTTP is only allowed for localhost development.`);
|
|
99
|
+
}
|
|
100
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
101
|
+
throw new Error(`OIDC discovery URL must use HTTPS (got ${parsed.protocol}): ${url}`);
|
|
102
|
+
}
|
|
103
|
+
// Blocked hostname check (cloud metadata services)
|
|
104
|
+
if (BLOCKED_HOSTNAMES.has(parsed.hostname.toLowerCase())) {
|
|
105
|
+
throw new Error(`OIDC discovery URL targets a blocked host: ${parsed.hostname}`);
|
|
106
|
+
}
|
|
107
|
+
// Blocked IP pattern check (private networks, link-local, loopback)
|
|
108
|
+
// Skip for localhost — explicitly allowed above for development
|
|
109
|
+
if (!isLocalhost) {
|
|
110
|
+
for (const pattern of BLOCKED_HOST_PATTERNS) {
|
|
111
|
+
if (pattern.test(parsed.hostname)) {
|
|
112
|
+
throw new Error(`OIDC discovery URL targets a private/internal address: ${parsed.hostname}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Public API
|
|
119
|
+
// ============================================================================
|
|
120
|
+
/**
|
|
121
|
+
* Fetches an OIDC discovery document from the well-known endpoint.
|
|
122
|
+
*
|
|
123
|
+
* Always makes a network request — does NOT use the cache.
|
|
124
|
+
* Prefer {@link getOidcDiscovery} for cached access.
|
|
125
|
+
*
|
|
126
|
+
* @param issuerUrl - OIDC issuer URL (e.g. `https://auth.example.com`)
|
|
127
|
+
* @returns Parsed and validated discovery document
|
|
128
|
+
* @throws If the fetch fails or required fields are missing
|
|
129
|
+
*/
|
|
130
|
+
export async function fetchOidcDiscovery(issuerUrl) {
|
|
131
|
+
const normalizedIssuer = issuerUrl.replace(/\/+$/, "");
|
|
132
|
+
const discoveryUrl = `${normalizedIssuer}${WELL_KNOWN_PATH}`;
|
|
133
|
+
// SSRF protection: validate URL before fetching (CWE-918)
|
|
134
|
+
try {
|
|
135
|
+
validateDiscoveryUrl(discoveryUrl);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
const reason = err instanceof Error ? err.message : "invalid URL";
|
|
139
|
+
logger.error(LogMessages.SSRF_BLOCKED, discoveryUrl, reason);
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
logger.info(LogMessages.FETCHING, discoveryUrl);
|
|
143
|
+
let response;
|
|
144
|
+
try {
|
|
145
|
+
response = await fetch(discoveryUrl, {
|
|
146
|
+
headers: { Accept: "application/json" },
|
|
147
|
+
signal: AbortSignal.timeout(DEFAULT_FETCH_TIMEOUT_MS),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const message = err instanceof Error ? err.message : "network error";
|
|
152
|
+
logger.error(LogMessages.FETCH_FAILED, discoveryUrl, message);
|
|
153
|
+
throw new Error(`OIDC discovery fetch failed for ${normalizedIssuer}: ${message}`, { cause: err });
|
|
154
|
+
}
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
throw new Error(`OIDC discovery failed for ${normalizedIssuer}: HTTP ${response.status}. ` +
|
|
157
|
+
`Ensure the provider supports OpenID Connect Discovery at ${discoveryUrl}`);
|
|
158
|
+
}
|
|
159
|
+
const data = (await response.json());
|
|
160
|
+
// Validate required fields
|
|
161
|
+
const missing = [];
|
|
162
|
+
if (typeof data.authorization_endpoint !== "string")
|
|
163
|
+
missing.push("authorization_endpoint");
|
|
164
|
+
if (typeof data.token_endpoint !== "string")
|
|
165
|
+
missing.push("token_endpoint");
|
|
166
|
+
if (missing.length > 0) {
|
|
167
|
+
logger.error(LogMessages.MISSING_FIELDS, discoveryUrl, missing.join(", "));
|
|
168
|
+
throw new Error(`OIDC discovery at ${discoveryUrl} is missing required fields: ${missing.join(", ")}`);
|
|
169
|
+
}
|
|
170
|
+
const document = {
|
|
171
|
+
authorization_endpoint: data.authorization_endpoint,
|
|
172
|
+
token_endpoint: data.token_endpoint,
|
|
173
|
+
...(typeof data.userinfo_endpoint === "string" && {
|
|
174
|
+
userinfo_endpoint: data.userinfo_endpoint,
|
|
175
|
+
}),
|
|
176
|
+
...(typeof data.revocation_endpoint === "string" && {
|
|
177
|
+
revocation_endpoint: data.revocation_endpoint,
|
|
178
|
+
}),
|
|
179
|
+
...(Array.isArray(data.scopes_supported) && {
|
|
180
|
+
scopes_supported: data.scopes_supported,
|
|
181
|
+
}),
|
|
182
|
+
...(Array.isArray(data.token_endpoint_auth_methods_supported) && {
|
|
183
|
+
token_endpoint_auth_methods_supported: data.token_endpoint_auth_methods_supported,
|
|
184
|
+
}),
|
|
185
|
+
...(typeof data.issuer === "string" && { issuer: data.issuer }),
|
|
186
|
+
};
|
|
187
|
+
// RFC 8414: issuer in the discovery document MUST match the requested issuer URL
|
|
188
|
+
if (document.issuer && document.issuer.replace(/\/+$/, "") !== normalizedIssuer) {
|
|
189
|
+
logger.error(LogMessages.ISSUER_MISMATCH, normalizedIssuer, document.issuer);
|
|
190
|
+
throw new Error(`OIDC discovery issuer mismatch: requested ${normalizedIssuer} but document declares ${document.issuer}. ` +
|
|
191
|
+
`This may indicate a misconfigured or compromised OIDC provider.`);
|
|
192
|
+
}
|
|
193
|
+
logger.info(LogMessages.FETCHED, document.authorization_endpoint, document.token_endpoint, document.userinfo_endpoint ?? "(none)");
|
|
194
|
+
return document;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Returns an OIDC discovery document, using a TTL-based cache.
|
|
198
|
+
*
|
|
199
|
+
* If a cached document exists and is within the TTL, returns it immediately.
|
|
200
|
+
* Otherwise, fetches a fresh document and updates the cache.
|
|
201
|
+
*
|
|
202
|
+
* @param issuerUrl - OIDC issuer URL (e.g. `https://auth.example.com`)
|
|
203
|
+
* @param ttlMs - Cache TTL in milliseconds (default: 1 hour)
|
|
204
|
+
* @returns Cached or freshly fetched discovery document
|
|
205
|
+
*/
|
|
206
|
+
export async function getOidcDiscovery(issuerUrl, ttlMs = DEFAULT_DISCOVERY_TTL_MS) {
|
|
207
|
+
const normalizedIssuer = issuerUrl.replace(/\/+$/, "");
|
|
208
|
+
const cached = discoveryCache.get(normalizedIssuer);
|
|
209
|
+
if (cached) {
|
|
210
|
+
const ageMs = Date.now() - cached.fetchedAt;
|
|
211
|
+
if (ageMs < ttlMs) {
|
|
212
|
+
logger.debug(LogMessages.CACHED, normalizedIssuer, Math.floor(ageMs / 1000));
|
|
213
|
+
return cached.document;
|
|
214
|
+
}
|
|
215
|
+
logger.debug(LogMessages.REFRESHING, normalizedIssuer, Math.floor(ageMs / 1000), Math.floor(ttlMs / 1000));
|
|
216
|
+
}
|
|
217
|
+
const document = await fetchOidcDiscovery(normalizedIssuer);
|
|
218
|
+
// Evict oldest entry if cache is full
|
|
219
|
+
if (discoveryCache.size >= MAX_DISCOVERY_CACHE_SIZE && !discoveryCache.has(normalizedIssuer)) {
|
|
220
|
+
const oldestKey = discoveryCache.keys().next().value;
|
|
221
|
+
if (oldestKey !== undefined)
|
|
222
|
+
discoveryCache.delete(oldestKey);
|
|
223
|
+
}
|
|
224
|
+
discoveryCache.set(normalizedIssuer, { document, fetchedAt: Date.now() });
|
|
225
|
+
return document;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Clears the OIDC discovery cache.
|
|
229
|
+
* Primarily for testing and hot-reload scenarios.
|
|
230
|
+
*/
|
|
231
|
+
export function clearOidcDiscoveryCache() {
|
|
232
|
+
discoveryCache.clear();
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=oidc-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-discovery.js","sourceRoot":"","sources":["../../../src/server/auth/oidc-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates an {@link OAuthServerProvider} for any OpenID Connect-compliant
|
|
5
|
+
* authorization server using **automatic endpoint discovery**.
|
|
6
|
+
*
|
|
7
|
+
* Given just an issuer URL, the factory fetches the OIDC discovery document
|
|
8
|
+
* (`/.well-known/openid-configuration`) and configures a full upstream OAuth
|
|
9
|
+
* provider with server-side callbacks. This eliminates per-provider boilerplate
|
|
10
|
+
* for standard OIDC providers (Keycloak, Auth0, Okta, Azure AD, PocketID, etc.).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { createOidcProvider, createServer } from 'mcp-server-framework';
|
|
15
|
+
*
|
|
16
|
+
* const { provider, callbackHandler } = await createOidcProvider({
|
|
17
|
+
* issuer: 'https://auth.example.com',
|
|
18
|
+
* clientId: process.env.OIDC_CLIENT_ID!,
|
|
19
|
+
* clientSecret: process.env.OIDC_CLIENT_SECRET!,
|
|
20
|
+
* serverUrl: 'http://localhost:8000',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const { start } = createServer({
|
|
24
|
+
* name: 'my-server',
|
|
25
|
+
* version: '1.0.0',
|
|
26
|
+
* transport: { mode: 'http' },
|
|
27
|
+
* auth: {
|
|
28
|
+
* provider,
|
|
29
|
+
* callbackHandler,
|
|
30
|
+
* issuerUrl: new URL('http://localhost:8000'),
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* await start();
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @module server/auth/oidc-provider
|
|
37
|
+
*/
|
|
38
|
+
import type { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js";
|
|
39
|
+
import type { UpstreamOAuthProviderResult } from "./upstream-provider.js";
|
|
40
|
+
/**
|
|
41
|
+
* Options for {@link createOidcProvider}.
|
|
42
|
+
*/
|
|
43
|
+
export interface OidcProviderOptions {
|
|
44
|
+
/**
|
|
45
|
+
* OIDC issuer URL (e.g. `https://auth.example.com`).
|
|
46
|
+
* The discovery document is fetched from `{issuer}/.well-known/openid-configuration`.
|
|
47
|
+
*/
|
|
48
|
+
readonly issuer: string;
|
|
49
|
+
/** Client ID registered with the OIDC provider */
|
|
50
|
+
readonly clientId: string;
|
|
51
|
+
/** Client secret registered with the OIDC provider */
|
|
52
|
+
readonly clientSecret: string;
|
|
53
|
+
/** MCP server base URL (e.g. `http://localhost:8000`). Used as redirect_uri target. */
|
|
54
|
+
readonly serverUrl: string;
|
|
55
|
+
/**
|
|
56
|
+
* Scopes to request from the upstream OIDC provider.
|
|
57
|
+
* @default ['openid', 'profile', 'email']
|
|
58
|
+
*/
|
|
59
|
+
readonly upstreamScopes?: readonly string[];
|
|
60
|
+
/**
|
|
61
|
+
* MCP scopes granted to authenticated users.
|
|
62
|
+
* If not provided, the default `mapUserInfo` grants no scopes (empty array).
|
|
63
|
+
* When providing a custom `mapUserInfo`, this option is ignored.
|
|
64
|
+
*/
|
|
65
|
+
readonly grantedScopes?: readonly string[];
|
|
66
|
+
/**
|
|
67
|
+
* Custom mapping from OIDC UserInfo response to MCP {@link AuthInfo}.
|
|
68
|
+
*
|
|
69
|
+
* When not provided, the default mapping uses standard OIDC claims:
|
|
70
|
+
* - `sub` → `clientId`
|
|
71
|
+
* - `grantedScopes` → `scopes`
|
|
72
|
+
* - 1h artificial `expiresAt` (token is re-verified on each request)
|
|
73
|
+
* - `name`, `email`, `preferred_username` → `extra`
|
|
74
|
+
*/
|
|
75
|
+
readonly mapUserInfo?: (token: string, data: Record<string, unknown>) => Promise<AuthInfo>;
|
|
76
|
+
/**
|
|
77
|
+
* TTL for the cached OIDC discovery document in milliseconds.
|
|
78
|
+
* The discovery document is re-fetched when the TTL expires.
|
|
79
|
+
* @default 3600000 (1 hour)
|
|
80
|
+
*/
|
|
81
|
+
readonly discoveryTtlMs?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates an {@link OAuthServerProvider} for an OIDC-compliant authorization server.
|
|
85
|
+
*
|
|
86
|
+
* This is an **async factory** — it fetches the OIDC discovery document at creation
|
|
87
|
+
* time to resolve endpoint URLs. The discovery document is cached with a configurable
|
|
88
|
+
* TTL and refreshed transparently on subsequent token verifications.
|
|
89
|
+
*
|
|
90
|
+
* Internally delegates to {@link createUpstreamOAuthProvider} after resolving endpoints.
|
|
91
|
+
*
|
|
92
|
+
* @param options - OIDC provider configuration
|
|
93
|
+
* @returns Provider and callback handler, ready for {@link AuthOptions}
|
|
94
|
+
*/
|
|
95
|
+
export declare function createOidcProvider(options: OidcProviderOptions): Promise<UpstreamOAuthProviderResult>;
|
|
96
|
+
//# sourceMappingURL=oidc-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.d.ts","sourceRoot":"","sources":["../../../src/server/auth/oidc-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAG/E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AA0C1E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE5C;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE3C;;;;;;;;OAQG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3F;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA6E3G"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates an {@link OAuthServerProvider} for any OpenID Connect-compliant
|
|
5
|
+
* authorization server using **automatic endpoint discovery**.
|
|
6
|
+
*
|
|
7
|
+
* Given just an issuer URL, the factory fetches the OIDC discovery document
|
|
8
|
+
* (`/.well-known/openid-configuration`) and configures a full upstream OAuth
|
|
9
|
+
* provider with server-side callbacks. This eliminates per-provider boilerplate
|
|
10
|
+
* for standard OIDC providers (Keycloak, Auth0, Okta, Azure AD, PocketID, etc.).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { createOidcProvider, createServer } from 'mcp-server-framework';
|
|
15
|
+
*
|
|
16
|
+
* const { provider, callbackHandler } = await createOidcProvider({
|
|
17
|
+
* issuer: 'https://auth.example.com',
|
|
18
|
+
* clientId: process.env.OIDC_CLIENT_ID!,
|
|
19
|
+
* clientSecret: process.env.OIDC_CLIENT_SECRET!,
|
|
20
|
+
* serverUrl: 'http://localhost:8000',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const { start } = createServer({
|
|
24
|
+
* name: 'my-server',
|
|
25
|
+
* version: '1.0.0',
|
|
26
|
+
* transport: { mode: 'http' },
|
|
27
|
+
* auth: {
|
|
28
|
+
* provider,
|
|
29
|
+
* callbackHandler,
|
|
30
|
+
* issuerUrl: new URL('http://localhost:8000'),
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* await start();
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @module server/auth/oidc-provider
|
|
37
|
+
*/
|
|
38
|
+
import { getOidcDiscovery } from "./oidc-discovery.js";
|
|
39
|
+
import { createUpstreamOAuthProvider } from "./upstream-provider.js";
|
|
40
|
+
import { logger as baseLogger } from "../../logger/index.js";
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Logger
|
|
43
|
+
// ============================================================================
|
|
44
|
+
const LOG_COMPONENT = "oidc-provider";
|
|
45
|
+
const LogMessages = {
|
|
46
|
+
CREATING: "Creating OIDC provider for issuer %s",
|
|
47
|
+
CREATED: "OIDC provider ready (authorization=%s, token=%s, userinfo=%s)",
|
|
48
|
+
NO_USERINFO: "OIDC discovery for %s has no userinfo_endpoint — token verification may fail",
|
|
49
|
+
};
|
|
50
|
+
const logger = baseLogger.child({ component: LOG_COMPONENT });
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Constants
|
|
53
|
+
// ============================================================================
|
|
54
|
+
/** Default OIDC scopes to request from the upstream provider */
|
|
55
|
+
const DEFAULT_UPSTREAM_SCOPES = ["openid", "profile", "email"];
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Factory
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Creates an {@link OAuthServerProvider} for an OIDC-compliant authorization server.
|
|
61
|
+
*
|
|
62
|
+
* This is an **async factory** — it fetches the OIDC discovery document at creation
|
|
63
|
+
* time to resolve endpoint URLs. The discovery document is cached with a configurable
|
|
64
|
+
* TTL and refreshed transparently on subsequent token verifications.
|
|
65
|
+
*
|
|
66
|
+
* Internally delegates to {@link createUpstreamOAuthProvider} after resolving endpoints.
|
|
67
|
+
*
|
|
68
|
+
* @param options - OIDC provider configuration
|
|
69
|
+
* @returns Provider and callback handler, ready for {@link AuthOptions}
|
|
70
|
+
*/
|
|
71
|
+
export async function createOidcProvider(options) {
|
|
72
|
+
const { issuer, clientId, clientSecret, serverUrl, upstreamScopes = DEFAULT_UPSTREAM_SCOPES, grantedScopes, mapUserInfo, discoveryTtlMs, } = options;
|
|
73
|
+
logger.info(LogMessages.CREATING, issuer);
|
|
74
|
+
// Fetch OIDC discovery document (cached with TTL)
|
|
75
|
+
const discovery = await getOidcDiscovery(issuer, discoveryTtlMs);
|
|
76
|
+
if (!discovery.userinfo_endpoint) {
|
|
77
|
+
logger.warn(LogMessages.NO_USERINFO, issuer);
|
|
78
|
+
}
|
|
79
|
+
logger.info(LogMessages.CREATED, discovery.authorization_endpoint, discovery.token_endpoint, discovery.userinfo_endpoint ?? "(none)");
|
|
80
|
+
// Default OIDC UserInfo → AuthInfo mapping
|
|
81
|
+
const defaultMapUserInfo = async (token, data) => {
|
|
82
|
+
// @type-narrowing: OIDC UserInfo response contains standard claims
|
|
83
|
+
const claims = data;
|
|
84
|
+
// Validate required `sub` claim (OIDC Core §5.1) at system boundary
|
|
85
|
+
if (!claims.sub || typeof claims.sub !== "string") {
|
|
86
|
+
throw new Error("OIDC UserInfo response missing required 'sub' claim");
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
token,
|
|
90
|
+
clientId: claims.sub,
|
|
91
|
+
scopes: grantedScopes ? [...grantedScopes] : [],
|
|
92
|
+
// SDK requireBearerAuth middleware requires expiresAt.
|
|
93
|
+
// Use 1h expiry — token is re-verified via userinfo on each request.
|
|
94
|
+
expiresAt: Math.floor(Date.now() / 1000) + 3600,
|
|
95
|
+
extra: {
|
|
96
|
+
provider: "oidc",
|
|
97
|
+
issuer,
|
|
98
|
+
// Validate optional claim types at system boundary — OIDC providers may return non-string values
|
|
99
|
+
username: typeof claims.preferred_username === "string" ? claims.preferred_username : undefined,
|
|
100
|
+
displayName: typeof claims.name === "string"
|
|
101
|
+
? claims.name
|
|
102
|
+
: typeof claims.preferred_username === "string"
|
|
103
|
+
? claims.preferred_username
|
|
104
|
+
: claims.sub,
|
|
105
|
+
email: typeof claims.email === "string" ? claims.email : undefined,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
return createUpstreamOAuthProvider({
|
|
110
|
+
endpoints: {
|
|
111
|
+
authorizationUrl: discovery.authorization_endpoint,
|
|
112
|
+
tokenUrl: discovery.token_endpoint,
|
|
113
|
+
userinfoUrl: discovery.userinfo_endpoint,
|
|
114
|
+
revocationUrl: discovery.revocation_endpoint,
|
|
115
|
+
},
|
|
116
|
+
clientId,
|
|
117
|
+
clientSecret,
|
|
118
|
+
serverUrl,
|
|
119
|
+
upstreamScopes: [...upstreamScopes],
|
|
120
|
+
mapUserInfo: mapUserInfo ?? defaultMapUserInfo,
|
|
121
|
+
tokenRequestContentType: "form", // OIDC standard
|
|
122
|
+
upstreamAuthorizeParams: { response_type: "code" },
|
|
123
|
+
refreshTokenSupport: true,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=oidc-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.js","sourceRoot":"","sources":["../../../src/server/auth/oidc-provider.ts"],"names":[],"mappings":"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"}
|