@mondart/nestjs-common-module-iam 3.2.13 → 3.2.15
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 +40 -7
- package/dist/constants/iam-decorator-key.const.d.ts +0 -1
- package/dist/constants/iam-decorator-key.const.d.ts.map +1 -1
- package/dist/constants/iam-decorator-key.const.js +1 -2
- package/dist/constants/iam-decorator-key.const.js.map +1 -1
- package/dist/guards/iam-context.guard.d.ts +3 -1
- package/dist/guards/iam-context.guard.d.ts.map +1 -1
- package/dist/guards/iam-context.guard.js +18 -5
- package/dist/guards/iam-context.guard.js.map +1 -1
- package/dist/iam-context.module.d.ts +3 -1
- package/dist/iam-context.module.d.ts.map +1 -1
- package/dist/iam-context.module.js +38 -31
- package/dist/iam-context.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/iam-context-options.interface.d.ts +11 -0
- package/dist/interfaces/iam-context-options.interface.d.ts.map +1 -1
- package/dist/interfaces/iam-context-options.interface.js.map +1 -1
- package/dist/services/iam-permission.service.d.ts +1 -3
- package/dist/services/iam-permission.service.d.ts.map +1 -1
- package/dist/services/iam-permission.service.js +10 -35
- package/dist/services/iam-permission.service.js.map +1 -1
- package/dist/services/iam-token-verifier.service.d.ts +15 -0
- package/dist/services/iam-token-verifier.service.d.ts.map +1 -0
- package/dist/services/iam-token-verifier.service.js +101 -0
- package/dist/services/iam-token-verifier.service.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -72,9 +72,10 @@ findAll() { ... }
|
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
An agent needs every listed key in its `permissions` claim (client roles of
|
|
75
|
-
the back-office `permissions` client,
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
the back-office `permissions` client, bundled into IAM roles that groups
|
|
76
|
+
grant), or its service's wildcard: `order:*` covers every `order:` key. An
|
|
77
|
+
agent in a group whose path ends with `/super-admin` passes every check.
|
|
78
|
+
Users and guests are rejected on these routes.
|
|
78
79
|
|
|
79
80
|
```ts
|
|
80
81
|
IamContextModule.forRoot({
|
|
@@ -84,10 +85,42 @@ IamContextModule.forRoot({
|
|
|
84
85
|
|
|
85
86
|
- `service`: key prefix of this service. On boot every declared key is sent to
|
|
86
87
|
IAM as `iam.permission.sync`, so IAM can create the roles.
|
|
87
|
-
- `kafkaClient`: injection token of
|
|
88
|
-
|
|
89
|
-
(
|
|
90
|
-
|
|
88
|
+
- `kafkaClient`: injection token of the `ClientKafka` that sends the sync event.
|
|
89
|
+
- `extraKeys`: keys checked in code with `IamPermissionService.hasPermissions`
|
|
90
|
+
(e.g. on a route users share) instead of `@RequirePermission()`. They are
|
|
91
|
+
synced with the decorated ones, so IAM doesn't mark them deprecated.
|
|
92
|
+
|
|
93
|
+
## Verifying tokens in the service
|
|
94
|
+
|
|
95
|
+
The gateway introspects the token and forwards its claims as the
|
|
96
|
+
`injectedpayload` header. Anyone who can reach the service directly can forge
|
|
97
|
+
that header, so each service can verify the Bearer token itself:
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
IamContextModule.forRootAsync({
|
|
101
|
+
inject: [ConfigService],
|
|
102
|
+
useFactory: (config: ConfigService) => ({
|
|
103
|
+
tokenVerification: {
|
|
104
|
+
issuers: config.get<string[]>('keycloak.issuers'), // https://auth.example.com/realms/back-office, ...
|
|
105
|
+
jwksBaseUrl: config.get('keycloak.internalUrl'), // optional, e.g. http://keycloak:8080
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
With `tokenVerification` set, the guard runs on every HTTP request, before
|
|
112
|
+
the controller filter:
|
|
113
|
+
|
|
114
|
+
- The access token's RS256 signature is checked against the realm's JWKS
|
|
115
|
+
(cached, refetched on key rotation), along with expiry and an allowed issuer.
|
|
116
|
+
- `injectedpayload` is replaced with the verified claims, so `@IamContext()`,
|
|
117
|
+
`@GetAgent()` and `@GetUser()` only ever see verified data. A forwarded
|
|
118
|
+
payload whose `sub` differs from the token is logged.
|
|
119
|
+
- A missing token removes `injectedpayload`: the caller is anonymous.
|
|
120
|
+
- An invalid token, a foreign issuer, or anything other than an access token
|
|
121
|
+
(`typ: Bearer`) gets 401. That includes offline tokens; exchange them for an
|
|
122
|
+
access token first. `@PublicIam()` routes treat such callers as anonymous
|
|
123
|
+
instead.
|
|
91
124
|
|
|
92
125
|
## Entity access rules
|
|
93
126
|
|
|
@@ -2,7 +2,6 @@ export declare const IAM_PUBLIC_ROUTE = "iam_public_route";
|
|
|
2
2
|
export declare const IAM_ROUTE_USER_TYPE = "iam_route_user_type";
|
|
3
3
|
export declare const IAM_ROUTE_PERMISSIONS = "iam_route_permissions";
|
|
4
4
|
export declare const IAM_PERMISSION_SYNC_TOPIC = "iam.permission.sync";
|
|
5
|
-
export declare const IAM_AGENT_PERMISSIONS_FIND_TOPIC = "iam.agent.permissions.find";
|
|
6
5
|
export declare const IAM_SUPER_ADMIN_GROUP_SUFFIX = "/super-admin";
|
|
7
6
|
export declare const IAM_ENTITY_ACCESS_KEY = "iam_entity_access";
|
|
8
7
|
export declare const IAM_ENTITY_SCOPE_KEY = "iam_entity_scope";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-decorator-key.const.d.ts","sourceRoot":"","sources":["../../src/constants/iam-decorator-key.const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAG7D,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"iam-decorator-key.const.d.ts","sourceRoot":"","sources":["../../src/constants/iam-decorator-key.const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAG7D,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAG/D,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAE3D,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AACzD,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAC3D,eAAO,MAAM,oCAAoC,+BACnB,CAAC;AAE/B,eAAO,MAAM,yBAAyB,aAAa,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IAM_QUERY_SCOPE_WHERE_KEY = exports.IAM_REQUEST_ENTITY_SCOPE_OPTIONS_KEY = exports.IAM_REQUEST_USER_TYPE_KEY = exports.IAM_ENTITY_SCOPE_KEY = exports.IAM_ENTITY_ACCESS_KEY = exports.IAM_SUPER_ADMIN_GROUP_SUFFIX = exports.
|
|
3
|
+
exports.IAM_QUERY_SCOPE_WHERE_KEY = exports.IAM_REQUEST_ENTITY_SCOPE_OPTIONS_KEY = exports.IAM_REQUEST_USER_TYPE_KEY = exports.IAM_ENTITY_SCOPE_KEY = exports.IAM_ENTITY_ACCESS_KEY = exports.IAM_SUPER_ADMIN_GROUP_SUFFIX = exports.IAM_PERMISSION_SYNC_TOPIC = exports.IAM_ROUTE_PERMISSIONS = exports.IAM_ROUTE_USER_TYPE = exports.IAM_PUBLIC_ROUTE = void 0;
|
|
4
4
|
exports.IAM_PUBLIC_ROUTE = 'iam_public_route';
|
|
5
5
|
exports.IAM_ROUTE_USER_TYPE = 'iam_route_user_type';
|
|
6
6
|
exports.IAM_ROUTE_PERMISSIONS = 'iam_route_permissions';
|
|
7
7
|
exports.IAM_PERMISSION_SYNC_TOPIC = 'iam.permission.sync';
|
|
8
|
-
exports.IAM_AGENT_PERMISSIONS_FIND_TOPIC = 'iam.agent.permissions.find';
|
|
9
8
|
exports.IAM_SUPER_ADMIN_GROUP_SUFFIX = '/super-admin';
|
|
10
9
|
exports.IAM_ENTITY_ACCESS_KEY = 'iam_entity_access';
|
|
11
10
|
exports.IAM_ENTITY_SCOPE_KEY = 'iam_entity_scope';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-decorator-key.const.js","sourceRoot":"","sources":["../../src/constants/iam-decorator-key.const.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAC5C,QAAA,qBAAqB,GAAG,uBAAuB,CAAC;AAGhD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"iam-decorator-key.const.js","sourceRoot":"","sources":["../../src/constants/iam-decorator-key.const.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAC5C,QAAA,qBAAqB,GAAG,uBAAuB,CAAC;AAGhD,QAAA,yBAAyB,GAAG,qBAAqB,CAAC;AAGlD,QAAA,4BAA4B,GAAG,cAAc,CAAC;AAE9C,QAAA,qBAAqB,GAAG,mBAAmB,CAAC;AAC5C,QAAA,oBAAoB,GAAG,kBAAkB,CAAC;AAE1C,QAAA,yBAAyB,GAAG,iBAAiB,CAAC;AAC9C,QAAA,oCAAoC,GAC/C,4BAA4B,CAAC;AAElB,QAAA,yBAAyB,GAAG,UAAU,CAAC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import { Reflector } from '@nestjs/core';
|
|
3
3
|
import { IamPermissionService } from '../services/iam-permission.service';
|
|
4
|
+
import { IamTokenVerifierService } from '../services/iam-token-verifier.service';
|
|
4
5
|
import { IamEntityAccessService } from '../services/iam-entity-access.service';
|
|
5
6
|
import { IamContextModuleOptions } from '../interfaces/iam-context-options.interface';
|
|
6
7
|
export declare class IamContextGuard implements CanActivate {
|
|
7
8
|
private readonly reflector;
|
|
8
9
|
private readonly iamEntityAccessService;
|
|
9
10
|
private readonly iamPermissionService;
|
|
11
|
+
private readonly iamTokenVerifierService;
|
|
10
12
|
private readonly moduleOptions;
|
|
11
|
-
constructor(reflector: Reflector, iamEntityAccessService: IamEntityAccessService, iamPermissionService: IamPermissionService, moduleOptions: IamContextModuleOptions);
|
|
13
|
+
constructor(reflector: Reflector, iamEntityAccessService: IamEntityAccessService, iamPermissionService: IamPermissionService, iamTokenVerifierService: IamTokenVerifierService, moduleOptions: IamContextModuleOptions);
|
|
12
14
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
13
15
|
private shouldIgnoreController;
|
|
14
16
|
private matchController;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context.guard.d.ts","sourceRoot":"","sources":["../../src/guards/iam-context.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAYzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"iam-context.guard.d.ts","sourceRoot":"","sources":["../../src/guards/iam-context.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAYzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAEL,uBAAuB,EAGxB,MAAM,6CAA6C,CAAC;AAerD,qBACa,eAAgB,YAAW,WAAW;IAE/C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAGxC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBANb,SAAS,EAAE,SAAS,EACpB,sBAAsB,EAAE,sBAAsB,EAC9C,oBAAoB,EAAE,oBAAoB,EAC1C,uBAAuB,EAAE,uBAAuB,EAGhD,aAAa,EAAE,uBAAuB;IAYnD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqH9D,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;CAkBpB"}
|
|
@@ -18,23 +18,35 @@ const core_1 = require("@nestjs/core");
|
|
|
18
18
|
const iam_context_decorator_1 = require("../decorators/iam-context.decorator");
|
|
19
19
|
const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
|
|
20
20
|
const iam_permission_service_1 = require("../services/iam-permission.service");
|
|
21
|
+
const iam_token_verifier_service_1 = require("../services/iam-token-verifier.service");
|
|
21
22
|
const iam_user_type_enum_1 = require("../enums/iam-user-type.enum");
|
|
22
23
|
const iam_entity_access_service_1 = require("../services/iam-entity-access.service");
|
|
23
24
|
const iam_context_options_interface_1 = require("../interfaces/iam-context-options.interface");
|
|
24
25
|
let IamContextGuard = class IamContextGuard {
|
|
25
|
-
constructor(reflector, iamEntityAccessService, iamPermissionService, moduleOptions) {
|
|
26
|
+
constructor(reflector, iamEntityAccessService, iamPermissionService, iamTokenVerifierService, moduleOptions) {
|
|
26
27
|
this.reflector = reflector;
|
|
27
28
|
this.iamEntityAccessService = iamEntityAccessService;
|
|
28
29
|
this.iamPermissionService = iamPermissionService;
|
|
30
|
+
this.iamTokenVerifierService = iamTokenVerifierService;
|
|
29
31
|
this.moduleOptions = moduleOptions;
|
|
30
32
|
}
|
|
31
33
|
async canActivate(context) {
|
|
32
34
|
const request = context.switchToHttp().getRequest();
|
|
35
|
+
const isPublicRoute = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_PUBLIC_ROUTE, [context.getHandler(), context.getClass()]);
|
|
36
|
+
if (context.getType() === 'http' && this.iamTokenVerifierService.enabled) {
|
|
37
|
+
try {
|
|
38
|
+
await this.iamTokenVerifierService.verifyRequest(request);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (!isPublicRoute)
|
|
42
|
+
throw error;
|
|
43
|
+
delete request.headers?.['injectedpayload'];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
33
46
|
const controller = context.getClass();
|
|
34
47
|
if (this.shouldIgnoreController(controller)) {
|
|
35
48
|
return true;
|
|
36
49
|
}
|
|
37
|
-
const isPublicRoute = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_PUBLIC_ROUTE, [context.getHandler(), context.getClass()]);
|
|
38
50
|
if (isPublicRoute) {
|
|
39
51
|
return true;
|
|
40
52
|
}
|
|
@@ -56,7 +68,7 @@ let IamContextGuard = class IamContextGuard {
|
|
|
56
68
|
const requiredPermissions = this.reflector.getAllAndMerge(iam_decorator_key_const_1.IAM_ROUTE_PERMISSIONS, [context.getHandler(), context.getClass()]);
|
|
57
69
|
if (requiredPermissions.length &&
|
|
58
70
|
(currentUserType !== iam_user_type_enum_1.IamUserTypeEnum.AGENT ||
|
|
59
|
-
!
|
|
71
|
+
!this.iamPermissionService.hasPermissions(iamContext.agent, requiredPermissions.map(({ key }) => key)))) {
|
|
60
72
|
throw new common_1.ForbiddenException('Missing permission');
|
|
61
73
|
}
|
|
62
74
|
const rawScopeOptions = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_ENTITY_SCOPE_KEY, [context.getHandler(), context.getClass()]);
|
|
@@ -133,9 +145,10 @@ let IamContextGuard = class IamContextGuard {
|
|
|
133
145
|
exports.IamContextGuard = IamContextGuard;
|
|
134
146
|
exports.IamContextGuard = IamContextGuard = __decorate([
|
|
135
147
|
(0, common_1.Injectable)(),
|
|
136
|
-
__param(
|
|
148
|
+
__param(4, (0, common_1.Inject)(iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS)),
|
|
137
149
|
__metadata("design:paramtypes", [core_1.Reflector,
|
|
138
150
|
iam_entity_access_service_1.IamEntityAccessService,
|
|
139
|
-
iam_permission_service_1.IamPermissionService,
|
|
151
|
+
iam_permission_service_1.IamPermissionService,
|
|
152
|
+
iam_token_verifier_service_1.IamTokenVerifierService, Object])
|
|
140
153
|
], IamContextGuard);
|
|
141
154
|
//# sourceMappingURL=iam-context.guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context.guard.js","sourceRoot":"","sources":["../../src/guards/iam-context.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,uCAAyC;AACzC,+EAAoE;AACpE,kFAQ8C;AAE9C,+EAA0E;AAC1E,oEAA8D;AAC9D,qFAA+E;AAC/E,+FAKqD;AAgB9C,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YACmB,SAAoB,EACpB,sBAA8C,EAC9C,oBAA0C,
|
|
1
|
+
{"version":3,"file":"iam-context.guard.js","sourceRoot":"","sources":["../../src/guards/iam-context.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
|
-
import { IamContextModuleOptions } from './interfaces/iam-context-options.interface';
|
|
2
|
+
import { IamContextModuleAsyncOptions, IamContextModuleOptions } from './interfaces/iam-context-options.interface';
|
|
3
3
|
export declare class IamContextModule {
|
|
4
4
|
static forRoot(options?: IamContextModuleOptions): DynamicModule;
|
|
5
|
+
static forRootAsync(options: IamContextModuleAsyncOptions): DynamicModule;
|
|
6
|
+
private static create;
|
|
5
7
|
}
|
|
6
8
|
//# sourceMappingURL=iam-context.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context.module.d.ts","sourceRoot":"","sources":["../src/iam-context.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"iam-context.module.d.ts","sourceRoot":"","sources":["../src/iam-context.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,MAAM,gBAAgB,CAAC;AASzE,OAAO,EAGL,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,4CAA4C,CAAC;AA8BpD,qBAEa,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,uBAA4B,GAAG,aAAa;IAQpE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,4BAA4B,GAAG,aAAa;IASzE,OAAO,CAAC,MAAM,CAAC,MAAM;CAetB"}
|
|
@@ -13,46 +13,53 @@ const core_1 = require("@nestjs/core");
|
|
|
13
13
|
const iam_context_guard_1 = require("./guards/iam-context.guard");
|
|
14
14
|
const iam_entity_access_service_1 = require("./services/iam-entity-access.service");
|
|
15
15
|
const iam_permission_service_1 = require("./services/iam-permission.service");
|
|
16
|
+
const iam_token_verifier_service_1 = require("./services/iam-token-verifier.service");
|
|
16
17
|
const iam_find_one_query_scope_pipe_1 = require("./pipes/iam-find-one-query-scope.pipe");
|
|
17
18
|
const iam_paginate_query_scope_pipe_1 = require("./pipes/iam-paginate-query-scope.pipe");
|
|
18
19
|
const iam_context_options_interface_1 = require("./interfaces/iam-context-options.interface");
|
|
20
|
+
const services = [
|
|
21
|
+
iam_entity_access_service_1.IamEntityAccessService,
|
|
22
|
+
iam_permission_service_1.IamPermissionService,
|
|
23
|
+
iam_token_verifier_service_1.IamTokenVerifierService,
|
|
24
|
+
iam_find_one_query_scope_pipe_1.IamFindOneQueryScopePipe,
|
|
25
|
+
iam_paginate_query_scope_pipe_1.IamPaginateQueryScopePipe,
|
|
26
|
+
];
|
|
27
|
+
const mergeOptions = (options = {}) => ({
|
|
28
|
+
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS,
|
|
29
|
+
...options,
|
|
30
|
+
controllers: {
|
|
31
|
+
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.controllers,
|
|
32
|
+
...options.controllers,
|
|
33
|
+
},
|
|
34
|
+
entityAccess: {
|
|
35
|
+
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.entityAccess,
|
|
36
|
+
...options.entityAccess,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
19
39
|
let IamContextModule = IamContextModule_1 = class IamContextModule {
|
|
20
40
|
static forRoot(options = {}) {
|
|
41
|
+
return IamContextModule_1.create([], {
|
|
42
|
+
provide: iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS,
|
|
43
|
+
useValue: mergeOptions(options),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
static forRootAsync(options) {
|
|
47
|
+
return IamContextModule_1.create(options.imports ?? [], {
|
|
48
|
+
provide: iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS,
|
|
49
|
+
inject: options.inject ?? [],
|
|
50
|
+
useFactory: async (...args) => mergeOptions(await options.useFactory(...args)),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
static create(imports, optionsProvider) {
|
|
21
54
|
return {
|
|
22
55
|
module: IamContextModule_1,
|
|
23
|
-
imports: [core_1.DiscoveryModule],
|
|
56
|
+
imports: [core_1.DiscoveryModule, ...imports],
|
|
24
57
|
providers: [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS,
|
|
29
|
-
...options,
|
|
30
|
-
controllers: {
|
|
31
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.controllers,
|
|
32
|
-
...options.controllers,
|
|
33
|
-
},
|
|
34
|
-
entityAccess: {
|
|
35
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.entityAccess,
|
|
36
|
-
...options.entityAccess,
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
iam_entity_access_service_1.IamEntityAccessService,
|
|
41
|
-
iam_permission_service_1.IamPermissionService,
|
|
42
|
-
iam_find_one_query_scope_pipe_1.IamFindOneQueryScopePipe,
|
|
43
|
-
iam_paginate_query_scope_pipe_1.IamPaginateQueryScopePipe,
|
|
44
|
-
{
|
|
45
|
-
provide: core_1.APP_GUARD,
|
|
46
|
-
useClass: iam_context_guard_1.IamContextGuard,
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
exports: [
|
|
50
|
-
iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS,
|
|
51
|
-
iam_entity_access_service_1.IamEntityAccessService,
|
|
52
|
-
iam_permission_service_1.IamPermissionService,
|
|
53
|
-
iam_find_one_query_scope_pipe_1.IamFindOneQueryScopePipe,
|
|
54
|
-
iam_paginate_query_scope_pipe_1.IamPaginateQueryScopePipe,
|
|
58
|
+
optionsProvider,
|
|
59
|
+
...services,
|
|
60
|
+
{ provide: core_1.APP_GUARD, useClass: iam_context_guard_1.IamContextGuard },
|
|
55
61
|
],
|
|
62
|
+
exports: [iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS, ...services],
|
|
56
63
|
};
|
|
57
64
|
}
|
|
58
65
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context.module.js","sourceRoot":"","sources":["../src/iam-context.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"iam-context.module.js","sourceRoot":"","sources":["../src/iam-context.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AACzE,uCAA0D;AAE1D,kEAA6D;AAC7D,oFAA8E;AAC9E,8EAAyE;AACzE,sFAAgF;AAChF,yFAAiF;AACjF,yFAAkF;AAClF,8FAKoD;AAEpD,MAAM,QAAQ,GAAG;IACf,kDAAsB;IACtB,6CAAoB;IACpB,oDAAuB;IACvB,wDAAwB;IACxB,yDAAyB;CAC1B,CAAC;AAGF,MAAM,YAAY,GAAG,CACnB,UAAmC,EAAE,EACZ,EAAE,CAAC,CAAC;IAC7B,GAAG,kEAAkC;IACrC,GAAG,OAAO;IACV,WAAW,EAAE;QACX,GAAG,kEAAkC,CAAC,WAAW;QACjD,GAAG,OAAO,CAAC,WAAW;KACvB;IACD,YAAY,EAAE;QACZ,GAAG,kEAAkC,CAAC,YAAY;QAClD,GAAG,OAAO,CAAC,YAAY;KACxB;CACF,CAAC,CAAC;AAQI,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,UAAmC,EAAE;QAClD,OAAO,kBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE;YACjC,OAAO,EAAE,0DAA0B;YACnC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAGD,MAAM,CAAC,YAAY,CAAC,OAAqC;QACvD,OAAO,kBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE;YACpD,OAAO,EAAE,0DAA0B;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,UAAU,EAAE,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE,CACnC,YAAY,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,MAAM,CACnB,OAAc,EACd,eAAyB;QAEzB,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,OAAO,EAAE,CAAC,sBAAe,EAAE,GAAG,OAAO,CAAC;YACtC,SAAS,EAAE;gBACT,eAAe;gBACf,GAAG,QAAQ;gBACX,EAAE,OAAO,EAAE,gBAAS,EAAE,QAAQ,EAAE,mCAAe,EAAE;aAClD;YACD,OAAO,EAAE,CAAC,0DAA0B,EAAE,GAAG,QAAQ,CAAC;SACnD,CAAC;IACJ,CAAC;CACF,CAAA;AAjCY,4CAAgB;2BAAhB,gBAAgB;IAF5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CAiC5B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './pipes/iam-paginate-query-scope.pipe';
|
|
|
18
18
|
export * from './pipes/iam-find-one-query-scope.pipe';
|
|
19
19
|
export * from './services/iam-entity-access.service';
|
|
20
20
|
export * from './services/iam-permission.service';
|
|
21
|
+
export * from './services/iam-token-verifier.service';
|
|
21
22
|
export * from './iam-context.module';
|
|
22
23
|
export * from './constants/iam-decorator-key.const';
|
|
23
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __exportStar(require("./pipes/iam-paginate-query-scope.pipe"), exports);
|
|
|
34
34
|
__exportStar(require("./pipes/iam-find-one-query-scope.pipe"), exports);
|
|
35
35
|
__exportStar(require("./services/iam-entity-access.service"), exports);
|
|
36
36
|
__exportStar(require("./services/iam-permission.service"), exports);
|
|
37
|
+
__exportStar(require("./services/iam-token-verifier.service"), exports);
|
|
37
38
|
__exportStar(require("./iam-context.module"), exports);
|
|
38
39
|
__exportStar(require("./constants/iam-decorator-key.const"), exports);
|
|
39
40
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD;AACnD,2EAAyD;AACzD,mEAAiD;AACjD,qEAAmD;AACnD,mEAAiD;AACjD,kEAAgD;AAChD,wDAAsC;AACtC,mEAAiD;AACjD,kEAAgD;AAChD,4EAA0D;AAC1D,6DAA2C;AAC3C,6DAA2C;AAC3C,8DAA4C;AAC5C,2EAAyD;AACzD,6EAA2D;AAC3D,iEAA+C;AAC/C,wEAAsD;AACtD,wEAAsD;AACtD,uEAAqD;AACrD,oEAAkD;AAClD,uDAAqC;AACrC,sEAAoD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD;AACnD,2EAAyD;AACzD,mEAAiD;AACjD,qEAAmD;AACnD,mEAAiD;AACjD,kEAAgD;AAChD,wDAAsC;AACtC,mEAAiD;AACjD,kEAAgD;AAChD,4EAA0D;AAC1D,6DAA2C;AAC3C,6DAA2C;AAC3C,8DAA4C;AAC5C,2EAAyD;AACzD,6EAA2D;AAC3D,iEAA+C;AAC/C,wEAAsD;AACtD,wEAAsD;AACtD,uEAAqD;AACrD,oEAAkD;AAClD,wEAAsD;AACtD,uDAAqC;AACrC,sEAAoD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Type } from '@nestjs/common';
|
|
2
2
|
import { EntityTarget } from 'typeorm';
|
|
3
3
|
import { IamUserTypeEnum } from '../enums/iam-user-type.enum';
|
|
4
|
+
import type { IamPermissionDefinition } from '../decorators/require-permission.decorator';
|
|
4
5
|
import { ApplyIamEntityScopeOptions, EntityAccessByRole } from './iam-entity-access.interface';
|
|
5
6
|
export type IamControllerClass = Type<unknown>;
|
|
6
7
|
export type IamControllerMatcher = string | IamControllerClass;
|
|
@@ -20,6 +21,11 @@ export interface IamContextModuleOptions {
|
|
|
20
21
|
permissions?: {
|
|
21
22
|
service?: string;
|
|
22
23
|
kafkaClient?: string | symbol;
|
|
24
|
+
extraKeys?: IamPermissionDefinition[];
|
|
25
|
+
};
|
|
26
|
+
tokenVerification?: {
|
|
27
|
+
issuers: string[];
|
|
28
|
+
jwksBaseUrl?: string;
|
|
23
29
|
};
|
|
24
30
|
entityAccess?: {
|
|
25
31
|
defaultAccess?: EntityAccessByRole<any>;
|
|
@@ -27,6 +33,11 @@ export interface IamContextModuleOptions {
|
|
|
27
33
|
presets?: IamEntityAccessPreset<any>[];
|
|
28
34
|
};
|
|
29
35
|
}
|
|
36
|
+
export interface IamContextModuleAsyncOptions {
|
|
37
|
+
imports?: any[];
|
|
38
|
+
inject?: any[];
|
|
39
|
+
useFactory: (...args: any[]) => IamContextModuleOptions | Promise<IamContextModuleOptions>;
|
|
40
|
+
}
|
|
30
41
|
export declare const IAM_CONTEXT_MODULE_OPTIONS: unique symbol;
|
|
31
42
|
export declare const DEFAULT_IAM_CONTEXT_MODULE_OPTIONS: Required<Pick<IamContextModuleOptions, 'defaultAllowedUserTypes' | 'allowRoutesWithoutIamDecorator'>> & Omit<IamContextModuleOptions, 'defaultAllowedUserTypes' | 'allowRoutesWithoutIamDecorator'>;
|
|
32
43
|
//# sourceMappingURL=iam-context-options.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/iam-context-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAE/D,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,GAAG;IAC5C,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAKxB,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAK/B,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IAItC,uBAAuB,CAAC,EAAE,eAAe,EAAE,CAAC;IAM5C,8BAA8B,CAAC,EAAE,OAAO,CAAC;IAWzC,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;KACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"iam-context-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/iam-context-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAE/D,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,GAAG;IAC5C,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAKxB,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAK/B,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IAItC,uBAAuB,CAAC,EAAE,eAAe,EAAE,CAAC;IAM5C,8BAA8B,CAAC,EAAE,OAAO,CAAC;IAWzC,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;KACjC,CAAC;IAgBF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC9B,SAAS,CAAC,EAAE,uBAAuB,EAAE,CAAC;KACvC,CAAC;IAcF,iBAAiB,CAAC,EAAE;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,YAAY,CAAC,EAAE;QAIb,aAAa,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAKxC,YAAY,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC;QAKxD,OAAO,CAAC,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACjE;AAED,eAAO,MAAM,0BAA0B,eAAuC,CAAC;AAE/E,eAAO,MAAM,kCAAkC,EAAE,QAAQ,CACvD,IAAI,CACF,uBAAuB,EACvB,yBAAyB,GAAG,gCAAgC,CAC7D,CACF,GACC,IAAI,CACF,uBAAuB,EACvB,yBAAyB,GAAG,gCAAgC,CAa/D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-context-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/iam-context-options.interface.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"iam-context-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/iam-context-options.interface.ts"],"names":[],"mappings":";;;AAqHa,QAAA,0BAA0B,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAElE,QAAA,kCAAkC,GASzC;IACJ,uBAAuB,EAAE,EAAE;IAC3B,8BAA8B,EAAE,KAAK;IACrC,WAAW,EAAE;QACX,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;KACX;IACD,YAAY,EAAE;QACZ,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,SAAS;QACvB,OAAO,EAAE,EAAE;KACZ;CACF,CAAC"}
|
|
@@ -9,12 +9,10 @@ export declare class IamPermissionService implements OnApplicationBootstrap {
|
|
|
9
9
|
private readonly metadataScanner;
|
|
10
10
|
private readonly moduleRef;
|
|
11
11
|
private readonly logger;
|
|
12
|
-
private readonly cache;
|
|
13
12
|
constructor(moduleOptions: IamContextModuleOptions, discoveryService: DiscoveryService, metadataScanner: MetadataScanner, moduleRef: ModuleRef);
|
|
14
|
-
hasPermissions(agent: GetAgentInterface | undefined, required: string[]):
|
|
13
|
+
hasPermissions(agent: GetAgentInterface | undefined, required: string[]): boolean;
|
|
15
14
|
onApplicationBootstrap(): Promise<void>;
|
|
16
15
|
collectPermissions(): IamPermissionDefinition[];
|
|
17
|
-
private findAgentPermissions;
|
|
18
16
|
private getKafkaClient;
|
|
19
17
|
}
|
|
20
18
|
//# sourceMappingURL=iam-permission.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-permission.service.d.ts","sourceRoot":"","sources":["../../src/services/iam-permission.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"iam-permission.service.d.ts","sourceRoot":"","sources":["../../src/services/iam-permission.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAOtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAEL,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AAarD,qBACa,oBAAqB,YAAW,sBAAsB;IAK/D,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAI7C,aAAa,EAAE,uBAAuB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,SAAS;IAQvC,cAAc,CACZ,KAAK,EAAE,iBAAiB,GAAG,SAAS,EACpC,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO;IAoBJ,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB7C,kBAAkB,IAAI,uBAAuB,EAAE;IAyB/C,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -19,8 +19,6 @@ const core_1 = require("@nestjs/core");
|
|
|
19
19
|
const rxjs_1 = require("rxjs");
|
|
20
20
|
const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
|
|
21
21
|
const iam_context_options_interface_1 = require("../interfaces/iam-context-options.interface");
|
|
22
|
-
const OFFLINE_TOKEN_TYPE = 'Offline';
|
|
23
|
-
const CACHE_TTL_MS = 60_000;
|
|
24
22
|
const KAFKA_TIMEOUT_MS = 5_000;
|
|
25
23
|
let IamPermissionService = IamPermissionService_1 = class IamPermissionService {
|
|
26
24
|
constructor(moduleOptions, discoveryService, metadataScanner, moduleRef) {
|
|
@@ -29,20 +27,16 @@ let IamPermissionService = IamPermissionService_1 = class IamPermissionService {
|
|
|
29
27
|
this.metadataScanner = metadataScanner;
|
|
30
28
|
this.moduleRef = moduleRef;
|
|
31
29
|
this.logger = new common_1.Logger(IamPermissionService_1.name);
|
|
32
|
-
this.cache = new Map();
|
|
33
30
|
}
|
|
34
|
-
|
|
31
|
+
hasPermissions(agent, required) {
|
|
35
32
|
if (!agent?.agentId)
|
|
36
33
|
return false;
|
|
37
|
-
|
|
38
|
-
if (!permissions && agent.tokenType === OFFLINE_TOKEN_TYPE) {
|
|
39
|
-
({ permissions, groupsMembership } = await this.findAgentPermissions(agent.agentId));
|
|
40
|
-
}
|
|
34
|
+
const { permissions, groupsMembership } = agent;
|
|
41
35
|
if (groupsMembership?.some((path) => path.endsWith(iam_decorator_key_const_1.IAM_SUPER_ADMIN_GROUP_SUFFIX))) {
|
|
42
36
|
return true;
|
|
43
37
|
}
|
|
44
38
|
const granted = new Set(permissions ?? []);
|
|
45
|
-
return required.every((key) => granted.has(key));
|
|
39
|
+
return required.every((key) => granted.has(key) || granted.has(`${key.split(':')[0]}:*`));
|
|
46
40
|
}
|
|
47
41
|
async onApplicationBootstrap() {
|
|
48
42
|
const service = this.moduleOptions.permissions?.service;
|
|
@@ -64,14 +58,12 @@ let IamPermissionService = IamPermissionService_1 = class IamPermissionService {
|
|
|
64
58
|
}
|
|
65
59
|
collectPermissions() {
|
|
66
60
|
const byKey = new Map();
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
});
|
|
74
|
-
};
|
|
61
|
+
const addAll = (definitions) => definitions.forEach((definition) => {
|
|
62
|
+
if (!byKey.get(definition.key)?.description) {
|
|
63
|
+
byKey.set(definition.key, definition);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const add = (target) => addAll(Reflect.getMetadata(iam_decorator_key_const_1.IAM_ROUTE_PERMISSIONS, target) ?? []);
|
|
75
67
|
for (const wrapper of this.discoveryService.getControllers()) {
|
|
76
68
|
const { instance, metatype } = wrapper;
|
|
77
69
|
if (!instance || !metatype)
|
|
@@ -82,26 +74,9 @@ let IamPermissionService = IamPermissionService_1 = class IamPermissionService {
|
|
|
82
74
|
.getAllMethodNames(prototype)
|
|
83
75
|
.forEach((name) => add(prototype[name]));
|
|
84
76
|
}
|
|
77
|
+
addAll(this.moduleOptions.permissions?.extraKeys ?? []);
|
|
85
78
|
return [...byKey.values()];
|
|
86
79
|
}
|
|
87
|
-
async findAgentPermissions(agentId) {
|
|
88
|
-
const cached = this.cache.get(agentId);
|
|
89
|
-
if (cached && cached.expiresAt > Date.now())
|
|
90
|
-
return cached.value;
|
|
91
|
-
const response = await (0, rxjs_1.firstValueFrom)(this.getKafkaClient()
|
|
92
|
-
.send(iam_decorator_key_const_1.IAM_AGENT_PERMISSIONS_FIND_TOPIC, {
|
|
93
|
-
event_source: this.moduleOptions.permissions?.service,
|
|
94
|
-
data: { id: agentId },
|
|
95
|
-
})
|
|
96
|
-
.pipe((0, rxjs_1.timeout)(KAFKA_TIMEOUT_MS)));
|
|
97
|
-
const parsed = typeof response === 'string' ? JSON.parse(response) : response;
|
|
98
|
-
const value = {
|
|
99
|
-
permissions: parsed?.data?.permissions ?? [],
|
|
100
|
-
groupsMembership: parsed?.data?.groupsMembership ?? [],
|
|
101
|
-
};
|
|
102
|
-
this.cache.set(agentId, { value, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
103
|
-
return value;
|
|
104
|
-
}
|
|
105
80
|
getKafkaClient() {
|
|
106
81
|
const token = this.moduleOptions.permissions?.kafkaClient;
|
|
107
82
|
if (!token) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iam-permission.service.js","sourceRoot":"","sources":["../../src/services/iam-permission.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAA4E;AAE5E,+BAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"iam-permission.service.js","sourceRoot":"","sources":["../../src/services/iam-permission.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { JWTPayload } from 'jose';
|
|
2
|
+
import { IamContextModuleOptions } from '../interfaces/iam-context-options.interface';
|
|
3
|
+
export declare class IamTokenVerifierService {
|
|
4
|
+
private readonly moduleOptions;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly jwks;
|
|
7
|
+
constructor(moduleOptions: IamContextModuleOptions);
|
|
8
|
+
get enabled(): boolean;
|
|
9
|
+
verifyRequest(request: any): Promise<void>;
|
|
10
|
+
verify(token: string): Promise<JWTPayload>;
|
|
11
|
+
private getJwks;
|
|
12
|
+
private jwksUrl;
|
|
13
|
+
private forwardedSubject;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=iam-token-verifier.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-token-verifier.service.d.ts","sourceRoot":"","sources":["../../src/services/iam-token-verifier.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiC,UAAU,EAAa,MAAM,MAAM,CAAC;AAC5E,OAAO,EAEL,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AAWrD,qBACa,uBAAuB;IAShC,OAAO,CAAC,QAAQ,CAAC,aAAa;IARhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGjB;gBAIe,aAAa,EAAE,uBAAuB;IAGzD,IAAI,OAAO,IAAI,OAAO,CAErB;IASK,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BhD,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var IamTokenVerifierService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.IamTokenVerifierService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const jose_1 = require("jose");
|
|
19
|
+
const iam_context_options_interface_1 = require("../interfaces/iam-context-options.interface");
|
|
20
|
+
const BEARER_PREFIX = /^Bearer\s+/i;
|
|
21
|
+
const ACCESS_TOKEN_TYPE = 'Bearer';
|
|
22
|
+
const CLOCK_TOLERANCE_SECONDS = 30;
|
|
23
|
+
let IamTokenVerifierService = IamTokenVerifierService_1 = class IamTokenVerifierService {
|
|
24
|
+
constructor(moduleOptions) {
|
|
25
|
+
this.moduleOptions = moduleOptions;
|
|
26
|
+
this.logger = new common_1.Logger(IamTokenVerifierService_1.name);
|
|
27
|
+
this.jwks = new Map();
|
|
28
|
+
}
|
|
29
|
+
get enabled() {
|
|
30
|
+
return !!this.moduleOptions.tokenVerification?.issuers?.length;
|
|
31
|
+
}
|
|
32
|
+
async verifyRequest(request) {
|
|
33
|
+
const headers = request.headers ?? {};
|
|
34
|
+
const authorization = headers['authorization'];
|
|
35
|
+
const forwarded = headers['injectedpayload'];
|
|
36
|
+
if (!authorization || !BEARER_PREFIX.test(authorization)) {
|
|
37
|
+
if (forwarded) {
|
|
38
|
+
this.logger.warn('Dropped injectedpayload sent without a Bearer token');
|
|
39
|
+
}
|
|
40
|
+
delete headers['injectedpayload'];
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const payload = await this.verify(authorization.replace(BEARER_PREFIX, ''));
|
|
44
|
+
if (forwarded && this.forwardedSubject(forwarded) !== payload.sub) {
|
|
45
|
+
this.logger.warn(`injectedpayload does not match the verified token (sub ${payload.sub})`);
|
|
46
|
+
}
|
|
47
|
+
headers['injectedpayload'] = JSON.stringify(payload);
|
|
48
|
+
}
|
|
49
|
+
async verify(token) {
|
|
50
|
+
let payload;
|
|
51
|
+
try {
|
|
52
|
+
const { iss } = (0, jose_1.decodeJwt)(token);
|
|
53
|
+
if (!iss || !this.moduleOptions.tokenVerification.issuers.includes(iss)) {
|
|
54
|
+
throw new Error('issuer not allowed');
|
|
55
|
+
}
|
|
56
|
+
({ payload } = await (0, jose_1.jwtVerify)(token, this.getJwks(iss), {
|
|
57
|
+
issuer: iss,
|
|
58
|
+
algorithms: ['RS256'],
|
|
59
|
+
clockTolerance: CLOCK_TOLERANCE_SECONDS,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new common_1.UnauthorizedException(`Invalid token: ${error?.code ?? error?.message ?? error}`);
|
|
64
|
+
}
|
|
65
|
+
if (payload.typ !== ACCESS_TOKEN_TYPE) {
|
|
66
|
+
throw new common_1.UnauthorizedException('Only access tokens are accepted');
|
|
67
|
+
}
|
|
68
|
+
return payload;
|
|
69
|
+
}
|
|
70
|
+
getJwks(issuer) {
|
|
71
|
+
let jwks = this.jwks.get(issuer);
|
|
72
|
+
if (!jwks) {
|
|
73
|
+
jwks = (0, jose_1.createRemoteJWKSet)(new URL(this.jwksUrl(issuer)));
|
|
74
|
+
this.jwks.set(issuer, jwks);
|
|
75
|
+
}
|
|
76
|
+
return jwks;
|
|
77
|
+
}
|
|
78
|
+
jwksUrl(issuer) {
|
|
79
|
+
const internal = this.moduleOptions.tokenVerification.jwksBaseUrl;
|
|
80
|
+
const realmPath = new URL(issuer).pathname;
|
|
81
|
+
const base = internal
|
|
82
|
+
? `${internal.replace(/\/$/, '')}${realmPath}`
|
|
83
|
+
: issuer;
|
|
84
|
+
return `${base}/protocol/openid-connect/certs`;
|
|
85
|
+
}
|
|
86
|
+
forwardedSubject(forwarded) {
|
|
87
|
+
try {
|
|
88
|
+
return JSON.parse(forwarded)?.sub;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
exports.IamTokenVerifierService = IamTokenVerifierService;
|
|
96
|
+
exports.IamTokenVerifierService = IamTokenVerifierService = IamTokenVerifierService_1 = __decorate([
|
|
97
|
+
(0, common_1.Injectable)(),
|
|
98
|
+
__param(0, (0, common_1.Inject)(iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS)),
|
|
99
|
+
__metadata("design:paramtypes", [Object])
|
|
100
|
+
], IamTokenVerifierService);
|
|
101
|
+
//# sourceMappingURL=iam-token-verifier.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-token-verifier.service.js","sourceRoot":"","sources":["../../src/services/iam-token-verifier.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondart/nestjs-common-module-iam",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.15",
|
|
4
4
|
"description": "Reusable IAM (Identity and Access Management) utilities for NestJS.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mondart"
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"test:debug": "node --inspect-brk -r ts-node/register ./node_modules/.bin/jest --runInBand"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mondart/nestjs-common-module-core": "3.2.12"
|
|
24
|
+
"@mondart/nestjs-common-module-core": "3.2.12",
|
|
25
|
+
"jose": "5.10.0"
|
|
25
26
|
},
|
|
26
27
|
"peerDependencies": {
|
|
27
28
|
"@nestjs/common": "^11.1.10",
|