digitaltwin-core 0.14.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +218 -1
- package/dist/auth/apisix_parser.d.ts +56 -56
- package/dist/auth/apisix_parser.d.ts.map +1 -1
- package/dist/auth/apisix_parser.js +72 -86
- package/dist/auth/apisix_parser.js.map +1 -1
- 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 +4 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -1
- 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 +5 -3
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/components/assets_manager.d.ts +1 -1
- package/dist/components/assets_manager.d.ts.map +1 -1
- package/dist/components/assets_manager.js +54 -48
- package/dist/components/assets_manager.js.map +1 -1
- package/dist/components/collector.d.ts.map +1 -1
- package/dist/components/collector.js +30 -18
- package/dist/components/collector.js.map +1 -1
- package/dist/components/custom_table_manager.d.ts.map +1 -1
- package/dist/components/custom_table_manager.js +36 -65
- package/dist/components/custom_table_manager.js.map +1 -1
- package/dist/components/global_assets_handler.d.ts +4 -2
- package/dist/components/global_assets_handler.d.ts.map +1 -1
- package/dist/components/global_assets_handler.js.map +1 -1
- package/dist/components/harvester.d.ts.map +1 -1
- package/dist/components/harvester.js +46 -33
- package/dist/components/harvester.js.map +1 -1
- package/dist/components/interfaces.d.ts +3 -2
- package/dist/components/interfaces.d.ts.map +1 -1
- package/dist/components/map_manager.d.ts.map +1 -1
- package/dist/components/map_manager.js.map +1 -1
- package/dist/components/tileset_manager.d.ts +2 -1
- package/dist/components/tileset_manager.d.ts.map +1 -1
- package/dist/components/tileset_manager.js +20 -15
- package/dist/components/tileset_manager.js.map +1 -1
- package/dist/database/adapters/knex_database_adapter.d.ts +6 -1
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -1
- package/dist/database/adapters/knex_database_adapter.js +118 -36
- package/dist/database/adapters/knex_database_adapter.js.map +1 -1
- package/dist/database/database_adapter.d.ts +13 -1
- package/dist/database/database_adapter.d.ts.map +1 -1
- package/dist/database/database_adapter.js.map +1 -1
- package/dist/engine/component_types.d.ts +95 -0
- package/dist/engine/component_types.d.ts.map +1 -0
- package/dist/engine/component_types.js +93 -0
- package/dist/engine/component_types.js.map +1 -0
- package/dist/engine/digital_twin_engine.d.ts +121 -6
- package/dist/engine/digital_twin_engine.d.ts.map +1 -1
- package/dist/engine/digital_twin_engine.js +402 -74
- package/dist/engine/digital_twin_engine.js.map +1 -1
- package/dist/engine/endpoints.d.ts.map +1 -1
- package/dist/engine/endpoints.js +35 -3
- package/dist/engine/endpoints.js.map +1 -1
- 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 +1 -1
- package/dist/engine/events.d.ts.map +1 -1
- package/dist/engine/events.js.map +1 -1
- 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.map +1 -1
- package/dist/engine/initializer.js +6 -4
- package/dist/engine/initializer.js.map +1 -1
- package/dist/engine/scheduler.d.ts.map +1 -1
- package/dist/engine/scheduler.js +17 -9
- package/dist/engine/scheduler.js.map +1 -1
- package/dist/engine/upload_processor.d.ts.map +1 -1
- package/dist/engine/upload_processor.js +24 -12
- package/dist/engine/upload_processor.js.map +1 -1
- 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 +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/loader/component_loader.d.ts +128 -0
- package/dist/loader/component_loader.d.ts.map +1 -0
- package/dist/loader/component_loader.js +330 -0
- package/dist/loader/component_loader.js.map +1 -0
- package/dist/loader/index.d.ts +19 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +19 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/storage/adapters/local_storage_service.d.ts +6 -0
- package/dist/storage/adapters/local_storage_service.d.ts.map +1 -1
- package/dist/storage/adapters/local_storage_service.js +26 -4
- package/dist/storage/adapters/local_storage_service.js.map +1 -1
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -1
- package/dist/storage/adapters/ovh_storage_service.js +5 -6
- package/dist/storage/adapters/ovh_storage_service.js.map +1 -1
- package/dist/storage/storage_factory.d.ts.map +1 -1
- package/dist/storage/storage_factory.js +4 -1
- package/dist/storage/storage_factory.js.map +1 -1
- package/dist/storage/storage_service.d.ts.map +1 -1
- package/dist/storage/storage_service.js +6 -2
- package/dist/storage/storage_service.js.map +1 -1
- package/dist/types/http.d.ts +156 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +8 -0
- package/dist/types/http.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 +20 -0
- package/dist/utils/http_responses.d.ts.map +1 -1
- package/dist/utils/http_responses.js +28 -2
- package/dist/utils/http_responses.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -8
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +8 -8
- package/dist/utils/logger.js.map +1 -1
- 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/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 +14 -8
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"
|
|
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,EAAoB,MAAM,oBAAoB,CAAA;AACvE,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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JWT authentication provider for direct token validation.
|
|
3
|
+
*
|
|
4
|
+
* This provider validates JWT tokens from the Authorization header without
|
|
5
|
+
* requiring an API gateway. Useful for standalone deployments or when you
|
|
6
|
+
* want to handle authentication directly in the application.
|
|
7
|
+
*
|
|
8
|
+
* Supports:
|
|
9
|
+
* - HMAC algorithms (HS256, HS384, HS512) with a secret key
|
|
10
|
+
* - RSA algorithms (RS256, RS384, RS512) with a public key
|
|
11
|
+
* - EC algorithms (ES256, ES384, ES512) with a public key
|
|
12
|
+
* - Keycloak token format (realm_access.roles)
|
|
13
|
+
* - Custom claim paths for user ID and roles
|
|
14
|
+
*/
|
|
15
|
+
import type { AuthProvider, AuthRequest, AuthProviderConfig } from '../auth_provider.js';
|
|
16
|
+
import type { AuthenticatedUser } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Authentication provider for JWT token validation.
|
|
19
|
+
*
|
|
20
|
+
* This provider validates JWT tokens directly in the application, without
|
|
21
|
+
* requiring an API gateway. It extracts user information from token claims.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // With HMAC secret
|
|
26
|
+
* const provider = new JwtAuthProvider({
|
|
27
|
+
* mode: 'jwt',
|
|
28
|
+
* jwt: {
|
|
29
|
+
* secret: 'your-256-bit-secret',
|
|
30
|
+
* algorithm: 'HS256'
|
|
31
|
+
* }
|
|
32
|
+
* })
|
|
33
|
+
*
|
|
34
|
+
* // With RSA public key (Keycloak)
|
|
35
|
+
* const provider = new JwtAuthProvider({
|
|
36
|
+
* mode: 'jwt',
|
|
37
|
+
* jwt: {
|
|
38
|
+
* publicKey: fs.readFileSync('public.pem', 'utf-8'),
|
|
39
|
+
* algorithm: 'RS256',
|
|
40
|
+
* issuer: 'https://keycloak.example.com/realms/myrealm',
|
|
41
|
+
* rolesClaim: 'realm_access.roles'
|
|
42
|
+
* }
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class JwtAuthProvider implements AuthProvider {
|
|
47
|
+
#private;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a new JwtAuthProvider.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Authentication configuration with JWT settings
|
|
52
|
+
* @throws Error if JWT configuration is missing or incomplete
|
|
53
|
+
*/
|
|
54
|
+
constructor(config: AuthProviderConfig);
|
|
55
|
+
/**
|
|
56
|
+
* Parse the request and validate the JWT token.
|
|
57
|
+
*
|
|
58
|
+
* @param req - Request object with headers
|
|
59
|
+
* @returns Authenticated user, or null if token is missing/invalid
|
|
60
|
+
*/
|
|
61
|
+
parseRequest(req: AuthRequest): AuthenticatedUser | null;
|
|
62
|
+
/**
|
|
63
|
+
* Check if the request has a valid Authorization header with Bearer token.
|
|
64
|
+
*
|
|
65
|
+
* @param req - Request object with headers
|
|
66
|
+
* @returns true if Authorization header is present with Bearer scheme
|
|
67
|
+
*/
|
|
68
|
+
hasValidAuth(req: AuthRequest): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Check if the authenticated user has admin privileges.
|
|
71
|
+
*
|
|
72
|
+
* @param req - Request object with headers
|
|
73
|
+
* @returns true if the user has the admin role
|
|
74
|
+
*/
|
|
75
|
+
isAdmin(req: AuthRequest): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Get the user ID from the JWT token.
|
|
78
|
+
*
|
|
79
|
+
* @param req - Request object with headers
|
|
80
|
+
* @returns User ID, or null if not authenticated
|
|
81
|
+
*/
|
|
82
|
+
getUserId(req: AuthRequest): string | null;
|
|
83
|
+
/**
|
|
84
|
+
* Get the user roles from the JWT token.
|
|
85
|
+
*
|
|
86
|
+
* @param req - Request object with headers
|
|
87
|
+
* @returns Array of role names, empty array if not authenticated
|
|
88
|
+
*/
|
|
89
|
+
getUserRoles(req: AuthRequest): string[];
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=jwt_auth_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/jwt_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,eAAgB,YAAW,YAAY;;IAShD;;;;;OAKG;gBACS,MAAM,EAAE,kBAAkB;IAwBtC;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAuBxD;;;;;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;IAK1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE;CAkE3C"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JWT authentication provider for direct token validation.
|
|
3
|
+
*
|
|
4
|
+
* This provider validates JWT tokens from the Authorization header without
|
|
5
|
+
* requiring an API gateway. Useful for standalone deployments or when you
|
|
6
|
+
* want to handle authentication directly in the application.
|
|
7
|
+
*
|
|
8
|
+
* Supports:
|
|
9
|
+
* - HMAC algorithms (HS256, HS384, HS512) with a secret key
|
|
10
|
+
* - RSA algorithms (RS256, RS384, RS512) with a public key
|
|
11
|
+
* - EC algorithms (ES256, ES384, ES512) with a public key
|
|
12
|
+
* - Keycloak token format (realm_access.roles)
|
|
13
|
+
* - Custom claim paths for user ID and roles
|
|
14
|
+
*/
|
|
15
|
+
import jwt from 'jsonwebtoken';
|
|
16
|
+
/**
|
|
17
|
+
* Authentication provider for JWT token validation.
|
|
18
|
+
*
|
|
19
|
+
* This provider validates JWT tokens directly in the application, without
|
|
20
|
+
* requiring an API gateway. It extracts user information from token claims.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // With HMAC secret
|
|
25
|
+
* const provider = new JwtAuthProvider({
|
|
26
|
+
* mode: 'jwt',
|
|
27
|
+
* jwt: {
|
|
28
|
+
* secret: 'your-256-bit-secret',
|
|
29
|
+
* algorithm: 'HS256'
|
|
30
|
+
* }
|
|
31
|
+
* })
|
|
32
|
+
*
|
|
33
|
+
* // With RSA public key (Keycloak)
|
|
34
|
+
* const provider = new JwtAuthProvider({
|
|
35
|
+
* mode: 'jwt',
|
|
36
|
+
* jwt: {
|
|
37
|
+
* publicKey: fs.readFileSync('public.pem', 'utf-8'),
|
|
38
|
+
* algorithm: 'RS256',
|
|
39
|
+
* issuer: 'https://keycloak.example.com/realms/myrealm',
|
|
40
|
+
* rolesClaim: 'realm_access.roles'
|
|
41
|
+
* }
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class JwtAuthProvider {
|
|
46
|
+
#secret;
|
|
47
|
+
#algorithm;
|
|
48
|
+
#issuer;
|
|
49
|
+
#audience;
|
|
50
|
+
#userIdClaim;
|
|
51
|
+
#rolesClaim;
|
|
52
|
+
#adminRoleName;
|
|
53
|
+
/**
|
|
54
|
+
* Creates a new JwtAuthProvider.
|
|
55
|
+
*
|
|
56
|
+
* @param config - Authentication configuration with JWT settings
|
|
57
|
+
* @throws Error if JWT configuration is missing or incomplete
|
|
58
|
+
*/
|
|
59
|
+
constructor(config) {
|
|
60
|
+
if (!config.jwt) {
|
|
61
|
+
throw new Error('JWT configuration required for JWT auth mode');
|
|
62
|
+
}
|
|
63
|
+
const { jwt: jwtConfig } = config;
|
|
64
|
+
// Secret or public key
|
|
65
|
+
if (jwtConfig.publicKey) {
|
|
66
|
+
this.#secret = jwtConfig.publicKey;
|
|
67
|
+
}
|
|
68
|
+
else if (jwtConfig.secret) {
|
|
69
|
+
this.#secret = jwtConfig.secret;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw new Error('JWT secret or publicKey required');
|
|
73
|
+
}
|
|
74
|
+
this.#algorithm = jwtConfig.algorithm || 'HS256';
|
|
75
|
+
this.#issuer = jwtConfig.issuer;
|
|
76
|
+
this.#audience = jwtConfig.audience;
|
|
77
|
+
this.#userIdClaim = jwtConfig.userIdClaim || 'sub';
|
|
78
|
+
this.#rolesClaim = jwtConfig.rolesClaim || 'roles';
|
|
79
|
+
this.#adminRoleName = config.adminRoleName || 'admin';
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse the request and validate the JWT token.
|
|
83
|
+
*
|
|
84
|
+
* @param req - Request object with headers
|
|
85
|
+
* @returns Authenticated user, or null if token is missing/invalid
|
|
86
|
+
*/
|
|
87
|
+
parseRequest(req) {
|
|
88
|
+
const token = this.#extractToken(req);
|
|
89
|
+
if (!token)
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
const decoded = jwt.verify(token, this.#secret, {
|
|
93
|
+
algorithms: [this.#algorithm],
|
|
94
|
+
issuer: this.#issuer,
|
|
95
|
+
audience: this.#audience
|
|
96
|
+
});
|
|
97
|
+
const userId = this.#extractClaim(decoded, this.#userIdClaim);
|
|
98
|
+
if (!userId || typeof userId !== 'string')
|
|
99
|
+
return null;
|
|
100
|
+
const roles = this.#extractRoles(decoded);
|
|
101
|
+
return { id: userId, roles };
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Token invalid or expired
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if the request has a valid Authorization header with Bearer token.
|
|
110
|
+
*
|
|
111
|
+
* @param req - Request object with headers
|
|
112
|
+
* @returns true if Authorization header is present with Bearer scheme
|
|
113
|
+
*/
|
|
114
|
+
hasValidAuth(req) {
|
|
115
|
+
return !!this.#extractToken(req);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if the authenticated user has admin privileges.
|
|
119
|
+
*
|
|
120
|
+
* @param req - Request object with headers
|
|
121
|
+
* @returns true if the user has the admin role
|
|
122
|
+
*/
|
|
123
|
+
isAdmin(req) {
|
|
124
|
+
const user = this.parseRequest(req);
|
|
125
|
+
return user?.roles.includes(this.#adminRoleName) ?? false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the user ID from the JWT token.
|
|
129
|
+
*
|
|
130
|
+
* @param req - Request object with headers
|
|
131
|
+
* @returns User ID, or null if not authenticated
|
|
132
|
+
*/
|
|
133
|
+
getUserId(req) {
|
|
134
|
+
const user = this.parseRequest(req);
|
|
135
|
+
return user?.id ?? null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the user roles from the JWT token.
|
|
139
|
+
*
|
|
140
|
+
* @param req - Request object with headers
|
|
141
|
+
* @returns Array of role names, empty array if not authenticated
|
|
142
|
+
*/
|
|
143
|
+
getUserRoles(req) {
|
|
144
|
+
const user = this.parseRequest(req);
|
|
145
|
+
return user?.roles ?? [];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract the Bearer token from the Authorization header.
|
|
149
|
+
*/
|
|
150
|
+
#extractToken(req) {
|
|
151
|
+
const authHeader = this.#getHeader(req.headers, 'authorization');
|
|
152
|
+
if (!authHeader)
|
|
153
|
+
return null;
|
|
154
|
+
// Format: "Bearer <token>"
|
|
155
|
+
const parts = authHeader.split(' ');
|
|
156
|
+
if (parts.length !== 2 || parts[0].toLowerCase() !== 'bearer') {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return parts[1];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Extract a claim value from the token payload.
|
|
163
|
+
* Supports nested paths like "realm_access.roles".
|
|
164
|
+
*/
|
|
165
|
+
#extractClaim(payload, path) {
|
|
166
|
+
const parts = path.split('.');
|
|
167
|
+
let current = payload;
|
|
168
|
+
for (const part of parts) {
|
|
169
|
+
if (current === null || current === undefined)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (typeof current !== 'object')
|
|
172
|
+
return undefined;
|
|
173
|
+
current = current[part];
|
|
174
|
+
}
|
|
175
|
+
return current;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Extract roles from the token payload.
|
|
179
|
+
* Supports standard array format and Keycloak's realm_access.roles.
|
|
180
|
+
*/
|
|
181
|
+
#extractRoles(payload) {
|
|
182
|
+
// Try configured roles claim first
|
|
183
|
+
const roles = this.#extractClaim(payload, this.#rolesClaim);
|
|
184
|
+
if (Array.isArray(roles)) {
|
|
185
|
+
return roles.filter((r) => typeof r === 'string');
|
|
186
|
+
}
|
|
187
|
+
// Fallback to Keycloak format
|
|
188
|
+
const realmAccess = payload.realm_access;
|
|
189
|
+
if (realmAccess?.roles && Array.isArray(realmAccess.roles)) {
|
|
190
|
+
return realmAccess.roles;
|
|
191
|
+
}
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get a header value as a string.
|
|
196
|
+
*/
|
|
197
|
+
#getHeader(headers, name) {
|
|
198
|
+
const value = headers[name];
|
|
199
|
+
if (!value)
|
|
200
|
+
return null;
|
|
201
|
+
return Array.isArray(value) ? value[0] : value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=jwt_auth_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/jwt_auth_provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview No-authentication provider for development and testing.
|
|
3
|
+
*
|
|
4
|
+
* This provider bypasses all authentication checks and returns a configurable
|
|
5
|
+
* anonymous user for all requests. Use only in development or testing environments.
|
|
6
|
+
*
|
|
7
|
+
* WARNING: Never use this provider in production!
|
|
8
|
+
*/
|
|
9
|
+
import type { AuthProvider, AuthRequest } from '../auth_provider.js';
|
|
10
|
+
import type { AuthenticatedUser } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Authentication provider that bypasses authentication.
|
|
13
|
+
*
|
|
14
|
+
* All requests are treated as authenticated with a configurable anonymous user.
|
|
15
|
+
* This provider is useful for development and testing when you don't want to
|
|
16
|
+
* set up authentication infrastructure.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Development setup
|
|
21
|
+
* const provider = new NoAuthProvider('dev-user-123')
|
|
22
|
+
*
|
|
23
|
+
* // All requests return the same user
|
|
24
|
+
* const user = provider.parseRequest(req) // { id: 'dev-user-123', roles: ['user'] }
|
|
25
|
+
* provider.hasValidAuth(req) // always true
|
|
26
|
+
* provider.isAdmin(req) // always false
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class NoAuthProvider implements AuthProvider {
|
|
30
|
+
#private;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new NoAuthProvider.
|
|
33
|
+
*
|
|
34
|
+
* @param anonymousUserId - User ID for the anonymous user (default: 'anonymous')
|
|
35
|
+
* @param anonymousRoles - Roles for the anonymous user (default: ['anonymous'])
|
|
36
|
+
*/
|
|
37
|
+
constructor(anonymousUserId?: string, anonymousRoles?: string[]);
|
|
38
|
+
/**
|
|
39
|
+
* Returns the anonymous user for all requests.
|
|
40
|
+
*
|
|
41
|
+
* @returns Anonymous user with configured ID and roles
|
|
42
|
+
*/
|
|
43
|
+
parseRequest(_req: AuthRequest): AuthenticatedUser | null;
|
|
44
|
+
/**
|
|
45
|
+
* Always returns true (all requests are "authenticated").
|
|
46
|
+
*/
|
|
47
|
+
hasValidAuth(_req: AuthRequest): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Always returns false (anonymous user is never admin).
|
|
50
|
+
*/
|
|
51
|
+
isAdmin(_req: AuthRequest): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the anonymous user ID.
|
|
54
|
+
*/
|
|
55
|
+
getUserId(_req: AuthRequest): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Returns the anonymous user roles.
|
|
58
|
+
*/
|
|
59
|
+
getUserRoles(_req: AuthRequest): string[];
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=no_auth_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/no_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAe,YAAW,YAAY;;IAI/C;;;;;OAKG;gBACS,eAAe,SAAc,EAAE,cAAc,GAAE,MAAM,EAAkB;IAKnF;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAOzD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAIxC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAInC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE;CAG5C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview No-authentication provider for development and testing.
|
|
3
|
+
*
|
|
4
|
+
* This provider bypasses all authentication checks and returns a configurable
|
|
5
|
+
* anonymous user for all requests. Use only in development or testing environments.
|
|
6
|
+
*
|
|
7
|
+
* WARNING: Never use this provider in production!
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Authentication provider that bypasses authentication.
|
|
11
|
+
*
|
|
12
|
+
* All requests are treated as authenticated with a configurable anonymous user.
|
|
13
|
+
* This provider is useful for development and testing when you don't want to
|
|
14
|
+
* set up authentication infrastructure.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Development setup
|
|
19
|
+
* const provider = new NoAuthProvider('dev-user-123')
|
|
20
|
+
*
|
|
21
|
+
* // All requests return the same user
|
|
22
|
+
* const user = provider.parseRequest(req) // { id: 'dev-user-123', roles: ['user'] }
|
|
23
|
+
* provider.hasValidAuth(req) // always true
|
|
24
|
+
* provider.isAdmin(req) // always false
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class NoAuthProvider {
|
|
28
|
+
#anonymousUserId;
|
|
29
|
+
#anonymousRoles;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new NoAuthProvider.
|
|
32
|
+
*
|
|
33
|
+
* @param anonymousUserId - User ID for the anonymous user (default: 'anonymous')
|
|
34
|
+
* @param anonymousRoles - Roles for the anonymous user (default: ['anonymous'])
|
|
35
|
+
*/
|
|
36
|
+
constructor(anonymousUserId = 'anonymous', anonymousRoles = ['anonymous']) {
|
|
37
|
+
this.#anonymousUserId = anonymousUserId;
|
|
38
|
+
this.#anonymousRoles = anonymousRoles;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the anonymous user for all requests.
|
|
42
|
+
*
|
|
43
|
+
* @returns Anonymous user with configured ID and roles
|
|
44
|
+
*/
|
|
45
|
+
parseRequest(_req) {
|
|
46
|
+
return {
|
|
47
|
+
id: this.#anonymousUserId,
|
|
48
|
+
roles: this.#anonymousRoles
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Always returns true (all requests are "authenticated").
|
|
53
|
+
*/
|
|
54
|
+
hasValidAuth(_req) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Always returns false (anonymous user is never admin).
|
|
59
|
+
*/
|
|
60
|
+
isAdmin(_req) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the anonymous user ID.
|
|
65
|
+
*/
|
|
66
|
+
getUserId(_req) {
|
|
67
|
+
return this.#anonymousUserId;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns the anonymous user roles.
|
|
71
|
+
*/
|
|
72
|
+
getUserRoles(_req) {
|
|
73
|
+
return this.#anonymousRoles;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=no_auth_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/no_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IACd,gBAAgB,CAAQ;IACxB,eAAe,CAAU;IAElC;;;;;OAKG;IACH,YAAY,eAAe,GAAG,WAAW,EAAE,iBAA2B,CAAC,WAAW,CAAC;QAC/E,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;QACvC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAA;IACzC,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,gBAAgB;YACzB,KAAK,EAAE,IAAI,CAAC,eAAe;SAC9B,CAAA;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAiB;QACrB,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAiB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAA;IAC/B,CAAC;CACJ"}
|