@mondart/nestjs-common-module-iam 3.2.12 → 3.2.14
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 +56 -0
- package/dist/constants/iam-decorator-key.const.d.ts +3 -0
- package/dist/constants/iam-decorator-key.const.d.ts.map +1 -1
- package/dist/constants/iam-decorator-key.const.js +4 -1
- package/dist/constants/iam-decorator-key.const.js.map +1 -1
- package/dist/decorators/get-agent.decorator.d.ts +2 -0
- package/dist/decorators/get-agent.decorator.d.ts.map +1 -0
- package/dist/decorators/get-agent.decorator.js +27 -0
- package/dist/decorators/get-agent.decorator.js.map +1 -0
- package/dist/decorators/get-user.decorator.d.ts +2 -0
- package/dist/decorators/get-user.decorator.d.ts.map +1 -0
- package/dist/decorators/get-user.decorator.js +24 -0
- package/dist/decorators/get-user.decorator.js.map +1 -0
- package/dist/decorators/iam-context.decorator.d.ts +4 -0
- package/dist/decorators/iam-context.decorator.d.ts.map +1 -0
- package/dist/decorators/iam-context.decorator.js +62 -0
- package/dist/decorators/iam-context.decorator.js.map +1 -0
- package/dist/decorators/require-permission.decorator.d.ts +6 -0
- package/dist/decorators/require-permission.decorator.d.ts.map +1 -0
- package/dist/decorators/require-permission.decorator.js +8 -0
- package/dist/decorators/require-permission.decorator.js.map +1 -0
- package/dist/dto/iam-context.dto.d.ts +14 -0
- package/dist/dto/iam-context.dto.d.ts.map +1 -0
- package/dist/dto/iam-context.dto.js +68 -0
- package/dist/dto/iam-context.dto.js.map +1 -0
- package/dist/guards/iam-context.guard.d.ts +5 -1
- package/dist/guards/iam-context.guard.d.ts.map +1 -1
- package/dist/guards/iam-context.guard.js +29 -6
- 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 +39 -28
- package/dist/iam-context.module.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/get-agent.interface.d.ts +9 -0
- package/dist/interfaces/get-agent.interface.d.ts.map +1 -0
- package/dist/interfaces/get-agent.interface.js +3 -0
- package/dist/interfaces/get-agent.interface.js.map +1 -0
- package/dist/interfaces/get-user.interface.d.ts +7 -0
- package/dist/interfaces/get-user.interface.d.ts.map +1 -0
- package/dist/interfaces/get-user.interface.js +3 -0
- package/dist/interfaces/get-user.interface.js.map +1 -0
- package/dist/interfaces/iam-context-options.interface.d.ts +13 -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/pipes/iam-find-one-query-scope.pipe.js +2 -2
- package/dist/pipes/iam-find-one-query-scope.pipe.js.map +1 -1
- package/dist/pipes/iam-paginate-query-scope.pipe.js +2 -2
- package/dist/pipes/iam-paginate-query-scope.pipe.js.map +1 -1
- package/dist/services/iam-entity-access.service.d.ts.map +1 -1
- package/dist/services/iam-entity-access.service.js +3 -1
- package/dist/services/iam-entity-access.service.js.map +1 -1
- package/dist/services/iam-permission.service.d.ts +18 -0
- package/dist/services/iam-permission.service.d.ts.map +1 -0
- package/dist/services/iam-permission.service.js +97 -0
- package/dist/services/iam-permission.service.js.map +1 -0
- 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
|
@@ -62,6 +62,62 @@ attached to the request (`agentId`/`isAgent` -> `AGENT`, `userId`/`user` ->
|
|
|
62
62
|
`USER`, `guestId`/`guest.id` -> `GUEST`) and rejects the request with
|
|
63
63
|
`ForbiddenException` if that type isn't in the route's allowed list.
|
|
64
64
|
|
|
65
|
+
## Agent permissions
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
@AllowIam(IamUserTypeEnum.AGENT)
|
|
69
|
+
@RequirePermission({ key: 'order:orders:read', description: 'List orders' })
|
|
70
|
+
@Get()
|
|
71
|
+
findAll() { ... }
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
An agent needs every listed key in its `permissions` claim (client roles of
|
|
75
|
+
the back-office `permissions` client, assigned through IAM groups). An agent
|
|
76
|
+
in a group whose path ends with `/super-admin` passes every check. Users and
|
|
77
|
+
guests are rejected on these routes.
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
IamContextModule.forRoot({
|
|
81
|
+
permissions: { service: 'order', kafkaClient: IAM_KAFKA_CLIENT },
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- `service`: key prefix of this service. On boot every declared key is sent to
|
|
86
|
+
IAM as `iam.permission.sync`, so IAM can create the roles.
|
|
87
|
+
- `kafkaClient`: injection token of the `ClientKafka` that sends the sync event.
|
|
88
|
+
|
|
89
|
+
## Verifying tokens in the service
|
|
90
|
+
|
|
91
|
+
The gateway introspects the token and forwards its claims as the
|
|
92
|
+
`injectedpayload` header. Anyone who can reach the service directly can forge
|
|
93
|
+
that header, so each service can verify the Bearer token itself:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
IamContextModule.forRootAsync({
|
|
97
|
+
inject: [ConfigService],
|
|
98
|
+
useFactory: (config: ConfigService) => ({
|
|
99
|
+
tokenVerification: {
|
|
100
|
+
issuers: config.get<string[]>('keycloak.issuers'), // https://auth.example.com/realms/back-office, ...
|
|
101
|
+
jwksBaseUrl: config.get('keycloak.internalUrl'), // optional, e.g. http://keycloak:8080
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
With `tokenVerification` set, the guard runs on every HTTP request, before
|
|
108
|
+
the controller filter:
|
|
109
|
+
|
|
110
|
+
- The access token's RS256 signature is checked against the realm's JWKS
|
|
111
|
+
(cached, refetched on key rotation), along with expiry and an allowed issuer.
|
|
112
|
+
- `injectedpayload` is replaced with the verified claims, so `@IamContext()`,
|
|
113
|
+
`@GetAgent()` and `@GetUser()` only ever see verified data. A forwarded
|
|
114
|
+
payload whose `sub` differs from the token is logged.
|
|
115
|
+
- A missing token removes `injectedpayload`: the caller is anonymous.
|
|
116
|
+
- An invalid token, a foreign issuer, or anything other than an access token
|
|
117
|
+
(`typ: Bearer`) gets 401. That includes offline tokens; exchange them for an
|
|
118
|
+
access token first. `@PublicIam()` routes treat such callers as anonymous
|
|
119
|
+
instead.
|
|
120
|
+
|
|
65
121
|
## Entity access rules
|
|
66
122
|
|
|
67
123
|
Access rules describe, per user type, which field(s) on the entity must
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export declare const IAM_PUBLIC_ROUTE = "iam_public_route";
|
|
2
2
|
export declare const IAM_ROUTE_USER_TYPE = "iam_route_user_type";
|
|
3
|
+
export declare const IAM_ROUTE_PERMISSIONS = "iam_route_permissions";
|
|
4
|
+
export declare const IAM_PERMISSION_SYNC_TOPIC = "iam.permission.sync";
|
|
5
|
+
export declare const IAM_SUPER_ADMIN_GROUP_SUFFIX = "/super-admin";
|
|
3
6
|
export declare const IAM_ENTITY_ACCESS_KEY = "iam_entity_access";
|
|
4
7
|
export declare const IAM_ENTITY_SCOPE_KEY = "iam_entity_scope";
|
|
5
8
|
export declare const IAM_REQUEST_USER_TYPE_KEY = "__iam_user_type";
|
|
@@ -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;
|
|
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,8 +1,11 @@
|
|
|
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_ROUTE_USER_TYPE = exports.IAM_PUBLIC_ROUTE = void 0;
|
|
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
|
+
exports.IAM_ROUTE_PERMISSIONS = 'iam_route_permissions';
|
|
7
|
+
exports.IAM_PERMISSION_SYNC_TOPIC = 'iam.permission.sync';
|
|
8
|
+
exports.IAM_SUPER_ADMIN_GROUP_SUFFIX = '/super-admin';
|
|
6
9
|
exports.IAM_ENTITY_ACCESS_KEY = 'iam_entity_access';
|
|
7
10
|
exports.IAM_ENTITY_SCOPE_KEY = 'iam_entity_scope';
|
|
8
11
|
exports.IAM_REQUEST_USER_TYPE_KEY = '__iam_user_type';
|
|
@@ -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;
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-agent.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/get-agent.decorator.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,QAAQ,mDAgCpB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetAgent = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.GetAgent = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
6
|
+
const request = ctx.switchToHttp().getRequest();
|
|
7
|
+
const injectedPayload = request?.headers?.['injectedpayload'];
|
|
8
|
+
if (injectedPayload) {
|
|
9
|
+
const data = JSON.parse(injectedPayload);
|
|
10
|
+
const token = request?.headers?.['authorization'];
|
|
11
|
+
if (data) {
|
|
12
|
+
if (data?.is_agent)
|
|
13
|
+
request.agent = {
|
|
14
|
+
agentId: data?.sub,
|
|
15
|
+
isAgent: data?.is_agent,
|
|
16
|
+
storeIds: data?.store_ids,
|
|
17
|
+
groupsMembership: data?.groups_membership,
|
|
18
|
+
permissions: data?.permissions,
|
|
19
|
+
tokenType: data?.typ,
|
|
20
|
+
token,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
delete request?.headers?.['authorization'];
|
|
24
|
+
}
|
|
25
|
+
return request?.agent ? request?.agent : null;
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=get-agent.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-agent.decorator.js","sourceRoot":"","sources":["../../src/decorators/get-agent.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAS3D,QAAA,QAAQ,GAAG,IAAA,6BAAoB,EAC1C,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,MAAM,eAAe,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,GAON,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,EAAE,QAAQ;gBAChB,OAAO,CAAC,KAAK,GAAG;oBACd,OAAO,EAAE,IAAI,EAAE,GAAG;oBAClB,OAAO,EAAE,IAAI,EAAE,QAAQ;oBACvB,QAAQ,EAAE,IAAI,EAAE,SAAS;oBACzB,gBAAgB,EAAE,IAAI,EAAE,iBAAiB;oBACzC,WAAW,EAAE,IAAI,EAAE,WAAW;oBAC9B,SAAS,EAAE,IAAI,EAAE,GAAG;oBACpB,KAAK;iBACN,CAAC;QACN,CAAC;QACD,OAAO,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/get-user.decorator.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,mDA0BnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetUser = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.GetUser = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
6
|
+
const request = ctx.switchToHttp().getRequest();
|
|
7
|
+
const injectedPayload = request?.headers?.['injectedpayload'];
|
|
8
|
+
if (injectedPayload) {
|
|
9
|
+
const data = JSON.parse(injectedPayload);
|
|
10
|
+
const token = request?.headers?.['authorization'];
|
|
11
|
+
if (data) {
|
|
12
|
+
if (!data?.is_agent && (data?.contact_id || data?.store_id))
|
|
13
|
+
request.user = {
|
|
14
|
+
contactId: data?.contact_id,
|
|
15
|
+
storeId: data?.store_id,
|
|
16
|
+
isAgent: data?.is_agent ?? false,
|
|
17
|
+
token,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
delete request?.headers?.['authorization'];
|
|
21
|
+
}
|
|
22
|
+
return request?.user ? request?.user : null;
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=get-user.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user.decorator.js","sourceRoot":"","sources":["../../src/decorators/get-user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAS3D,QAAA,OAAO,GAAG,IAAA,6BAAoB,EACzC,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,MAAM,eAAe,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,GAIN,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,CAAC;gBACzD,OAAO,CAAC,IAAI,GAAG;oBACb,SAAS,EAAE,IAAI,EAAE,UAAU;oBAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ;oBACvB,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;oBAChC,KAAK;iBACN,CAAC;QACN,CAAC;QACD,OAAO,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-context.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/iam-context.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKvD,eAAO,MAAM,UAAU,mDAMtB,CAAC;AAUF,eAAO,MAAM,aAAa,GAAI,SAAS,GAAG,KAAG,aAkE5C,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getIamContext = exports.IamContext = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const iam_context_dto_1 = require("../dto/iam-context.dto");
|
|
7
|
+
exports.IamContext = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
8
|
+
const request = ctx.switchToHttp().getRequest();
|
|
9
|
+
return (0, exports.getIamContext)(request);
|
|
10
|
+
});
|
|
11
|
+
const getIamContext = (request) => {
|
|
12
|
+
const headers = typeof request?.headers === 'string'
|
|
13
|
+
? JSON.parse(request?.headers)
|
|
14
|
+
: request?.headers;
|
|
15
|
+
const injectedPayload = headers?.['injectedpayload'];
|
|
16
|
+
const ip = headers?.['x-forwarded-for'] ||
|
|
17
|
+
headers?.['host'] ||
|
|
18
|
+
headers?.address ||
|
|
19
|
+
request?.socket?.remoteAddress ||
|
|
20
|
+
null;
|
|
21
|
+
const requestId = headers?.['request-id'] ?? (0, crypto_1.randomUUID)();
|
|
22
|
+
const timestamp = new Date(headers?.['timestamp'] || headers?.['time'] || Date.now());
|
|
23
|
+
let isAgent = false;
|
|
24
|
+
let user;
|
|
25
|
+
let agent;
|
|
26
|
+
if (injectedPayload) {
|
|
27
|
+
const data = JSON.parse(injectedPayload);
|
|
28
|
+
const token = headers?.['authorization'];
|
|
29
|
+
if (data) {
|
|
30
|
+
if (!data?.is_agent && (data?.contact_id || data?.store_id)) {
|
|
31
|
+
user = {
|
|
32
|
+
userId: data?.sub,
|
|
33
|
+
contactId: data?.contact_id,
|
|
34
|
+
storeId: data?.store_id,
|
|
35
|
+
token,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
else if (data?.is_agent) {
|
|
39
|
+
isAgent = true;
|
|
40
|
+
agent = {
|
|
41
|
+
agentId: data?.sub,
|
|
42
|
+
storeIds: data?.store_ids,
|
|
43
|
+
groupsMembership: data?.groups_membership,
|
|
44
|
+
permissions: data?.permissions,
|
|
45
|
+
tokenType: data?.typ,
|
|
46
|
+
token,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
delete headers?.['authorization'];
|
|
51
|
+
}
|
|
52
|
+
return new iam_context_dto_1.IamContextDto({
|
|
53
|
+
ip,
|
|
54
|
+
requestId,
|
|
55
|
+
timestamp,
|
|
56
|
+
isAgent,
|
|
57
|
+
user,
|
|
58
|
+
agent,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
exports.getIamContext = getIamContext;
|
|
62
|
+
//# sourceMappingURL=iam-context.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-context.decorator.js","sourceRoot":"","sources":["../../src/decorators/iam-context.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AACxE,mCAAoC;AACpC,4DAAuD;AAK1C,QAAA,UAAU,GAAG,IAAA,6BAAoB,EAC5C,CAAC,IAAa,EAAE,GAAqB,EAAiB,EAAE;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,OAAO,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;AAChC,CAAC,CACF,CAAC;AAUK,MAAM,aAAa,GAAG,CAAC,OAAY,EAAiB,EAAE;IAC3D,MAAM,OAAO,GACX,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ;QAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;QAC9B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC;IAEvB,MAAM,eAAe,GAAG,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC;IACrD,MAAM,EAAE,GACN,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,MAAM,EAAE,aAAa;QAC9B,IAAI,CAAC;IAEP,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,IAAA,mBAAU,GAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAC1D,CAAC;IACF,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,IAAI,IAAsB,CAAC;IAC3B,IAAI,KAAwB,CAAC;IAE7B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,GASN,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC5D,IAAI,GAAG;oBACL,MAAM,EAAE,IAAI,EAAE,GAAG;oBACjB,SAAS,EAAE,IAAI,EAAE,UAAU;oBAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ;oBACvB,KAAK;iBACN,CAAC;YACJ,CAAC;iBAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC1B,OAAO,GAAG,IAAI,CAAC;gBACf,KAAK,GAAG;oBACN,OAAO,EAAE,IAAI,EAAE,GAAG;oBAClB,QAAQ,EAAE,IAAI,EAAE,SAAS;oBACzB,gBAAgB,EAAE,IAAI,EAAE,iBAAiB;oBACzC,WAAW,EAAE,IAAI,EAAE,WAAW;oBAC9B,SAAS,EAAE,IAAI,EAAE,GAAG;oBACpB,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,+BAAa,CAAC;QACvB,EAAE;QACF,SAAS;QACT,SAAS;QACT,OAAO;QACP,IAAI;QACJ,KAAK;KACN,CAAC,CAAC;AACL,CAAC,CAAC;AAlEW,QAAA,aAAa,iBAkExB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface IamPermissionDefinition {
|
|
2
|
+
key: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const RequirePermission: (...permissions: (string | IamPermissionDefinition)[]) => import("@nestjs/common").CustomDecorator<string>;
|
|
6
|
+
//# sourceMappingURL=require-permission.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-permission.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/require-permission.decorator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IAEtC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,eAAO,MAAM,iBAAiB,GAC5B,GAAG,aAAa,CAAC,MAAM,GAAG,uBAAuB,CAAC,EAAE,qDAOnD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequirePermission = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
|
|
6
|
+
const RequirePermission = (...permissions) => (0, common_1.SetMetadata)(iam_decorator_key_const_1.IAM_ROUTE_PERMISSIONS, permissions.map((permission) => typeof permission === 'string' ? { key: permission } : permission));
|
|
7
|
+
exports.RequirePermission = RequirePermission;
|
|
8
|
+
//# sourceMappingURL=require-permission.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-permission.decorator.js","sourceRoot":"","sources":["../../src/decorators/require-permission.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAC7C,kFAA6E;AAatE,MAAM,iBAAiB,GAAG,CAC/B,GAAG,WAAiD,EACpD,EAAE,CACF,IAAA,oBAAW,EACT,+CAAqB,EACrB,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAC7B,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAClE,CACF,CAAC;AARS,QAAA,iBAAiB,qBAQ1B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GetAgentInterface } from '../interfaces/get-agent.interface';
|
|
2
|
+
import { GetUserInterface } from '../interfaces/get-user.interface';
|
|
3
|
+
export declare class IamContextDto {
|
|
4
|
+
timestamp: Date;
|
|
5
|
+
requestId: string;
|
|
6
|
+
ip?: string;
|
|
7
|
+
agentId: string;
|
|
8
|
+
user?: GetUserInterface;
|
|
9
|
+
userId: string;
|
|
10
|
+
agent?: GetAgentInterface;
|
|
11
|
+
isAgent?: boolean;
|
|
12
|
+
constructor(init?: Partial<Omit<IamContextDto, 'agentId' | 'userId'>>);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=iam-context.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-context.dto.d.ts","sourceRoot":"","sources":["../../src/dto/iam-context.dto.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGpE,qBAAa,aAAa;IAGxB,SAAS,EAAE,IAAI,CAAC;IAIhB,SAAS,EAAE,MAAM,CAAC;IAIlB,EAAE,CAAC,EAAE,MAAM,CAAC;IAIZ,OAAO,EAAE,MAAM,CAAC;IAIhB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAIxB,MAAM,EAAE,MAAM,CAAC;IAIf,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAG1B,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEN,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;CAWtE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.IamContextDto = void 0;
|
|
13
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
class IamContextDto {
|
|
17
|
+
constructor(init) {
|
|
18
|
+
this.ip = init?.ip;
|
|
19
|
+
this.isAgent = init?.isAgent;
|
|
20
|
+
this.agentId = init?.agent ? init?.agent?.agentId : undefined;
|
|
21
|
+
this.agent = init?.agent;
|
|
22
|
+
this.userId = init?.user ? init?.user?.userId : undefined;
|
|
23
|
+
this.user = init?.user;
|
|
24
|
+
this.requestId = init?.requestId ?? (0, crypto_1.randomUUID)();
|
|
25
|
+
this.timestamp = init?.timestamp ?? new Date();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.IamContextDto = IamContextDto;
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, swagger_1.ApiResponseProperty)({ type: Date }),
|
|
31
|
+
(0, class_validator_1.IsDate)(),
|
|
32
|
+
__metadata("design:type", Date)
|
|
33
|
+
], IamContextDto.prototype, "timestamp", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, swagger_1.ApiResponseProperty)({ type: String }),
|
|
36
|
+
(0, class_validator_1.IsString)(),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], IamContextDto.prototype, "requestId", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, swagger_1.ApiResponseProperty)({ type: String }),
|
|
41
|
+
(0, class_validator_1.IsString)(),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], IamContextDto.prototype, "ip", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, swagger_1.ApiResponseProperty)({ type: String }),
|
|
46
|
+
(0, class_validator_1.IsString)(),
|
|
47
|
+
__metadata("design:type", String)
|
|
48
|
+
], IamContextDto.prototype, "agentId", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, swagger_1.ApiResponseProperty)({ type: Object }),
|
|
51
|
+
(0, class_validator_1.IsObject)(),
|
|
52
|
+
__metadata("design:type", Object)
|
|
53
|
+
], IamContextDto.prototype, "user", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, swagger_1.ApiResponseProperty)({ type: String }),
|
|
56
|
+
(0, class_validator_1.IsString)(),
|
|
57
|
+
__metadata("design:type", String)
|
|
58
|
+
], IamContextDto.prototype, "userId", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
(0, swagger_1.ApiResponseProperty)({ type: Object }),
|
|
61
|
+
(0, class_validator_1.IsObject)(),
|
|
62
|
+
__metadata("design:type", Object)
|
|
63
|
+
], IamContextDto.prototype, "agent", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, swagger_1.ApiResponseProperty)({ type: Boolean }),
|
|
66
|
+
__metadata("design:type", Boolean)
|
|
67
|
+
], IamContextDto.prototype, "isAgent", void 0);
|
|
68
|
+
//# sourceMappingURL=iam-context.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam-context.dto.js","sourceRoot":"","sources":["../../src/dto/iam-context.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAsD;AACtD,qDAA6D;AAC7D,mCAAoC;AAKpC,MAAa,aAAa;IAgCxB,YAAY,IAAyD;QACnE,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;QAEvB,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,IAAA,mBAAU,GAAE,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;IACjD,CAAC;CACF;AA3CD,sCA2CC;AAxCC;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,IAAA,wBAAM,GAAE;8BACE,IAAI;gDAAC;AAIhB;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;gDACO;AAIlB;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;yCACC;AAIZ;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;8CACK;AAIhB;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;2CACa;AAIxB;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;6CACI;AAIf;IAFC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAA,0BAAQ,GAAE;;4CACe;AAG1B;IADC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;8CACrB"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { IamPermissionService } from '../services/iam-permission.service';
|
|
4
|
+
import { IamTokenVerifierService } from '../services/iam-token-verifier.service';
|
|
3
5
|
import { IamEntityAccessService } from '../services/iam-entity-access.service';
|
|
4
6
|
import { IamContextModuleOptions } from '../interfaces/iam-context-options.interface';
|
|
5
7
|
export declare class IamContextGuard implements CanActivate {
|
|
6
8
|
private readonly reflector;
|
|
7
9
|
private readonly iamEntityAccessService;
|
|
10
|
+
private readonly iamPermissionService;
|
|
11
|
+
private readonly iamTokenVerifierService;
|
|
8
12
|
private readonly moduleOptions;
|
|
9
|
-
constructor(reflector: Reflector, iamEntityAccessService: IamEntityAccessService, moduleOptions: IamContextModuleOptions);
|
|
13
|
+
constructor(reflector: Reflector, iamEntityAccessService: IamEntityAccessService, iamPermissionService: IamPermissionService, iamTokenVerifierService: IamTokenVerifierService, moduleOptions: IamContextModuleOptions);
|
|
10
14
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
11
15
|
private shouldIgnoreController;
|
|
12
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;
|
|
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"}
|
|
@@ -15,27 +15,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.IamContextGuard = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const core_1 = require("@nestjs/core");
|
|
18
|
-
const
|
|
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
|
+
const iam_permission_service_1 = require("../services/iam-permission.service");
|
|
21
|
+
const iam_token_verifier_service_1 = require("../services/iam-token-verifier.service");
|
|
22
|
+
const iam_user_type_enum_1 = require("../enums/iam-user-type.enum");
|
|
20
23
|
const iam_entity_access_service_1 = require("../services/iam-entity-access.service");
|
|
21
24
|
const iam_context_options_interface_1 = require("../interfaces/iam-context-options.interface");
|
|
22
25
|
let IamContextGuard = class IamContextGuard {
|
|
23
|
-
constructor(reflector, iamEntityAccessService, moduleOptions) {
|
|
26
|
+
constructor(reflector, iamEntityAccessService, iamPermissionService, iamTokenVerifierService, moduleOptions) {
|
|
24
27
|
this.reflector = reflector;
|
|
25
28
|
this.iamEntityAccessService = iamEntityAccessService;
|
|
29
|
+
this.iamPermissionService = iamPermissionService;
|
|
30
|
+
this.iamTokenVerifierService = iamTokenVerifierService;
|
|
26
31
|
this.moduleOptions = moduleOptions;
|
|
27
32
|
}
|
|
28
33
|
async canActivate(context) {
|
|
29
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
|
+
}
|
|
30
46
|
const controller = context.getClass();
|
|
31
47
|
if (this.shouldIgnoreController(controller)) {
|
|
32
48
|
return true;
|
|
33
49
|
}
|
|
34
|
-
const isPublicRoute = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_PUBLIC_ROUTE, [context.getHandler(), context.getClass()]);
|
|
35
50
|
if (isPublicRoute) {
|
|
36
51
|
return true;
|
|
37
52
|
}
|
|
38
|
-
const iamContext = (0,
|
|
53
|
+
const iamContext = (0, iam_context_decorator_1.getIamContext)(request);
|
|
39
54
|
const decoratorAllowedUserTypes = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_ROUTE_USER_TYPE, [context.getHandler(), context.getClass()]);
|
|
40
55
|
const allowedUserTypes = decoratorAllowedUserTypes ??
|
|
41
56
|
this.moduleOptions.defaultAllowedUserTypes ??
|
|
@@ -50,6 +65,12 @@ let IamContextGuard = class IamContextGuard {
|
|
|
50
65
|
if (!allowedUserTypes.includes(currentUserType)) {
|
|
51
66
|
throw new common_1.ForbiddenException();
|
|
52
67
|
}
|
|
68
|
+
const requiredPermissions = this.reflector.getAllAndMerge(iam_decorator_key_const_1.IAM_ROUTE_PERMISSIONS, [context.getHandler(), context.getClass()]);
|
|
69
|
+
if (requiredPermissions.length &&
|
|
70
|
+
(currentUserType !== iam_user_type_enum_1.IamUserTypeEnum.AGENT ||
|
|
71
|
+
!this.iamPermissionService.hasPermissions(iamContext.agent, requiredPermissions.map(({ key }) => key)))) {
|
|
72
|
+
throw new common_1.ForbiddenException('Missing permission');
|
|
73
|
+
}
|
|
53
74
|
const rawScopeOptions = this.reflector.getAllAndOverride(iam_decorator_key_const_1.IAM_ENTITY_SCOPE_KEY, [context.getHandler(), context.getClass()]);
|
|
54
75
|
if (rawScopeOptions) {
|
|
55
76
|
request[iam_decorator_key_const_1.IAM_REQUEST_ENTITY_SCOPE_OPTIONS_KEY] =
|
|
@@ -124,8 +145,10 @@ let IamContextGuard = class IamContextGuard {
|
|
|
124
145
|
exports.IamContextGuard = IamContextGuard;
|
|
125
146
|
exports.IamContextGuard = IamContextGuard = __decorate([
|
|
126
147
|
(0, common_1.Injectable)(),
|
|
127
|
-
__param(
|
|
148
|
+
__param(4, (0, common_1.Inject)(iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS)),
|
|
128
149
|
__metadata("design:paramtypes", [core_1.Reflector,
|
|
129
|
-
iam_entity_access_service_1.IamEntityAccessService,
|
|
150
|
+
iam_entity_access_service_1.IamEntityAccessService,
|
|
151
|
+
iam_permission_service_1.IamPermissionService,
|
|
152
|
+
iam_token_verifier_service_1.IamTokenVerifierService, Object])
|
|
130
153
|
], IamContextGuard);
|
|
131
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
|
|
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"}
|
|
@@ -12,43 +12,54 @@ const common_1 = require("@nestjs/common");
|
|
|
12
12
|
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
|
+
const iam_permission_service_1 = require("./services/iam-permission.service");
|
|
16
|
+
const iam_token_verifier_service_1 = require("./services/iam-token-verifier.service");
|
|
15
17
|
const iam_find_one_query_scope_pipe_1 = require("./pipes/iam-find-one-query-scope.pipe");
|
|
16
18
|
const iam_paginate_query_scope_pipe_1 = require("./pipes/iam-paginate-query-scope.pipe");
|
|
17
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
|
+
});
|
|
18
39
|
let IamContextModule = IamContextModule_1 = class IamContextModule {
|
|
19
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) {
|
|
20
54
|
return {
|
|
21
55
|
module: IamContextModule_1,
|
|
56
|
+
imports: [core_1.DiscoveryModule, ...imports],
|
|
22
57
|
providers: [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS,
|
|
27
|
-
...options,
|
|
28
|
-
controllers: {
|
|
29
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.controllers,
|
|
30
|
-
...options.controllers,
|
|
31
|
-
},
|
|
32
|
-
entityAccess: {
|
|
33
|
-
...iam_context_options_interface_1.DEFAULT_IAM_CONTEXT_MODULE_OPTIONS.entityAccess,
|
|
34
|
-
...options.entityAccess,
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
iam_entity_access_service_1.IamEntityAccessService,
|
|
39
|
-
iam_find_one_query_scope_pipe_1.IamFindOneQueryScopePipe,
|
|
40
|
-
iam_paginate_query_scope_pipe_1.IamPaginateQueryScopePipe,
|
|
41
|
-
{
|
|
42
|
-
provide: core_1.APP_GUARD,
|
|
43
|
-
useClass: iam_context_guard_1.IamContextGuard,
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
exports: [
|
|
47
|
-
iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS,
|
|
48
|
-
iam_entity_access_service_1.IamEntityAccessService,
|
|
49
|
-
iam_find_one_query_scope_pipe_1.IamFindOneQueryScopePipe,
|
|
50
|
-
iam_paginate_query_scope_pipe_1.IamPaginateQueryScopePipe,
|
|
58
|
+
optionsProvider,
|
|
59
|
+
...services,
|
|
60
|
+
{ provide: core_1.APP_GUARD, useClass: iam_context_guard_1.IamContextGuard },
|
|
51
61
|
],
|
|
62
|
+
exports: [iam_context_options_interface_1.IAM_CONTEXT_MODULE_OPTIONS, ...services],
|
|
52
63
|
};
|
|
53
64
|
}
|
|
54
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"}
|