@node-c/domain-iam 1.0.0-alpha9 → 1.0.0-beta0

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.
Files changed (104) hide show
  1. package/dist/common/definitions/common.constants.d.ts +6 -1
  2. package/dist/common/definitions/common.constants.js +5 -0
  3. package/dist/common/definitions/common.constants.js.map +1 -1
  4. package/dist/module/iam.module.js.map +1 -1
  5. package/dist/services/authentication/iam.authentication.definitions.d.ts +79 -16
  6. package/dist/services/authentication/iam.authentication.definitions.js +6 -9
  7. package/dist/services/authentication/iam.authentication.definitions.js.map +1 -1
  8. package/dist/services/authentication/iam.authentication.service.d.ts +10 -3
  9. package/dist/services/authentication/iam.authentication.service.js +30 -2
  10. package/dist/services/authentication/iam.authentication.service.js.map +1 -1
  11. package/dist/services/authenticationOAuth2/iam.authenticationOAuth2.definitions.d.ts +38 -0
  12. package/dist/services/{authenticationLocal/iam.authenticationLocal.definitions.js → authenticationOAuth2/iam.authenticationOAuth2.definitions.js} +1 -1
  13. package/dist/services/authenticationOAuth2/iam.authenticationOAuth2.definitions.js.map +1 -0
  14. package/dist/services/authenticationOAuth2/iam.authenticationOAuth2.service.d.ts +24 -0
  15. package/dist/services/authenticationOAuth2/iam.authenticationOAuth2.service.js +299 -0
  16. package/dist/services/authenticationOAuth2/iam.authenticationOAuth2.service.js.map +1 -0
  17. package/dist/services/authenticationOAuth2/index.d.ts +2 -0
  18. package/dist/services/authenticationOAuth2/index.js +19 -0
  19. package/dist/services/authenticationOAuth2/index.js.map +1 -0
  20. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.definitions.d.ts +12 -0
  21. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.definitions.js +3 -0
  22. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.definitions.js.map +1 -0
  23. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.service.d.ts +14 -0
  24. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.service.js +141 -0
  25. package/dist/services/authenticationUserLocal/iam.authenticationUserLocal.service.js.map +1 -0
  26. package/dist/services/authenticationUserLocal/index.d.ts +2 -0
  27. package/dist/services/{authenticationLocal → authenticationUserLocal}/index.js +2 -2
  28. package/dist/services/authenticationUserLocal/index.js.map +1 -0
  29. package/dist/services/authorization/iam.authorization.definitions.d.ts +33 -23
  30. package/dist/services/authorization/iam.authorization.definitions.js +7 -0
  31. package/dist/services/authorization/iam.authorization.definitions.js.map +1 -1
  32. package/dist/services/authorization/iam.authorization.service.d.ts +28 -13
  33. package/dist/services/authorization/iam.authorization.service.js +231 -125
  34. package/dist/services/authorization/iam.authorization.service.js.map +1 -1
  35. package/dist/services/index.d.ts +4 -2
  36. package/dist/services/index.js +4 -2
  37. package/dist/services/index.js.map +1 -1
  38. package/dist/services/mfa/iam.mfa.definitions.d.ts +21 -0
  39. package/dist/services/mfa/iam.mfa.definitions.js +8 -0
  40. package/dist/services/mfa/iam.mfa.definitions.js.map +1 -0
  41. package/dist/services/mfa/iam.mfa.service.d.ts +9 -0
  42. package/dist/services/mfa/iam.mfa.service.js +31 -0
  43. package/dist/services/mfa/iam.mfa.service.js.map +1 -0
  44. package/dist/services/mfa/index.d.ts +2 -0
  45. package/dist/services/{users → mfa}/index.js +2 -2
  46. package/dist/services/mfa/index.js.map +1 -0
  47. package/dist/services/tokenManager/iam.tokenManager.definitions.d.ts +14 -3
  48. package/dist/services/tokenManager/iam.tokenManager.definitions.js.map +1 -1
  49. package/dist/services/tokenManager/iam.tokenManager.service.d.ts +23 -9
  50. package/dist/services/tokenManager/iam.tokenManager.service.js +111 -43
  51. package/dist/services/tokenManager/iam.tokenManager.service.js.map +1 -1
  52. package/dist/services/userManager/iam.userManager.definitions.d.ts +45 -0
  53. package/dist/services/userManager/iam.userManager.definitions.js +8 -0
  54. package/dist/services/userManager/iam.userManager.definitions.js.map +1 -0
  55. package/dist/services/userManager/iam.userManager.service.d.ts +32 -0
  56. package/dist/services/userManager/iam.userManager.service.js +331 -0
  57. package/dist/services/userManager/iam.userManager.service.js.map +1 -0
  58. package/dist/services/userManager/index.d.ts +2 -0
  59. package/dist/services/userManager/index.js +19 -0
  60. package/dist/services/userManager/index.js.map +1 -0
  61. package/package.json +9 -8
  62. package/src/common/definitions/common.constants.ts +14 -0
  63. package/src/common/definitions/index.ts +1 -0
  64. package/src/index.ts +3 -0
  65. package/src/module/iam.definitions.ts +15 -0
  66. package/src/module/iam.module.ts +29 -0
  67. package/src/module/index.ts +2 -0
  68. package/src/services/authentication/iam.authentication.definitions.ts +100 -0
  69. package/src/services/authentication/iam.authentication.service.ts +103 -0
  70. package/src/services/authentication/index.ts +2 -0
  71. package/src/services/authenticationOAuth2/iam.authenticationOAuth2.definitions.ts +71 -0
  72. package/src/services/authenticationOAuth2/iam.authenticationOAuth2.service.ts +350 -0
  73. package/src/services/authenticationOAuth2/index.ts +2 -0
  74. package/src/services/authenticationUserLocal/iam.authenticationUserLocal.definitions.ts +29 -0
  75. package/src/services/authenticationUserLocal/iam.authenticationUserLocal.service.ts +171 -0
  76. package/src/services/authenticationUserLocal/index.ts +2 -0
  77. package/src/services/authorization/iam.authorization.definitions.ts +55 -0
  78. package/src/services/authorization/iam.authorization.service.ts +384 -0
  79. package/src/services/authorization/index.ts +2 -0
  80. package/src/services/index.ts +7 -0
  81. package/src/services/mfa/iam.mfa.definitions.ts +28 -0
  82. package/src/services/mfa/iam.mfa.service.ts +38 -0
  83. package/src/services/mfa/index.ts +2 -0
  84. package/src/services/tokenManager/iam.tokenManager.definitions.ts +61 -0
  85. package/src/services/tokenManager/iam.tokenManager.service.ts +290 -0
  86. package/src/services/tokenManager/index.ts +2 -0
  87. package/src/services/userManager/iam.userManager.definitions.ts +73 -0
  88. package/src/services/userManager/iam.userManager.service.ts +461 -0
  89. package/src/services/userManager/index.ts +2 -0
  90. package/dist/services/authenticationLocal/iam.authenticationLocal.definitions.d.ts +0 -11
  91. package/dist/services/authenticationLocal/iam.authenticationLocal.definitions.js.map +0 -1
  92. package/dist/services/authenticationLocal/iam.authenticationLocal.service.d.ts +0 -10
  93. package/dist/services/authenticationLocal/iam.authenticationLocal.service.js +0 -70
  94. package/dist/services/authenticationLocal/iam.authenticationLocal.service.js.map +0 -1
  95. package/dist/services/authenticationLocal/index.d.ts +0 -2
  96. package/dist/services/authenticationLocal/index.js.map +0 -1
  97. package/dist/services/users/iam.users.definitions.d.ts +0 -30
  98. package/dist/services/users/iam.users.definitions.js +0 -8
  99. package/dist/services/users/iam.users.definitions.js.map +0 -1
  100. package/dist/services/users/iam.users.service.d.ts +0 -16
  101. package/dist/services/users/iam.users.service.js +0 -93
  102. package/dist/services/users/iam.users.service.js.map +0 -1
  103. package/dist/services/users/index.d.ts +0 -2
  104. package/dist/services/users/index.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export * from './iam.mfa.definitions';
