digitaltwin-core 0.14.2 → 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/LICENSE +20 -20
- package/README.md +494 -359
- package/dist/auth/apisix_parser.d.ts +141 -0
- package/dist/auth/apisix_parser.d.ts.map +1 -0
- package/dist/auth/apisix_parser.js +161 -0
- package/dist/auth/apisix_parser.js.map +1 -0
- package/dist/auth/auth_config.d.ts +126 -0
- package/dist/auth/auth_config.d.ts.map +1 -0
- package/dist/auth/auth_config.js +169 -0
- package/dist/auth/auth_config.js.map +1 -0
- package/dist/auth/auth_provider.d.ts +118 -0
- package/dist/auth/auth_provider.d.ts.map +1 -0
- package/dist/auth/auth_provider.js +8 -0
- package/dist/auth/auth_provider.js.map +1 -0
- package/dist/auth/auth_provider_factory.d.ts +91 -0
- package/dist/auth/auth_provider_factory.d.ts.map +1 -0
- package/dist/auth/auth_provider_factory.js +146 -0
- package/dist/auth/auth_provider_factory.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/providers/gateway_auth_provider.d.ts +78 -0
- package/dist/auth/providers/gateway_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/gateway_auth_provider.js +109 -0
- package/dist/auth/providers/gateway_auth_provider.js.map +1 -0
- package/dist/auth/providers/index.d.ts +4 -0
- package/dist/auth/providers/index.d.ts.map +1 -0
- package/dist/auth/providers/index.js +4 -0
- package/dist/auth/providers/index.js.map +1 -0
- package/dist/auth/providers/jwt_auth_provider.d.ts +91 -0
- package/dist/auth/providers/jwt_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/jwt_auth_provider.js +204 -0
- package/dist/auth/providers/jwt_auth_provider.js.map +1 -0
- package/dist/auth/providers/no_auth_provider.d.ts +61 -0
- package/dist/auth/providers/no_auth_provider.d.ts.map +1 -0
- package/dist/auth/providers/no_auth_provider.js +76 -0
- package/dist/auth/providers/no_auth_provider.js.map +1 -0
- package/dist/auth/types.d.ts +100 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user_service.d.ts +86 -0
- package/dist/auth/user_service.d.ts.map +1 -0
- package/dist/auth/user_service.js +237 -0
- package/dist/auth/user_service.js.map +1 -0
- package/dist/components/assets_manager.d.ts +662 -0
- package/dist/components/assets_manager.d.ts.map +1 -0
- package/dist/components/assets_manager.js +1537 -0
- package/dist/components/assets_manager.js.map +1 -0
- package/dist/components/async_upload.d.ts +20 -0
- package/dist/components/async_upload.d.ts.map +1 -0
- package/dist/components/async_upload.js +10 -0
- package/dist/components/async_upload.js.map +1 -0
- package/dist/components/collector.d.ts +203 -0
- package/dist/components/collector.d.ts.map +1 -0
- package/dist/components/collector.js +214 -0
- package/dist/components/collector.js.map +1 -0
- package/dist/components/custom_table_manager.d.ts +503 -0
- package/dist/components/custom_table_manager.d.ts.map +1 -0
- package/dist/components/custom_table_manager.js +1023 -0
- package/dist/components/custom_table_manager.js.map +1 -0
- package/dist/components/global_assets_handler.d.ts +63 -0
- package/dist/components/global_assets_handler.d.ts.map +1 -0
- package/dist/components/global_assets_handler.js +127 -0
- package/dist/components/global_assets_handler.js.map +1 -0
- package/dist/components/handler.d.ts +104 -0
- package/dist/components/handler.d.ts.map +1 -0
- package/dist/components/handler.js +110 -0
- package/dist/components/handler.js.map +1 -0
- package/dist/components/harvester.d.ts +182 -0
- package/dist/components/harvester.d.ts.map +1 -0
- package/dist/components/harvester.js +406 -0
- package/dist/components/harvester.js.map +1 -0
- package/dist/components/index.d.ts +11 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +9 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/interfaces.d.ts +126 -0
- package/dist/components/interfaces.d.ts.map +1 -0
- package/dist/components/interfaces.js +8 -0
- package/dist/components/interfaces.js.map +1 -0
- package/dist/components/map_manager.d.ts +61 -0
- package/dist/components/map_manager.d.ts.map +1 -0
- package/dist/components/map_manager.js +242 -0
- package/dist/components/map_manager.js.map +1 -0
- package/dist/components/tileset_manager.d.ts +125 -0
- package/dist/components/tileset_manager.d.ts.map +1 -0
- package/dist/components/tileset_manager.js +623 -0
- package/dist/components/tileset_manager.js.map +1 -0
- package/dist/components/types.d.ts +226 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +8 -0
- package/dist/components/types.js.map +1 -0
- package/dist/database/adapters/knex_database_adapter.d.ts +97 -0
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
- package/dist/database/adapters/knex_database_adapter.js +729 -0
- package/dist/database/adapters/knex_database_adapter.js.map +1 -0
- package/dist/database/database_adapter.d.ts +262 -0
- package/dist/database/database_adapter.d.ts.map +1 -0
- package/dist/database/database_adapter.js +46 -0
- package/dist/database/database_adapter.js.map +1 -0
- package/dist/engine/digital_twin_engine.d.ts +295 -0
- package/dist/engine/digital_twin_engine.d.ts.map +1 -0
- package/dist/engine/digital_twin_engine.js +907 -0
- package/dist/engine/digital_twin_engine.js.map +1 -0
- package/dist/engine/endpoints.d.ts +47 -0
- package/dist/engine/endpoints.d.ts.map +1 -0
- package/dist/engine/endpoints.js +88 -0
- package/dist/engine/endpoints.js.map +1 -0
- package/dist/engine/error_handler.d.ts +20 -0
- package/dist/engine/error_handler.d.ts.map +1 -0
- package/dist/engine/error_handler.js +69 -0
- package/dist/engine/error_handler.js.map +1 -0
- package/dist/engine/events.d.ts +93 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +71 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/health.d.ts +112 -0
- package/dist/engine/health.d.ts.map +1 -0
- package/dist/engine/health.js +190 -0
- package/dist/engine/health.js.map +1 -0
- package/dist/engine/initializer.d.ts +62 -0
- package/dist/engine/initializer.d.ts.map +1 -0
- package/dist/engine/initializer.js +108 -0
- package/dist/engine/initializer.js.map +1 -0
- package/dist/engine/queue_manager.d.ts +87 -0
- package/dist/engine/queue_manager.d.ts.map +1 -0
- package/dist/engine/queue_manager.js +196 -0
- package/dist/engine/queue_manager.js.map +1 -0
- package/dist/engine/scheduler.d.ts +30 -0
- package/dist/engine/scheduler.d.ts.map +1 -0
- package/dist/engine/scheduler.js +378 -0
- package/dist/engine/scheduler.js.map +1 -0
- package/dist/engine/upload_processor.d.ts +36 -0
- package/dist/engine/upload_processor.d.ts.map +1 -0
- package/dist/engine/upload_processor.js +113 -0
- package/dist/engine/upload_processor.js.map +1 -0
- package/dist/env/env.d.ts +134 -0
- package/dist/env/env.d.ts.map +1 -0
- package/dist/env/env.js +177 -0
- package/dist/env/env.js.map +1 -0
- package/dist/errors/index.d.ts +94 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +149 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi/generator.d.ts +93 -0
- package/dist/openapi/generator.d.ts.map +1 -0
- package/dist/openapi/generator.js +293 -0
- package/dist/openapi/generator.js.map +1 -0
- package/dist/openapi/index.d.ts +9 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +9 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/types.d.ts +182 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/openapi/types.js +16 -0
- package/dist/openapi/types.js.map +1 -0
- package/dist/storage/adapters/local_storage_service.d.ts +57 -0
- package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/local_storage_service.js +132 -0
- package/dist/storage/adapters/local_storage_service.js.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts +72 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.js +205 -0
- package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
- package/dist/storage/storage_factory.d.ts +14 -0
- package/dist/storage/storage_factory.d.ts.map +1 -0
- package/dist/storage/storage_factory.js +43 -0
- package/dist/storage/storage_factory.js.map +1 -0
- package/dist/storage/storage_service.d.ts +163 -0
- package/dist/storage/storage_service.d.ts.map +1 -0
- package/dist/storage/storage_service.js +58 -0
- package/dist/storage/storage_service.js.map +1 -0
- package/dist/types/data_record.d.ts +123 -0
- package/dist/types/data_record.d.ts.map +1 -0
- package/dist/types/data_record.js +8 -0
- package/dist/types/data_record.js.map +1 -0
- package/dist/utils/graceful_shutdown.d.ts +44 -0
- package/dist/utils/graceful_shutdown.d.ts.map +1 -0
- package/dist/utils/graceful_shutdown.js +79 -0
- package/dist/utils/graceful_shutdown.js.map +1 -0
- package/dist/utils/http_responses.d.ts +175 -0
- package/dist/utils/http_responses.d.ts.map +1 -0
- package/dist/utils/http_responses.js +216 -0
- package/dist/utils/http_responses.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +74 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/map_to_data_record.d.ts +10 -0
- package/dist/utils/map_to_data_record.d.ts.map +1 -0
- package/dist/utils/map_to_data_record.js +36 -0
- package/dist/utils/map_to_data_record.js.map +1 -0
- package/dist/utils/safe_async.d.ts +50 -0
- package/dist/utils/safe_async.d.ts.map +1 -0
- package/dist/utils/safe_async.js +90 -0
- package/dist/utils/safe_async.js.map +1 -0
- package/dist/utils/servable_endpoint.d.ts +63 -0
- package/dist/utils/servable_endpoint.d.ts.map +1 -0
- package/dist/utils/servable_endpoint.js +67 -0
- package/dist/utils/servable_endpoint.js.map +1 -0
- package/dist/utils/zip_utils.d.ts +66 -0
- package/dist/utils/zip_utils.d.ts.map +1 -0
- package/dist/utils/zip_utils.js +169 -0
- package/dist/utils/zip_utils.js.map +1 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +273 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +82 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validation/validate.d.ts +49 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/validation/validate.js +110 -0
- package/dist/validation/validate.js.map +1 -0
- package/package.json +23 -13
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Authentication provider interface and types for the Digital Twin framework.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the contract for authentication providers, allowing the framework
|
|
5
|
+
* to support multiple authentication mechanisms (gateway headers, JWT tokens, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import type { AuthenticatedUser } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Authentication mode for the Digital Twin framework.
|
|
10
|
+
*
|
|
11
|
+
* - `gateway`: Parse authentication from gateway headers (x-user-id, x-user-roles)
|
|
12
|
+
* - `jwt`: Validate JWT tokens from Authorization header
|
|
13
|
+
* - `none`: Disable authentication (development/testing only)
|
|
14
|
+
*/
|
|
15
|
+
export type AuthMode = 'gateway' | 'jwt' | 'none';
|
|
16
|
+
/**
|
|
17
|
+
* JWT-specific configuration options.
|
|
18
|
+
*/
|
|
19
|
+
export interface JwtConfig {
|
|
20
|
+
/** Secret key for HMAC algorithms (HS256, HS384, HS512) */
|
|
21
|
+
secret?: string;
|
|
22
|
+
/** Public key for RSA/EC algorithms (RS256, RS384, RS512, ES256, ES384, ES512) */
|
|
23
|
+
publicKey?: string;
|
|
24
|
+
/** JWT algorithm (default: 'HS256') */
|
|
25
|
+
algorithm?: string;
|
|
26
|
+
/** Expected token issuer for validation */
|
|
27
|
+
issuer?: string;
|
|
28
|
+
/** Expected token audience for validation */
|
|
29
|
+
audience?: string;
|
|
30
|
+
/** Claim name for user ID (default: 'sub') */
|
|
31
|
+
userIdClaim?: string;
|
|
32
|
+
/** Claim name for roles (default: 'roles', supports nested paths like 'realm_access.roles') */
|
|
33
|
+
rolesClaim?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Authentication configuration for the Digital Twin framework.
|
|
37
|
+
*/
|
|
38
|
+
export interface AuthProviderConfig {
|
|
39
|
+
/** Authentication mode */
|
|
40
|
+
mode: AuthMode;
|
|
41
|
+
/** Name of the admin role (default: 'admin') */
|
|
42
|
+
adminRoleName?: string;
|
|
43
|
+
/** JWT-specific configuration (required when mode is 'jwt') */
|
|
44
|
+
jwt?: JwtConfig;
|
|
45
|
+
/** Anonymous user ID for 'none' mode (default: 'anonymous') */
|
|
46
|
+
anonymousUserId?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Request-like object for authentication parsing.
|
|
50
|
+
*
|
|
51
|
+
* This interface allows the auth provider to work with any request object
|
|
52
|
+
* that has headers, without requiring a full Express Request.
|
|
53
|
+
*/
|
|
54
|
+
export interface AuthRequest {
|
|
55
|
+
/** Request headers */
|
|
56
|
+
headers: Record<string, string | string[] | undefined>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Authentication provider interface.
|
|
60
|
+
*
|
|
61
|
+
* Implement this interface to create custom authentication mechanisms.
|
|
62
|
+
* The framework provides three built-in providers:
|
|
63
|
+
* - GatewayAuthProvider: For API gateway authentication (Apache APISIX, KrakenD)
|
|
64
|
+
* - JwtAuthProvider: For direct JWT token validation
|
|
65
|
+
* - NoAuthProvider: For development/testing without authentication
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Using the factory (recommended)
|
|
70
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
71
|
+
*
|
|
72
|
+
* // In a handler
|
|
73
|
+
* const user = provider.parseRequest(req)
|
|
74
|
+
* if (!user) {
|
|
75
|
+
* return { status: 401, content: 'Authentication required' }
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export interface AuthProvider {
|
|
80
|
+
/**
|
|
81
|
+
* Parse the request and return the authenticated user.
|
|
82
|
+
*
|
|
83
|
+
* @param req - Request object with headers
|
|
84
|
+
* @returns Authenticated user, or null if not authenticated or invalid
|
|
85
|
+
*/
|
|
86
|
+
parseRequest(req: AuthRequest): AuthenticatedUser | null;
|
|
87
|
+
/**
|
|
88
|
+
* Check if the request has valid authentication.
|
|
89
|
+
*
|
|
90
|
+
* This is a quick check that can be used before full parsing.
|
|
91
|
+
*
|
|
92
|
+
* @param req - Request object with headers
|
|
93
|
+
* @returns true if the request has valid authentication credentials
|
|
94
|
+
*/
|
|
95
|
+
hasValidAuth(req: AuthRequest): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Check if the authenticated user has admin privileges.
|
|
98
|
+
*
|
|
99
|
+
* @param req - Request object with headers
|
|
100
|
+
* @returns true if the user has the admin role
|
|
101
|
+
*/
|
|
102
|
+
isAdmin(req: AuthRequest): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Get the user ID from the request.
|
|
105
|
+
*
|
|
106
|
+
* @param req - Request object with headers
|
|
107
|
+
* @returns User ID, or null if not authenticated
|
|
108
|
+
*/
|
|
109
|
+
getUserId(req: AuthRequest): string | null;
|
|
110
|
+
/**
|
|
111
|
+
* Get the user roles from the request.
|
|
112
|
+
*
|
|
113
|
+
* @param req - Request object with headers
|
|
114
|
+
* @returns Array of role names, empty array if not authenticated
|
|
115
|
+
*/
|
|
116
|
+
getUserRoles(req: AuthRequest): string[];
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=auth_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth_provider.d.ts","sourceRoot":"","sources":["../../src/auth/auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CACzD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CAAA;IAExD;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAA;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAA;IAElC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAA;IAE1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAAA;CAC3C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Authentication provider interface and types for the Digital Twin framework.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the contract for authentication providers, allowing the framework
|
|
5
|
+
* to support multiple authentication mechanisms (gateway headers, JWT tokens, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=auth_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth_provider.js","sourceRoot":"","sources":["../../src/auth/auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Factory for creating authentication providers.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a factory for creating the appropriate authentication
|
|
5
|
+
* provider based on configuration or environment variables.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuthProvider, AuthProviderConfig } from './auth_provider.js';
|
|
8
|
+
/**
|
|
9
|
+
* Factory for creating authentication providers.
|
|
10
|
+
*
|
|
11
|
+
* Use this factory to create the appropriate authentication provider based on
|
|
12
|
+
* configuration or environment variables.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // Create from environment variables (recommended)
|
|
17
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
18
|
+
*
|
|
19
|
+
* // Create from explicit configuration
|
|
20
|
+
* const provider = AuthProviderFactory.create({
|
|
21
|
+
* mode: 'jwt',
|
|
22
|
+
* jwt: { secret: 'your-secret' }
|
|
23
|
+
* })
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class AuthProviderFactory {
|
|
27
|
+
/**
|
|
28
|
+
* Create an authentication provider from explicit configuration.
|
|
29
|
+
*
|
|
30
|
+
* @param config - Authentication configuration
|
|
31
|
+
* @returns Configured authentication provider
|
|
32
|
+
* @throws Error if configuration is invalid
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* // Gateway mode (default)
|
|
37
|
+
* const provider = AuthProviderFactory.create({ mode: 'gateway' })
|
|
38
|
+
*
|
|
39
|
+
* // JWT mode
|
|
40
|
+
* const provider = AuthProviderFactory.create({
|
|
41
|
+
* mode: 'jwt',
|
|
42
|
+
* jwt: { secret: 'your-secret', algorithm: 'HS256' }
|
|
43
|
+
* })
|
|
44
|
+
*
|
|
45
|
+
* // No auth mode (development only)
|
|
46
|
+
* const provider = AuthProviderFactory.create({ mode: 'none' })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
static create(config: AuthProviderConfig): AuthProvider;
|
|
50
|
+
/**
|
|
51
|
+
* Create an authentication provider from environment variables.
|
|
52
|
+
*
|
|
53
|
+
* Environment variables:
|
|
54
|
+
* - `AUTH_MODE`: Authentication mode ('gateway', 'jwt', 'none'). Default: 'gateway'
|
|
55
|
+
* - `AUTH_ADMIN_ROLE`: Name of admin role. Default: 'admin'
|
|
56
|
+
*
|
|
57
|
+
* For JWT mode:
|
|
58
|
+
* - `JWT_SECRET`: Secret key for HMAC algorithms
|
|
59
|
+
* - `JWT_PUBLIC_KEY`: Public key content for RSA/EC algorithms
|
|
60
|
+
* - `JWT_PUBLIC_KEY_FILE`: Path to public key file
|
|
61
|
+
* - `JWT_ALGORITHM`: Algorithm (default: 'HS256')
|
|
62
|
+
* - `JWT_ISSUER`: Expected token issuer
|
|
63
|
+
* - `JWT_AUDIENCE`: Expected token audience
|
|
64
|
+
* - `JWT_USER_ID_CLAIM`: Claim for user ID (default: 'sub')
|
|
65
|
+
* - `JWT_ROLES_CLAIM`: Claim for roles (default: 'roles')
|
|
66
|
+
*
|
|
67
|
+
* For no-auth mode:
|
|
68
|
+
* - `DIGITALTWIN_DISABLE_AUTH`: Set to 'true' to disable auth
|
|
69
|
+
* - `DIGITALTWIN_ANONYMOUS_USER_ID`: Anonymous user ID (default: 'anonymous')
|
|
70
|
+
*
|
|
71
|
+
* @returns Configured authentication provider
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // Gateway mode (default, no env vars needed)
|
|
76
|
+
* // AUTH_MODE=gateway or not set
|
|
77
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
78
|
+
*
|
|
79
|
+
* // JWT mode
|
|
80
|
+
* // AUTH_MODE=jwt
|
|
81
|
+
* // JWT_SECRET=your-secret
|
|
82
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
83
|
+
*
|
|
84
|
+
* // Disable auth for development
|
|
85
|
+
* // DIGITALTWIN_DISABLE_AUTH=true
|
|
86
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
static fromEnv(): AuthProvider;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=auth_provider_factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth_provider_factory.d.ts","sourceRoot":"","sources":["../../src/auth/auth_provider_factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAY,MAAM,oBAAoB,CAAA;AAKpF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAC5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY;IAgBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,CAAC,OAAO,IAAI,YAAY;CAkDjC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Factory for creating authentication providers.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a factory for creating the appropriate authentication
|
|
5
|
+
* provider based on configuration or environment variables.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { GatewayAuthProvider } from './providers/gateway_auth_provider.js';
|
|
9
|
+
import { JwtAuthProvider } from './providers/jwt_auth_provider.js';
|
|
10
|
+
import { NoAuthProvider } from './providers/no_auth_provider.js';
|
|
11
|
+
/**
|
|
12
|
+
* Factory for creating authentication providers.
|
|
13
|
+
*
|
|
14
|
+
* Use this factory to create the appropriate authentication provider based on
|
|
15
|
+
* configuration or environment variables.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Create from environment variables (recommended)
|
|
20
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
21
|
+
*
|
|
22
|
+
* // Create from explicit configuration
|
|
23
|
+
* const provider = AuthProviderFactory.create({
|
|
24
|
+
* mode: 'jwt',
|
|
25
|
+
* jwt: { secret: 'your-secret' }
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class AuthProviderFactory {
|
|
30
|
+
/**
|
|
31
|
+
* Create an authentication provider from explicit configuration.
|
|
32
|
+
*
|
|
33
|
+
* @param config - Authentication configuration
|
|
34
|
+
* @returns Configured authentication provider
|
|
35
|
+
* @throws Error if configuration is invalid
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // Gateway mode (default)
|
|
40
|
+
* const provider = AuthProviderFactory.create({ mode: 'gateway' })
|
|
41
|
+
*
|
|
42
|
+
* // JWT mode
|
|
43
|
+
* const provider = AuthProviderFactory.create({
|
|
44
|
+
* mode: 'jwt',
|
|
45
|
+
* jwt: { secret: 'your-secret', algorithm: 'HS256' }
|
|
46
|
+
* })
|
|
47
|
+
*
|
|
48
|
+
* // No auth mode (development only)
|
|
49
|
+
* const provider = AuthProviderFactory.create({ mode: 'none' })
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
static create(config) {
|
|
53
|
+
switch (config.mode) {
|
|
54
|
+
case 'gateway':
|
|
55
|
+
return new GatewayAuthProvider(config.adminRoleName);
|
|
56
|
+
case 'jwt':
|
|
57
|
+
return new JwtAuthProvider(config);
|
|
58
|
+
case 'none':
|
|
59
|
+
return new NoAuthProvider(config.anonymousUserId);
|
|
60
|
+
default:
|
|
61
|
+
throw new Error(`Unknown auth mode: ${config.mode}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create an authentication provider from environment variables.
|
|
66
|
+
*
|
|
67
|
+
* Environment variables:
|
|
68
|
+
* - `AUTH_MODE`: Authentication mode ('gateway', 'jwt', 'none'). Default: 'gateway'
|
|
69
|
+
* - `AUTH_ADMIN_ROLE`: Name of admin role. Default: 'admin'
|
|
70
|
+
*
|
|
71
|
+
* For JWT mode:
|
|
72
|
+
* - `JWT_SECRET`: Secret key for HMAC algorithms
|
|
73
|
+
* - `JWT_PUBLIC_KEY`: Public key content for RSA/EC algorithms
|
|
74
|
+
* - `JWT_PUBLIC_KEY_FILE`: Path to public key file
|
|
75
|
+
* - `JWT_ALGORITHM`: Algorithm (default: 'HS256')
|
|
76
|
+
* - `JWT_ISSUER`: Expected token issuer
|
|
77
|
+
* - `JWT_AUDIENCE`: Expected token audience
|
|
78
|
+
* - `JWT_USER_ID_CLAIM`: Claim for user ID (default: 'sub')
|
|
79
|
+
* - `JWT_ROLES_CLAIM`: Claim for roles (default: 'roles')
|
|
80
|
+
*
|
|
81
|
+
* For no-auth mode:
|
|
82
|
+
* - `DIGITALTWIN_DISABLE_AUTH`: Set to 'true' to disable auth
|
|
83
|
+
* - `DIGITALTWIN_ANONYMOUS_USER_ID`: Anonymous user ID (default: 'anonymous')
|
|
84
|
+
*
|
|
85
|
+
* @returns Configured authentication provider
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* // Gateway mode (default, no env vars needed)
|
|
90
|
+
* // AUTH_MODE=gateway or not set
|
|
91
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
92
|
+
*
|
|
93
|
+
* // JWT mode
|
|
94
|
+
* // AUTH_MODE=jwt
|
|
95
|
+
* // JWT_SECRET=your-secret
|
|
96
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
97
|
+
*
|
|
98
|
+
* // Disable auth for development
|
|
99
|
+
* // DIGITALTWIN_DISABLE_AUTH=true
|
|
100
|
+
* const provider = AuthProviderFactory.fromEnv()
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
static fromEnv() {
|
|
104
|
+
const adminRoleName = process.env.AUTH_ADMIN_ROLE || process.env.DIGITALTWIN_ADMIN_ROLE_NAME || 'admin';
|
|
105
|
+
// Check if auth is disabled (legacy env var)
|
|
106
|
+
if (process.env.DIGITALTWIN_DISABLE_AUTH === 'true') {
|
|
107
|
+
return new NoAuthProvider(process.env.DIGITALTWIN_ANONYMOUS_USER_ID || 'anonymous');
|
|
108
|
+
}
|
|
109
|
+
const mode = (process.env.AUTH_MODE || 'gateway');
|
|
110
|
+
if (mode === 'none') {
|
|
111
|
+
return new NoAuthProvider(process.env.DIGITALTWIN_ANONYMOUS_USER_ID || 'anonymous');
|
|
112
|
+
}
|
|
113
|
+
if (mode === 'gateway') {
|
|
114
|
+
return new GatewayAuthProvider(adminRoleName);
|
|
115
|
+
}
|
|
116
|
+
if (mode === 'jwt') {
|
|
117
|
+
// Load public key from file if specified
|
|
118
|
+
let publicKey;
|
|
119
|
+
if (process.env.JWT_PUBLIC_KEY_FILE) {
|
|
120
|
+
publicKey = fs.readFileSync(process.env.JWT_PUBLIC_KEY_FILE, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
else if (process.env.JWT_PUBLIC_KEY) {
|
|
123
|
+
publicKey = process.env.JWT_PUBLIC_KEY;
|
|
124
|
+
}
|
|
125
|
+
const secret = process.env.JWT_SECRET;
|
|
126
|
+
if (!secret && !publicKey) {
|
|
127
|
+
throw new Error('JWT mode requires either JWT_SECRET or JWT_PUBLIC_KEY/JWT_PUBLIC_KEY_FILE');
|
|
128
|
+
}
|
|
129
|
+
return new JwtAuthProvider({
|
|
130
|
+
mode: 'jwt',
|
|
131
|
+
adminRoleName,
|
|
132
|
+
jwt: {
|
|
133
|
+
secret,
|
|
134
|
+
publicKey,
|
|
135
|
+
algorithm: process.env.JWT_ALGORITHM || 'HS256',
|
|
136
|
+
issuer: process.env.JWT_ISSUER,
|
|
137
|
+
audience: process.env.JWT_AUDIENCE,
|
|
138
|
+
userIdClaim: process.env.JWT_USER_ID_CLAIM || 'sub',
|
|
139
|
+
rolesClaim: process.env.JWT_ROLES_CLAIM || 'roles'
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
throw new Error(`Unknown AUTH_MODE: ${mode}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=auth_provider_factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth_provider_factory.js","sourceRoot":"","sources":["../../src/auth/auth_provider_factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { AuthProvider, AuthRequest, AuthMode, AuthProviderConfig, JwtConfig } from './auth_provider.js';
|
|
2
|
+
export { AuthProviderFactory } from './auth_provider_factory.js';
|
|
3
|
+
export { GatewayAuthProvider, JwtAuthProvider, NoAuthProvider } from './providers/index.js';
|
|
4
|
+
export { ApisixAuthParser } from './apisix_parser.js';
|
|
5
|
+
export { UserService } from './user_service.js';
|
|
6
|
+
export { AuthConfig } from './auth_config.js';
|
|
7
|
+
export type { AuthenticatedUser, UserRecord, AuthContext, AuthenticatedRequest } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { AuthProviderFactory } from './auth_provider_factory.js';
|
|
2
|
+
export { GatewayAuthProvider, JwtAuthProvider, NoAuthProvider } from './providers/index.js';
|
|
3
|
+
// Backward-compatible API
|
|
4
|
+
export { ApisixAuthParser } from './apisix_parser.js';
|
|
5
|
+
export { UserService } from './user_service.js';
|
|
6
|
+
export { AuthConfig } from './auth_config.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE3F,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Gateway authentication provider for API Gateway authentication.
|
|
3
|
+
*
|
|
4
|
+
* This provider parses authentication information from HTTP headers set by an API gateway
|
|
5
|
+
* (such as Apache APISIX or KrakenD) after validating JWT tokens with an identity provider.
|
|
6
|
+
*
|
|
7
|
+
* Expected headers:
|
|
8
|
+
* - `x-user-id`: User identifier (UUID from Keycloak)
|
|
9
|
+
* - `x-user-roles`: Comma-separated list of user roles
|
|
10
|
+
*/
|
|
11
|
+
import type { AuthProvider, AuthRequest } from '../auth_provider.js';
|
|
12
|
+
import type { AuthenticatedUser } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Authentication provider for API Gateway authentication.
|
|
15
|
+
*
|
|
16
|
+
* This is the default authentication mode for Digital Twin applications deployed
|
|
17
|
+
* behind an API gateway like Apache APISIX or KrakenD.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const provider = new GatewayAuthProvider('admin')
|
|
22
|
+
*
|
|
23
|
+
* // In a handler
|
|
24
|
+
* const user = provider.parseRequest(req)
|
|
25
|
+
* if (!user) {
|
|
26
|
+
* return { status: 401, content: 'Authentication required' }
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* if (provider.isAdmin(req)) {
|
|
30
|
+
* // Admin-only logic
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class GatewayAuthProvider implements AuthProvider {
|
|
35
|
+
#private;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a new GatewayAuthProvider.
|
|
38
|
+
*
|
|
39
|
+
* @param adminRoleName - Name of the admin role (default: 'admin')
|
|
40
|
+
*/
|
|
41
|
+
constructor(adminRoleName?: string);
|
|
42
|
+
/**
|
|
43
|
+
* Parse the request headers and return the authenticated user.
|
|
44
|
+
*
|
|
45
|
+
* @param req - Request object with headers
|
|
46
|
+
* @returns Authenticated user, or null if x-user-id header is missing
|
|
47
|
+
*/
|
|
48
|
+
parseRequest(req: AuthRequest): AuthenticatedUser | null;
|
|
49
|
+
/**
|
|
50
|
+
* Check if the request has the x-user-id header.
|
|
51
|
+
*
|
|
52
|
+
* @param req - Request object with headers
|
|
53
|
+
* @returns true if x-user-id header is present
|
|
54
|
+
*/
|
|
55
|
+
hasValidAuth(req: AuthRequest): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Check if the user has the admin role.
|
|
58
|
+
*
|
|
59
|
+
* @param req - Request object with headers
|
|
60
|
+
* @returns true if x-user-roles contains the admin role
|
|
61
|
+
*/
|
|
62
|
+
isAdmin(req: AuthRequest): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get the user ID from the x-user-id header.
|
|
65
|
+
*
|
|
66
|
+
* @param req - Request object with headers
|
|
67
|
+
* @returns User ID, or null if header is missing
|
|
68
|
+
*/
|
|
69
|
+
getUserId(req: AuthRequest): string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Get the user roles from the x-user-roles header.
|
|
72
|
+
*
|
|
73
|
+
* @param req - Request object with headers
|
|
74
|
+
* @returns Array of role names, empty array if header is missing
|
|
75
|
+
*/
|
|
76
|
+
getUserRoles(req: AuthRequest): string[];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=gateway_auth_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/gateway_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,mBAAoB,YAAW,YAAY;;IAGpD;;;;OAIG;gBACS,aAAa,SAAU;IAInC;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IASxD;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAKlC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAI1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE;CAkB3C"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Gateway authentication provider for API Gateway authentication.
|
|
3
|
+
*
|
|
4
|
+
* This provider parses authentication information from HTTP headers set by an API gateway
|
|
5
|
+
* (such as Apache APISIX or KrakenD) after validating JWT tokens with an identity provider.
|
|
6
|
+
*
|
|
7
|
+
* Expected headers:
|
|
8
|
+
* - `x-user-id`: User identifier (UUID from Keycloak)
|
|
9
|
+
* - `x-user-roles`: Comma-separated list of user roles
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Authentication provider for API Gateway authentication.
|
|
13
|
+
*
|
|
14
|
+
* This is the default authentication mode for Digital Twin applications deployed
|
|
15
|
+
* behind an API gateway like Apache APISIX or KrakenD.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const provider = new GatewayAuthProvider('admin')
|
|
20
|
+
*
|
|
21
|
+
* // In a handler
|
|
22
|
+
* const user = provider.parseRequest(req)
|
|
23
|
+
* if (!user) {
|
|
24
|
+
* return { status: 401, content: 'Authentication required' }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* if (provider.isAdmin(req)) {
|
|
28
|
+
* // Admin-only logic
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class GatewayAuthProvider {
|
|
33
|
+
#adminRoleName;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new GatewayAuthProvider.
|
|
36
|
+
*
|
|
37
|
+
* @param adminRoleName - Name of the admin role (default: 'admin')
|
|
38
|
+
*/
|
|
39
|
+
constructor(adminRoleName = 'admin') {
|
|
40
|
+
this.#adminRoleName = adminRoleName;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse the request headers and return the authenticated user.
|
|
44
|
+
*
|
|
45
|
+
* @param req - Request object with headers
|
|
46
|
+
* @returns Authenticated user, or null if x-user-id header is missing
|
|
47
|
+
*/
|
|
48
|
+
parseRequest(req) {
|
|
49
|
+
const userId = this.#getHeader(req.headers, 'x-user-id');
|
|
50
|
+
if (!userId)
|
|
51
|
+
return null;
|
|
52
|
+
const roles = this.getUserRoles(req);
|
|
53
|
+
return { id: userId, roles };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if the request has the x-user-id header.
|
|
57
|
+
*
|
|
58
|
+
* @param req - Request object with headers
|
|
59
|
+
* @returns true if x-user-id header is present
|
|
60
|
+
*/
|
|
61
|
+
hasValidAuth(req) {
|
|
62
|
+
return !!this.#getHeader(req.headers, 'x-user-id');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if the user has the admin role.
|
|
66
|
+
*
|
|
67
|
+
* @param req - Request object with headers
|
|
68
|
+
* @returns true if x-user-roles contains the admin role
|
|
69
|
+
*/
|
|
70
|
+
isAdmin(req) {
|
|
71
|
+
const roles = this.getUserRoles(req);
|
|
72
|
+
return roles.includes(this.#adminRoleName);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the user ID from the x-user-id header.
|
|
76
|
+
*
|
|
77
|
+
* @param req - Request object with headers
|
|
78
|
+
* @returns User ID, or null if header is missing
|
|
79
|
+
*/
|
|
80
|
+
getUserId(req) {
|
|
81
|
+
return this.#getHeader(req.headers, 'x-user-id');
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the user roles from the x-user-roles header.
|
|
85
|
+
*
|
|
86
|
+
* @param req - Request object with headers
|
|
87
|
+
* @returns Array of role names, empty array if header is missing
|
|
88
|
+
*/
|
|
89
|
+
getUserRoles(req) {
|
|
90
|
+
const rolesHeader = this.#getHeader(req.headers, 'x-user-roles');
|
|
91
|
+
if (!rolesHeader)
|
|
92
|
+
return [];
|
|
93
|
+
return rolesHeader
|
|
94
|
+
.split(',')
|
|
95
|
+
.map(r => r.trim())
|
|
96
|
+
.filter(Boolean);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get a header value as a string.
|
|
100
|
+
* Handles both string and string[] header values.
|
|
101
|
+
*/
|
|
102
|
+
#getHeader(headers, name) {
|
|
103
|
+
const value = headers[name];
|
|
104
|
+
if (!value)
|
|
105
|
+
return null;
|
|
106
|
+
return Array.isArray(value) ? value[0] : value;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=gateway_auth_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/gateway_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,mBAAmB;IACnB,cAAc,CAAQ;IAE/B;;;;OAIG;IACH,YAAY,aAAa,GAAG,OAAO;QAC/B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;IACvC,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACxD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAEpC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACtD,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAgB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAgB;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpD,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAChE,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAA;QAC3B,OAAO,WAAW;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAsD,EAAE,IAAY;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAClD,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
|