2
+ export * from './iam.mfa.service';
@@ -0,0 +1,61 @@
1
+ import { DomainCreateOptions } from '@node-c/core';
2
+
3
+ import { IAMAuthenticationType, IAMAuthenticationVerifyExternalAccessTokenResult } from '../authentication';
4
+
5
+ export interface BaseTokenEntityFields {
6
+ externalToken?: string;
7
+ externalTokenAuthService?: IAMAuthenticationType;
8
+ }
9
+
10
+ export type DecodedTokenContent<TokenEntityFields> = {
11
+ exp?: number;
12
+ iat: number;
13
+ data?: TokenEntityFields & BaseTokenEntityFields;
14
+ };
15
+
16
+ export type TokenEntity<TokenEntityFields extends object> = {
17
+ token: string;
18
+ type: TokenType;
19
+ } & TokenEntityFields &
20
+ BaseTokenEntityFields;
21
+
22
+ export type TokenManagerCreateData<TokenEntityFields extends object> = Partial<
23
+ Omit<TokenEntity<TokenEntityFields>, 'token'>
24
+ >;
25
+
26
+ export type TokenManagerCreateOptions = {
27
+ expiresInMinutes?: number;
28
+ identifierDataField?: string;
29
+ persist?: boolean;
30
+ purgeOldFromData?: boolean;
31
+ tokenContentOnlyFields?: string[];
32
+ ttl?: number;
33
+ } & DomainCreateOptions;
34
+
35
+ export enum TokenType {
36
+ // eslint-disable-next-line no-unused-vars
37
+ Access = 'access',
38
+ // eslint-disable-next-line no-unused-vars
39
+ Refresh = 'refresh'
40
+ }
41
+
42
+ export interface TokenManagerVerifyResult<TokenEntityFields> {
43
+ content?: DecodedTokenContent<TokenEntityFields>;
44
+ externalTokenData?: IAMAuthenticationVerifyExternalAccessTokenResult;
45
+ error?: unknown;
46
+ }
47
+
48
+ export interface VerifyAccessTokenOptions {
49
+ deleteFromStoreIfExpired?: boolean;
50
+ identifierDataField?: string;
51
+ newTokenExpiresInMinutes?: number;
52
+ persistNewToken?: boolean;
53
+ purgeStoreOnRenew?: boolean;
54
+ refreshToken?: string;
55
+ refreshTokenAccessTokenIdentifierDataField?: string;
56
+ }
57
+
58
+ export interface VerifyAccessTokenReturnData<TokenEntityFields> {
59
+ content?: DecodedTokenContent<TokenEntityFields>;
60
+ newToken?: string;
61
+ }
@@ -0,0 +1,290 @@
1
+ import {
2
+ AppConfigDomainIAM,
3
+ ApplicationError,
4
+ ConfigProviderService,
5
+ DataEntityService,
6
+ DomainCreateOptions,
7
+ DomainCreateResult,
8
+ DomainEntityService,
9
+ GenericObject,
10
+ setNested
11
+ } from '@node-c/core';
12
+
13
+ import * as jwt from 'jsonwebtoken';
14
+ import ld from 'lodash';
15
+
16
+ import {
17
+ DecodedTokenContent,
18
+ TokenEntity,
19
+ TokenManagerCreateData,
20
+ TokenManagerCreateOptions,
21
+ TokenManagerVerifyResult,
22
+ TokenType,
23
+ VerifyAccessTokenOptions,
24
+ VerifyAccessTokenReturnData
25
+ } from './iam.tokenManager.definitions';
26
+
27
+ import { Constants } from '../../common/definitions';
28
+ import { IAMAuthenticationService, IAMAuthenticationType } from '../authentication';
29
+ import { IAMAuthenticationOAuth2Service } from '../authenticationOAuth2';
30
+ import { IAMAuthenticationUserLocalService } from '../authenticationUserLocal';
31
+
32
+ // TODO: console.error -> logger
33
+ /*
34
+ * Service for managing local access and refresh JWTs.
35
+ */
36
+ export class IAMTokenManagerService<TokenEntityFields extends object> {
37
+ constructor(
38
+ // eslint-disable-next-line no-unused-vars
39
+ // protected authServices: Record<string, IAMAuthenticationService<object, object>>,
40
+ // eslint-disable-next-line no-unused-vars
41
+ protected authServices: {
42
+ [IAMAuthenticationType.OAuth2]?: IAMAuthenticationOAuth2Service<object, object>;
43
+ [IAMAuthenticationType.UserLocal]?: IAMAuthenticationUserLocalService<object, object>;
44
+ } & { [serviceName: string]: IAMAuthenticationService<object, object> },
45
+ // eslint-disable-next-line no-unused-vars
46
+ protected configProvider: ConfigProviderService,
47
+ // eslint-disable-next-line no-unused-vars
48
+ protected domainTokensEntityService: DomainEntityService<
49
+ TokenEntity<TokenEntityFields>,
50
+ DataEntityService<TokenEntity<TokenEntityFields>>
51
+ >,
52
+ // eslint-disable-next-line no-unused-vars
53
+ protected moduleName: string
54
+ ) {}
55
+
56
+ async create(
57
+ data: TokenManagerCreateData<TokenEntityFields>,
58
+ options: TokenManagerCreateOptions
59
+ ): Promise<DomainCreateResult<TokenEntity<TokenEntityFields>>> {
60
+ const { configProvider, moduleName, domainTokensEntityService } = this;
61
+ const moduleConfig = configProvider.config.domain[moduleName] as AppConfigDomainIAM;
62
+ const { type, ...tokenData } = data;
63
+ const { expiresInMinutes, identifierDataField, persist, purgeOldFromData, tokenContentOnlyFields } = options;
64
+ const signOptions = {} as jwt.SignOptions;
65
+ let secret: string;
66
+ // Leaving this big and ugly if-statement as is, in case we need to expand it in the future.
67
+ if (type === TokenType.Access) {
68
+ secret = moduleConfig.jwtAccessSecret;
69
+ if (expiresInMinutes) {
70
+ signOptions.expiresIn = expiresInMinutes * 60;
71
+ } else if (moduleConfig.accessTokenExpiryTimeInMinutes) {
72
+ signOptions.expiresIn = moduleConfig.accessTokenExpiryTimeInMinutes * 60;
73
+ }
74
+ } else if (type === TokenType.Refresh) {
75
+ secret = moduleConfig.jwtRefreshSecret;
76
+ if (expiresInMinutes) {
77
+ signOptions.expiresIn = expiresInMinutes * 60;
78
+ } else if (moduleConfig.refreshTokenExpiryTimeInMinutes) {
79
+ signOptions.expiresIn = moduleConfig.refreshTokenExpiryTimeInMinutes * 60;
80
+ }
81
+ } else {
82
+ throw new ApplicationError(`[TokenManager.create]: Invalid token type - "${type}".`);
83
+ }
84
+ const token = await new Promise<string>((resolve, reject) => {
85
+ jwt.sign({ data }, secret, signOptions, (err, token) => {
86
+ if (err) {
87
+ console.error(err);
88
+ reject(new ApplicationError('Failed to sign token.'));
89
+ return;
90
+ }
91
+ resolve(token as string);
92
+ });
93
+ });
94
+ const objectToSave = { ...tokenData, token, type } as TokenEntity<TokenEntityFields>;
95
+ if (tokenContentOnlyFields?.length) {
96
+ tokenContentOnlyFields.forEach(fieldName =>
97
+ setNested(objectToSave, fieldName, undefined, { removeNestedFieldEscapeSign: true })
98
+ );
99
+ }
100
+ // save the token in the data system of choice
101
+ // TODO: multi-data isn't handled well here (or, actually, at all)
102
+ if (persist) {
103
+ if (purgeOldFromData && identifierDataField) {
104
+ const identifierValue = ld.get(data, identifierDataField);
105
+ if (typeof identifierValue !== 'undefined' && typeof identifierValue !== 'object') {
106
+ await domainTokensEntityService.delete(
107
+ {
108
+ filters: { [identifierDataField]: identifierValue, type }
109
+ },
110
+ { requirePrimaryKeys: true }
111
+ );
112
+ }
113
+ }
114
+ await domainTokensEntityService.create(objectToSave, { ttl: signOptions.expiresIn } as DomainCreateOptions);
115
+ }
116
+ return { result: objectToSave };
117
+ }
118
+
119
+ // TODO: delete from store at the end
120
+ async verifyAccessToken(
121
+ token: string,
122
+ options?: VerifyAccessTokenOptions
123
+ ): Promise<VerifyAccessTokenReturnData<TokenEntityFields>> {
124
+ const { configProvider, moduleName, domainTokensEntityService } = this;
125
+ const moduleConfig = configProvider.config.domain[moduleName] as AppConfigDomainIAM;
126
+ const {
127
+ deleteFromStoreIfExpired,
128
+ identifierDataField,
129
+ newTokenExpiresInMinutes,
130
+ persistNewToken,
131
+ purgeStoreOnRenew,
132
+ refreshToken,
133
+ refreshTokenAccessTokenIdentifierDataField
134
+ } = options || {};
135
+ // decode the token
136
+ const { content, error, externalTokenData } = await this.verify(token, moduleConfig.jwtAccessSecret, {
137
+ // TODO: make this configurable
138
+ verifyExternal: true
139
+ });
140
+ const externalAccessTokenExpired = !!externalTokenData?.error;
141
+ const internalAccessTokenExpired = error === Constants.TOKEN_EXPIRED_ERROR;
142
+ let errorMessageToLog: string | undefined;
143
+ let externalRenewEnabled = false;
144
+ let newToken: string | undefined;
145
+ let refreshTokenContent: DecodedTokenContent<object> | undefined;
146
+ let renewEnabled = false;
147
+ let throwError = true;
148
+ // check whether the local and/or external access tokens have expired
149
+ if (internalAccessTokenExpired || externalAccessTokenExpired) {
150
+ // prepare renewal if the necessary data is present
151
+ if (identifierDataField && content?.data) {
152
+ if (refreshToken && refreshTokenAccessTokenIdentifierDataField) {
153
+ // internal refresh token verification
154
+ const { content: rtc, error: refreshTokenError } = await this.verify(
155
+ refreshToken,
156
+ moduleConfig.jwtRefreshSecret
157
+ );
158
+ refreshTokenContent = rtc;
159
+ if (!refreshTokenContent) {
160
+ errorMessageToLog = '[IAMTokenManagerService.verifyAccessToken]: Empty internal refresh token.';
161
+ } else if (refreshTokenError) {
162
+ errorMessageToLog = refreshTokenError as string;
163
+ // delete the refresh token from the store
164
+ if (deleteFromStoreIfExpired && refreshTokenContent.data) {
165
+ const identifierValue = ld.get(refreshTokenContent.data, refreshTokenAccessTokenIdentifierDataField);
166
+ if (typeof identifierValue !== 'undefined' && typeof identifierValue !== 'object') {
167
+ await domainTokensEntityService.delete(
168
+ {
169
+ filters: { [refreshTokenAccessTokenIdentifierDataField]: identifierValue, token: refreshToken }
170
+ },
171
+ { requirePrimaryKeys: true }
172
+ );
173
+ }
174
+ }
175
+ } else {
176
+ const refreshTokenCheckValue = ld.get(content.data, refreshTokenAccessTokenIdentifierDataField);
177
+ if (refreshTokenCheckValue !== refreshToken) {
178
+ errorMessageToLog = '[IAMTokenManagerService.verifyAccessToken]: Mismatched internal refresh token.';
179
+ } else {
180
+ renewEnabled = true;
181
+ throwError = false;
182
+ }
183
+ }
184
+ // external token renewal preparation
185
+ if (externalAccessTokenExpired) {
186
+ if (refreshTokenContent?.data?.externalToken) {
187
+ externalRenewEnabled = true;
188
+ renewEnabled = true;
189
+ throwError = false;
190
+ } else {
191
+ errorMessageToLog = '[IAMTokenManagerService.verifyAccessToken]: Missing external refresh token.';
192
+ }
193
+ }
194
+ }
195
+ // no renewal - delete from store if enabled and prepare to throw an error
196
+ else {
197
+ errorMessageToLog =
198
+ '[IAMTokenManagerService.verifyAccessToken]: Access token expired & no refresh token data present or configured.';
199
+ if (deleteFromStoreIfExpired) {
200
+ const identifierValue = ld.get(content.data, identifierDataField);
201
+ if (typeof identifierValue !== 'undefined' && typeof identifierValue !== 'object') {
202
+ await domainTokensEntityService.delete(
203
+ {
204
+ filters: { [identifierDataField]: identifierValue, token }
205
+ },
206
+ { requirePrimaryKeys: true }
207
+ );
208
+ }
209
+ }
210
+ }
211
+ }
212
+ // otherwise, simply throw an error
213
+ else {
214
+ errorMessageToLog = '[IAMTokenManagerService.verify]: Internal access token expired.';
215
+ }
216
+ } else {
217
+ throwError = false;
218
+ }
219
+ if (throwError) {
220
+ console.error(errorMessageToLog);
221
+ throw new ApplicationError('Expired access token.');
222
+ }
223
+ // renewal
224
+ if (content?.data && renewEnabled) {
225
+ const tokenData: TokenManagerCreateData<GenericObject<unknown>> = { ...content.data, type: TokenType.Access };
226
+ if (refreshToken && refreshTokenAccessTokenIdentifierDataField) {
227
+ tokenData[refreshTokenAccessTokenIdentifierDataField] = refreshToken;
228
+ }
229
+ if (externalRenewEnabled) {
230
+ const externalAccessTokenRenewalResult = await this.authServices[
231
+ refreshTokenContent!.data!.externalTokenAuthService!
232
+ ]!.refreshExternalAccessToken({
233
+ accessToken: content.data!.externalToken!,
234
+ refreshToken: refreshTokenContent!.data!.externalToken!
235
+ });
236
+ if (externalAccessTokenRenewalResult.error) {
237
+ // TODO: delete from store
238
+ console.error(errorMessageToLog);
239
+ throw new ApplicationError('Expired access token.');
240
+ }
241
+ // TODO: save the new refresh token, if such exists
242
+ tokenData.externalToken = externalAccessTokenRenewalResult.newAccessToken;
243
+ }
244
+ const { result } = await this.create(tokenData as TokenManagerCreateData<TokenEntityFields>, {
245
+ expiresInMinutes: newTokenExpiresInMinutes,
246
+ identifierDataField,
247
+ persist: persistNewToken,
248
+ purgeOldFromData: purgeStoreOnRenew
249
+ });
250
+ newToken = result.token;
251
+ }
252
+ return { content, newToken };
253
+ }
254
+
255
+ protected async verify(
256
+ token: string,
257
+ secret: string,
258
+ options?: { forceVerifyExternal?: boolean; verifyExternal?: boolean }
259
+ ): Promise<TokenManagerVerifyResult<TokenEntityFields>> {
260
+ const { configProvider, moduleName } = this;
261
+ const moduleConfig = configProvider.config.domain[moduleName] as AppConfigDomainIAM;
262
+ const { forceVerifyExternal, verifyExternal } = options || {};
263
+ const data = await new Promise<{ content?: DecodedTokenContent<TokenEntityFields>; error?: unknown }>(resolve => {
264
+ jwt.verify(token, secret, (err, decoded) => {
265
+ if (err) {
266
+ resolve({ content: decoded as DecodedTokenContent<TokenEntityFields>, error: err });
267
+ }
268
+ resolve({ content: decoded as DecodedTokenContent<TokenEntityFields> });
269
+ });
270
+ });
271
+ // TODO: move this logic to the verifyAccessToken method.
272
+ const returnData: TokenManagerVerifyResult<TokenEntityFields> = { ...data };
273
+ const tokenPayload = data.content?.data;
274
+ if (verifyExternal && tokenPayload?.externalToken && tokenPayload?.externalTokenAuthService) {
275
+ const authServiceConfig = moduleConfig.authServiceSettings?.[tokenPayload?.externalTokenAuthService];
276
+ if (authServiceConfig?.processExternalTokensOnVerify || forceVerifyExternal) {
277
+ const authService = this.authServices[tokenPayload?.externalTokenAuthService];
278
+ if (!authService) {
279
+ throw new ApplicationError(
280
+ `[IAMTokenManagerService.verify]: Auth service ${tokenPayload?.externalTokenAuthService} not configured.`
281
+ );
282
+ }
283
+ returnData.externalTokenData = await authService.verifyExternalAccessToken({
284
+ accessToken: tokenPayload?.externalToken
285
+ });
286
+ }
287
+ }
288
+ return returnData;
289
+ }
290
+ }
@@ -0,0 +1,2 @@
1
+ export * from './iam.tokenManager.definitions';
2
+ export * from './iam.tokenManager.service';
@@ -0,0 +1,73 @@
1
+ import {
2
+ AppConfigCommonDomainIAMAuthServiceConfigCompleteSettings,
3
+ AppConfigCommonDomainIAMAuthServiceConfigInitiateSettings,
4
+ AppConfigDomainIAMAuthenticationStep,
5
+ DomainFindOnePrivateOptions,
6
+ GenericObject
7
+ } from '@node-c/core';
8
+
9
+ import {
10
+ IAMAuthenticationCompleteResult,
11
+ IAMAuthenticationInitiateResult,
12
+ IAMAuthenticationService,
13
+ IAMAuthenticationType
14
+ } from '../authentication';
15
+ import { AuthorizationUser } from '../authorization';
16
+ import { IAMMFAType } from '../mfa';
17
+
18
+ export interface IAMUserManagerCreateAccessTokenOptions<AuthData = unknown> {
19
+ auth: {
20
+ mfaType?: IAMMFAType;
21
+ type: IAMAuthenticationType | string;
22
+ } & AuthData;
23
+ filters?: GenericObject;
24
+ mainFilterField: string;
25
+ rememberUser?: boolean;
26
+ step?: AppConfigDomainIAMAuthenticationStep;
27
+ }
28
+
29
+ export type IAMUserManagerCreateAccessTokenReturnData<UserData> =
30
+ | {
31
+ accessToken: string;
32
+ refreshToken?: string;
33
+ user: UserData;
34
+ }
35
+ | { nextStepsRequired: boolean };
36
+
37
+ export type IAMUserManagerExecuteStepData<AuthData = unknown> = Omit<
38
+ IAMUserManagerCreateAccessTokenOptions<AuthData>,
39
+ 'rememberUser' | 'step'
40
+ >;
41
+
42
+ export interface IAMUserManagerExecuteStepOptions<User extends object> {
43
+ authService: IAMAuthenticationService<User, User>;
44
+ name: AppConfigDomainIAMAuthenticationStep;
45
+ stepConfig:
46
+ | AppConfigCommonDomainIAMAuthServiceConfigCompleteSettings
47
+ | AppConfigCommonDomainIAMAuthServiceConfigInitiateSettings;
48
+ }
49
+
50
+ export interface IAMUserManagerExecuteStepResult<User extends object> {
51
+ stepResult: IAMAuthenticationCompleteResult | IAMAuthenticationInitiateResult;
52
+ user: IAMUserManagerUserWithPermissionsData<User, unknown> | null;
53
+ userFilterField?: string | undefined;
54
+ userFilterValue?: unknown | undefined;
55
+ }
56
+
57
+ export interface IAMUserManagerGetUserWithPermissionsDataOptions extends DomainFindOnePrivateOptions {
58
+ keepPassword?: boolean;
59
+ }
60
+
61
+ export type IAMUserManagerUserWithPermissionsData<UserData, AuthorizationPointId> =
62
+ AuthorizationUser<AuthorizationPointId> & UserData;
63
+
64
+ export interface IAMUserManagerUserTokenEnityFields<UserId = unknown> {
65
+ refreshToken?: string;
66
+ userId: UserId;
67
+ user?: IAMUserManagerUserWithPermissionsData<object, unknown>;
68
+ }
69
+
70
+ export enum IAMUserManagerUserTokenUserIdentifier {
71
+ // eslint-disable-next-line no-unused-vars
72
+ FieldName = 'userId'
73
+ }