prime-sdk 3.0.8-beta.0 → 3.0.9
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/.eslintrc.js +0 -4
- package/README.md +10 -307
- package/dist/external/aws/kms/kms.service.d.ts +2 -2
- package/dist/external/aws/s3/s3.service.d.ts +2 -0
- package/dist/external/aws/s3/s3.service.js +50 -0
- package/dist/external/aws/s3/s3.service.js.map +1 -1
- package/dist/external/aws/ses/ses.service.d.ts +2 -2
- package/dist/external/aws/sns/sns.service.d.ts +2 -2
- package/dist/external/aws/sqs/sqs.service.d.ts +1 -1
- package/dist/external/redis/interfaces/redis.interface.d.ts +0 -1
- package/dist/external/redis/redis.service.d.ts +0 -1
- package/dist/index.d.ts +1 -15
- package/dist/index.js +1 -25
- package/dist/index.js.map +1 -1
- package/dist/lib/cache/cache.d.ts +2 -3
- package/dist/lib/cache/interfaces/cache.interface.d.ts +1 -2
- package/dist/lib/crypto/crypto.module.d.ts +1 -1
- package/dist/lib/crypto/types/crypto.type.d.ts +0 -1
- package/dist/lib/documents/types/bedrock.type.d.ts +0 -1
- package/dist/lib/email/email.module.d.ts +1 -1
- package/dist/lib/storage/interfaces/storage.interface.d.ts +1 -0
- package/dist/lib/storage/interfaces/storage.interface.js.map +1 -1
- package/dist/lib/storage/storage.d.ts +1 -1
- package/dist/lib/storage/storage.js +3 -0
- package/dist/lib/storage/storage.js.map +1 -1
- package/dist/lib/storage/types/storage.type.d.ts +1 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -4
- package/src/external/aws/s3/s3.service.ts +70 -0
- package/src/index.ts +0 -42
- package/src/lib/storage/interfaces/storage.interface.ts +1 -0
- package/src/lib/storage/storage.ts +4 -0
- package/src/lib/storage/types/storage.type.ts +1 -0
- package/tsconfig.json +0 -1
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +0 -1
- package/dist/lib/entraID/customError/entraID.exception.d.ts +0 -5
- package/dist/lib/entraID/customError/entraID.exception.js +0 -43
- package/dist/lib/entraID/customError/entraID.exception.js.map +0 -1
- package/dist/lib/entraID/decorators/current-user.decorator.d.ts +0 -1
- package/dist/lib/entraID/decorators/current-user.decorator.js +0 -9
- package/dist/lib/entraID/decorators/current-user.decorator.js.map +0 -1
- package/dist/lib/entraID/decorators/public.decorator.d.ts +0 -2
- package/dist/lib/entraID/decorators/public.decorator.js +0 -8
- package/dist/lib/entraID/decorators/public.decorator.js.map +0 -1
- package/dist/lib/entraID/decorators/roles.decorator.d.ts +0 -2
- package/dist/lib/entraID/decorators/roles.decorator.js +0 -8
- package/dist/lib/entraID/decorators/roles.decorator.js.map +0 -1
- package/dist/lib/entraID/entraID.constants.d.ts +0 -2
- package/dist/lib/entraID/entraID.constants.js +0 -6
- package/dist/lib/entraID/entraID.constants.js.map +0 -1
- package/dist/lib/entraID/entraID.module.d.ts +0 -14
- package/dist/lib/entraID/entraID.module.js +0 -56
- package/dist/lib/entraID/entraID.module.js.map +0 -1
- package/dist/lib/entraID/entraID.service.d.ts +0 -25
- package/dist/lib/entraID/entraID.service.js +0 -166
- package/dist/lib/entraID/entraID.service.js.map +0 -1
- package/dist/lib/entraID/guards/entra-auth.guard.d.ts +0 -21
- package/dist/lib/entraID/guards/entra-auth.guard.js +0 -70
- package/dist/lib/entraID/guards/entra-auth.guard.js.map +0 -1
- package/dist/lib/entraID/guards/roles.guard.d.ts +0 -7
- package/dist/lib/entraID/guards/roles.guard.js +0 -41
- package/dist/lib/entraID/guards/roles.guard.js.map +0 -1
- package/dist/lib/entraID/interfaces/entraID-service.interface.d.ts +0 -7
- package/dist/lib/entraID/interfaces/entraID-service.interface.js +0 -3
- package/dist/lib/entraID/interfaces/entraID-service.interface.js.map +0 -1
- package/dist/lib/entraID/internal-token/internal-token.module.d.ts +0 -2
- package/dist/lib/entraID/internal-token/internal-token.module.js +0 -21
- package/dist/lib/entraID/internal-token/internal-token.module.js.map +0 -1
- package/dist/lib/entraID/internal-token/internal-token.service.d.ts +0 -10
- package/dist/lib/entraID/internal-token/internal-token.service.js +0 -76
- package/dist/lib/entraID/internal-token/internal-token.service.js.map +0 -1
- package/dist/lib/entraID/microsoft/microsoft.module.d.ts +0 -2
- package/dist/lib/entraID/microsoft/microsoft.module.js +0 -21
- package/dist/lib/entraID/microsoft/microsoft.module.js.map +0 -1
- package/dist/lib/entraID/microsoft/microsoft.service.d.ts +0 -14
- package/dist/lib/entraID/microsoft/microsoft.service.js +0 -132
- package/dist/lib/entraID/microsoft/microsoft.service.js.map +0 -1
- package/dist/lib/entraID/security/security.module.d.ts +0 -2
- package/dist/lib/entraID/security/security.module.js +0 -21
- package/dist/lib/entraID/security/security.module.js.map +0 -1
- package/dist/lib/entraID/security/security.service.d.ts +0 -9
- package/dist/lib/entraID/security/security.service.js +0 -65
- package/dist/lib/entraID/security/security.service.js.map +0 -1
- package/dist/lib/entraID/types/entraID-module-init.types.d.ts +0 -18
- package/dist/lib/entraID/types/entraID-module-init.types.js +0 -3
- package/dist/lib/entraID/types/entraID-module-init.types.js.map +0 -1
- package/dist/lib/entraID/types/entraID.type.d.ts +0 -52
- package/dist/lib/entraID/types/entraID.type.js +0 -3
- package/dist/lib/entraID/types/entraID.type.js.map +0 -1
- package/dist/lib/entraID/utils/cookie.utils.d.ts +0 -7
- package/dist/lib/entraID/utils/cookie.utils.js +0 -42
- package/dist/lib/entraID/utils/cookie.utils.js.map +0 -1
- package/dist/lib/entraID/utils/crypto.utils.d.ts +0 -9
- package/dist/lib/entraID/utils/crypto.utils.js +0 -47
- package/dist/lib/entraID/utils/crypto.utils.js.map +0 -1
- package/dist/lib/entraID/utils/index.d.ts +0 -2
- package/dist/lib/entraID/utils/index.js +0 -8
- package/dist/lib/entraID/utils/index.js.map +0 -1
- package/dist/lib/entraID/utils/token.utils.d.ts +0 -6
- package/dist/lib/entraID/utils/token.utils.js +0 -24
- package/dist/lib/entraID/utils/token.utils.js.map +0 -1
- package/src/lib/entraID/customError/entraID.exception.ts +0 -43
- package/src/lib/entraID/decorators/current-user.decorator.ts +0 -8
- package/src/lib/entraID/decorators/public.decorator.ts +0 -5
- package/src/lib/entraID/decorators/roles.decorator.ts +0 -5
- package/src/lib/entraID/entraID.constants.ts +0 -2
- package/src/lib/entraID/entraID.module.ts +0 -78
- package/src/lib/entraID/entraID.service.ts +0 -206
- package/src/lib/entraID/guards/entra-auth.guard.ts +0 -77
- package/src/lib/entraID/guards/roles.guard.ts +0 -34
- package/src/lib/entraID/interfaces/entraID-service.interface.ts +0 -12
- package/src/lib/entraID/internal-token/internal-token.module.ts +0 -8
- package/src/lib/entraID/internal-token/internal-token.service.ts +0 -66
- package/src/lib/entraID/microsoft/microsoft.module.ts +0 -8
- package/src/lib/entraID/microsoft/microsoft.service.ts +0 -158
- package/src/lib/entraID/security/security.module.ts +0 -8
- package/src/lib/entraID/security/security.service.ts +0 -68
- package/src/lib/entraID/types/entraID-module-init.types.ts +0 -25
- package/src/lib/entraID/types/entraID.type.ts +0 -57
- package/src/lib/entraID/utils/cookie.utils.ts +0 -50
- package/src/lib/entraID/utils/crypto.utils.ts +0 -53
- package/src/lib/entraID/utils/index.ts +0 -2
- package/src/lib/entraID/utils/token.utils.ts +0 -20
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prime-sdk",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.9",
|
|
4
4
|
"description": "swiss army knife",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -37,8 +37,6 @@
|
|
|
37
37
|
"@nestjs/platform-express": "^11.1.17",
|
|
38
38
|
"@smithy/node-http-handler": "^3.3.1",
|
|
39
39
|
"ioredis": "^5.4.1",
|
|
40
|
-
"jsonwebtoken": "^9.0.3",
|
|
41
|
-
"jwks-rsa": "^4.0.1",
|
|
42
40
|
"reflect-metadata": "^0.2.0",
|
|
43
41
|
"rxjs": "^7.8.1"
|
|
44
42
|
},
|
|
@@ -52,7 +50,6 @@
|
|
|
52
50
|
"@nestjs/testing": "^11.1.17",
|
|
53
51
|
"@types/express": "^4.17.17",
|
|
54
52
|
"@types/jest": "^29.5.2",
|
|
55
|
-
"@types/jsonwebtoken": "^9.0.10",
|
|
56
53
|
"@types/node": "^20.3.1",
|
|
57
54
|
"@types/supertest": "^6.0.0",
|
|
58
55
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
@@ -24,6 +24,9 @@ import {
|
|
|
24
24
|
ListFiles,
|
|
25
25
|
UploadFile,
|
|
26
26
|
} from '../../../lib/storage/types/storage.type';
|
|
27
|
+
import { Readable } from 'stream';
|
|
28
|
+
|
|
29
|
+
const PRESIGNED_PUT_EXPIRES_IN_SECONDS = 3600;
|
|
27
30
|
|
|
28
31
|
@Injectable()
|
|
29
32
|
export class S3 implements IStorage {
|
|
@@ -34,6 +37,7 @@ export class S3 implements IStorage {
|
|
|
34
37
|
Bucket: file.bucket,
|
|
35
38
|
Key: `${file.path}/${file.nameFile}`,
|
|
36
39
|
Body: file.file,
|
|
40
|
+
...(file.contentType && { ContentType: file.contentType }),
|
|
37
41
|
...(file.metadata && { Metadata: file.metadata }),
|
|
38
42
|
...(file.tagging && {
|
|
39
43
|
Tagging: file.tagging,
|
|
@@ -45,6 +49,72 @@ export class S3 implements IStorage {
|
|
|
45
49
|
return response;
|
|
46
50
|
}
|
|
47
51
|
|
|
52
|
+
async uploadFileViaPresignedUrl(file: UploadFile): Promise<void> {
|
|
53
|
+
const key = `${file.path}/${file.nameFile}`;
|
|
54
|
+
const contentType = file.contentType || 'application/octet-stream';
|
|
55
|
+
const body = await this.resolveFileBody(file.file);
|
|
56
|
+
|
|
57
|
+
const command = new PutObjectCommand({
|
|
58
|
+
Bucket: file.bucket,
|
|
59
|
+
Key: key,
|
|
60
|
+
ContentType: contentType,
|
|
61
|
+
...(file.metadata && { Metadata: file.metadata }),
|
|
62
|
+
...(file.tagging && { Tagging: file.tagging }),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const presignedUrl = await getSignedUrl(this.client, command, {
|
|
66
|
+
expiresIn: PRESIGNED_PUT_EXPIRES_IN_SECONDS,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const headers: Record<string, string> = {
|
|
70
|
+
'Content-Type': contentType,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
if (file.metadata) {
|
|
74
|
+
for (const [k, v] of Object.entries(file.metadata)) {
|
|
75
|
+
headers[`x-amz-meta-${k}`] = v;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (file.tagging) {
|
|
80
|
+
headers['x-amz-tagging'] = file.tagging;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const response = await fetch(presignedUrl, {
|
|
84
|
+
method: 'PUT',
|
|
85
|
+
headers,
|
|
86
|
+
body: new Uint8Array(body),
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`s3_presigned_upload_failed: ${response.status} ${response.statusText}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private async resolveFileBody(
|
|
97
|
+
file: string | Readable | Buffer,
|
|
98
|
+
): Promise<Buffer> {
|
|
99
|
+
if (Buffer.isBuffer(file)) {
|
|
100
|
+
return file;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (typeof file === 'string') {
|
|
104
|
+
return Buffer.from(file);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const chunks: Buffer[] = [];
|
|
108
|
+
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
file.on('data', (chunk) =>
|
|
111
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)),
|
|
112
|
+
);
|
|
113
|
+
file.on('end', () => resolve(Buffer.concat(chunks)));
|
|
114
|
+
file.on('error', reject);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
48
118
|
async generateSignUrlFile(file: GetFile): Promise<string> {
|
|
49
119
|
const params = {
|
|
50
120
|
Bucket: file.bucket,
|
package/src/index.ts
CHANGED
|
@@ -33,28 +33,6 @@ import {
|
|
|
33
33
|
TypeRedis,
|
|
34
34
|
PubSubRedis,
|
|
35
35
|
} from './external/redis/types/ioredis.types';
|
|
36
|
-
import { EntraIDModule, ENTRA_ID_CONFIG } from './lib/entraID/entraID.module';
|
|
37
|
-
import type { EntraIDModuleOptions } from './lib/entraID/entraID.module';
|
|
38
|
-
import { EntraIDService } from './lib/entraID/entraID.service';
|
|
39
|
-
import { EntraAuthGuard } from './lib/entraID/guards/entra-auth.guard';
|
|
40
|
-
import { RolesGuard } from './lib/entraID/guards/roles.guard';
|
|
41
|
-
import { InternalTokenService } from './lib/entraID/internal-token/internal-token.service';
|
|
42
|
-
import { CurrentUser } from './lib/entraID/decorators/current-user.decorator';
|
|
43
|
-
import { Public } from './lib/entraID/decorators/public.decorator';
|
|
44
|
-
import { Roles } from './lib/entraID/decorators/roles.decorator';
|
|
45
|
-
import { CookieUtils, TokenUtils } from './lib/entraID/utils';
|
|
46
|
-
import { SecurityService } from './lib/entraID/security/security.service';
|
|
47
|
-
import { EntraIDException } from './lib/entraID/customError/entraID.exception';
|
|
48
|
-
import type {
|
|
49
|
-
EntraUser,
|
|
50
|
-
AuthResult,
|
|
51
|
-
CallbackParams,
|
|
52
|
-
TokenEnrichmentContext,
|
|
53
|
-
} from './lib/entraID/types/entraID.type';
|
|
54
|
-
import type {
|
|
55
|
-
EntraIDSetup,
|
|
56
|
-
EntraIDAsyncOptions,
|
|
57
|
-
} from './lib/entraID/types/entraID-module-init.types';
|
|
58
36
|
|
|
59
37
|
import { SNSSetup } from './external/aws/sns/sns.provider';
|
|
60
38
|
|
|
@@ -86,24 +64,4 @@ export {
|
|
|
86
64
|
ClusterRedisSetup,
|
|
87
65
|
TypeRedis,
|
|
88
66
|
PubSubRedis,
|
|
89
|
-
EntraIDModule,
|
|
90
|
-
EntraIDModuleOptions,
|
|
91
|
-
ENTRA_ID_CONFIG,
|
|
92
|
-
EntraIDService,
|
|
93
|
-
EntraAuthGuard,
|
|
94
|
-
RolesGuard,
|
|
95
|
-
InternalTokenService,
|
|
96
|
-
CurrentUser,
|
|
97
|
-
Public,
|
|
98
|
-
Roles,
|
|
99
|
-
CookieUtils,
|
|
100
|
-
TokenUtils,
|
|
101
|
-
SecurityService,
|
|
102
|
-
EntraIDException,
|
|
103
|
-
EntraIDSetup,
|
|
104
|
-
EntraIDAsyncOptions,
|
|
105
|
-
EntraUser,
|
|
106
|
-
AuthResult,
|
|
107
|
-
CallbackParams,
|
|
108
|
-
TokenEnrichmentContext,
|
|
109
67
|
};
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
|
|
18
18
|
export interface IStorage {
|
|
19
19
|
uploadFile(file: UploadFile): Promise<PutObjectCommandOutput>;
|
|
20
|
+
uploadFileViaPresignedUrl(file: UploadFile): Promise<void>;
|
|
20
21
|
generateSignUrlFile(file: GetFile): Promise<string>;
|
|
21
22
|
getFile(file: GetFile): Promise<GetObjectCommandOutput>;
|
|
22
23
|
listFiles(data: ListFiles): Promise<ListObjectsV2CommandOutput>;
|
|
@@ -26,6 +26,10 @@ export class Storage {
|
|
|
26
26
|
return this.storage.uploadFile(file);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
async uploadFileViaPresignedUrl(file: UploadFile): Promise<void> {
|
|
30
|
+
return this.storage.uploadFileViaPresignedUrl(file);
|
|
31
|
+
}
|
|
32
|
+
|
|
29
33
|
async generateSignUrlFile(file: GetFile): Promise<string> {
|
|
30
34
|
return this.storage.generateSignUrlFile(file);
|
|
31
35
|
}
|
package/tsconfig.json
CHANGED
package/.yarn/install-state.gz
DELETED
|
Binary file
|
package/.yarnrc.yml
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
nodeLinker: node-modules
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EntraIDException = void 0;
|
|
4
|
-
const entraIDErrorMessages = {
|
|
5
|
-
INVALID_CONFIG: 'Configuração inválida do módulo EntraID',
|
|
6
|
-
TENANT_NOT_FOUND: 'Tenant não encontrado na configuração do EntraID',
|
|
7
|
-
INVALID_SECRET: 'Em Produção é necessário um secret válido',
|
|
8
|
-
STATE_MISMATCH: 'State OAuth inválido ou expirado',
|
|
9
|
-
TOKEN_INVALID_HEADER: 'Header da chave publica inválido',
|
|
10
|
-
PAYLOAD_ID_TOKEN_INVALID: 'Payload decodificado é inválido',
|
|
11
|
-
INVALID_NONCE: 'Nonce retornado é diferente do esperado',
|
|
12
|
-
CODE_EXCHANGE_FAILED: 'Falha ao trocar o código de autorização pelo token',
|
|
13
|
-
TOKEN_EXPIRED: 'Token de acesso expirado',
|
|
14
|
-
TOKEN_INVALID: 'Token de acesso inválido',
|
|
15
|
-
RESERVED_CLAIM_OVERRIDE: 'enrichTokenPayload tentou sobrescrever um claim reservado (sub/iss/aud/exp/iat/nbf/jti/groups)',
|
|
16
|
-
TOKEN_AUDIENCE_INVALID: 'Audience do token não corresponde ao esperado',
|
|
17
|
-
JWKS_FETCH_FAILED: 'Falha ao buscar chaves públicas do Azure',
|
|
18
|
-
JWKS_KEY_NOT_FOUND: 'Chave pública não encontrada no JWKS',
|
|
19
|
-
GRAPH_FETCH_FAILED: 'Falha ao buscar dados do usuário no Microsoft Graph',
|
|
20
|
-
GRAPH_USER_NOT_FOUND: 'Usuário não encontrado no Microsoft Entra ID',
|
|
21
|
-
SECURITY_PATH_TRAVERSAL: 'Tentativa de path traversal detectada',
|
|
22
|
-
SECURITY_NULL_BYTE: 'Caractere nulo detectado na entrada',
|
|
23
|
-
SECURITY_INVALID_CHARS: 'Caracteres inválidos ou perigosos na entrada',
|
|
24
|
-
SECURITY_OPEN_REDIRECT: 'Redirecionamento para URL não autorizada',
|
|
25
|
-
SECURITY_INVALID_URL: 'URL inválida',
|
|
26
|
-
OAUTH_PROVIDER_ERROR: 'Erro retornado pelo provedor OAuth',
|
|
27
|
-
OAUTH_MISSING_PARAMS: 'Parâmetros obrigatórios ausentes no callback OAuth',
|
|
28
|
-
REFRESH_TOKEN_FAILED: 'Falha ao renovar o token de acesso',
|
|
29
|
-
REVOKE_SESSIONS_FAILED: 'Falha ao revogar sessões do usuário no Microsoft Entra ID',
|
|
30
|
-
UNKNOWN_ERROR: 'Erro desconhecido',
|
|
31
|
-
};
|
|
32
|
-
class EntraIDException extends Error {
|
|
33
|
-
constructor(code) {
|
|
34
|
-
const message = entraIDErrorMessages[code] ?? entraIDErrorMessages['UNKNOWN_ERROR'];
|
|
35
|
-
super(message);
|
|
36
|
-
this.code = code;
|
|
37
|
-
this.message = message;
|
|
38
|
-
this.name = 'EntraIDException';
|
|
39
|
-
Object.setPrototypeOf(this, EntraIDException.prototype);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
exports.EntraIDException = EntraIDException;
|
|
43
|
-
//# sourceMappingURL=entraID.exception.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entraID.exception.js","sourceRoot":"","sources":["../../../../src/lib/entraID/customError/entraID.exception.ts"],"names":[],"mappings":";;;AAAA,MAAM,oBAAoB,GAA2B;IACnD,cAAc,EAAE,yCAAyC;IACzD,gBAAgB,EAAE,kDAAkD;IACpE,cAAc,EAAE,2CAA2C;IAC3D,cAAc,EAAE,kCAAkC;IAClD,oBAAoB,EAAE,kCAAkC;IACxD,wBAAwB,EAAE,iCAAiC;IAC3D,aAAa,EAAE,yCAAyC;IACxD,oBAAoB,EAAE,oDAAoD;IAC1E,aAAa,EAAE,0BAA0B;IACzC,aAAa,EAAE,0BAA0B;IACzC,uBAAuB,EACrB,gGAAgG;IAClG,sBAAsB,EAAE,+CAA+C;IACvE,iBAAiB,EAAE,0CAA0C;IAC7D,kBAAkB,EAAE,sCAAsC;IAC1D,kBAAkB,EAAE,qDAAqD;IACzE,oBAAoB,EAAE,8CAA8C;IACpE,uBAAuB,EAAE,uCAAuC;IAChE,kBAAkB,EAAE,qCAAqC;IACzD,sBAAsB,EAAE,8CAA8C;IACtE,sBAAsB,EAAE,0CAA0C;IAClE,oBAAoB,EAAE,cAAc;IACpC,oBAAoB,EAAE,oCAAoC;IAC1D,oBAAoB,EAAE,oDAAoD;IAC1E,oBAAoB,EAAE,oCAAoC;IAC1D,sBAAsB,EACpB,2DAA2D;IAC7D,aAAa,EAAE,mBAAmB;CACnC,CAAC;AAEF,MAAa,gBAAiB,SAAQ,KAAK;IAGzC,YAA4B,IAAY;QACtC,MAAM,OAAO,GACX,oBAAoB,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC;QAHW,SAAI,GAAJ,IAAI,CAAQ;QAItC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF;AAXD,4CAWC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const CurrentUser: <T = Record<string, unknown>>(...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CurrentUser = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.CurrentUser = (0, common_1.createParamDecorator)((_data, ctx) => {
|
|
6
|
-
const request = ctx.switchToHttp().getRequest();
|
|
7
|
-
return request.user;
|
|
8
|
-
});
|
|
9
|
-
//# sourceMappingURL=current-user.decorator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"current-user.decorator.js","sourceRoot":"","sources":["../../../../src/lib/entraID/decorators/current-user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAE3D,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAA8B,KAAc,EAAE,GAAqB,EAAK,EAAE;IACxE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,IAAS,CAAC;AAC3B,CAAC,CACF,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Public = exports.IS_PUBLIC_KEY = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.IS_PUBLIC_KEY = 'isPublic';
|
|
6
|
-
const Public = () => (0, common_1.SetMetadata)(exports.IS_PUBLIC_KEY, true);
|
|
7
|
-
exports.Public = Public;
|
|
8
|
-
//# sourceMappingURL=public.decorator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"public.decorator.js","sourceRoot":"","sources":["../../../../src/lib/entraID/decorators/public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,aAAa,GAAG,UAAU,CAAC;AAEjC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,qBAAa,EAAE,IAAI,CAAC,CAAC;AAAhD,QAAA,MAAM,UAA0C"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Roles = exports.ROLES_KEY = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.ROLES_KEY = 'roles';
|
|
6
|
-
const Roles = (...roles) => (0, common_1.SetMetadata)(exports.ROLES_KEY, roles);
|
|
7
|
-
exports.Roles = Roles;
|
|
8
|
-
//# sourceMappingURL=roles.decorator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles.decorator.js","sourceRoot":"","sources":["../../../../src/lib/entraID/decorators/roles.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,iBAAS,EAAE,KAAK,CAAC,CAAC;AAA9D,QAAA,KAAK,SAAyD"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MICROSOFT_AUTHORITY_URL = exports.ENTRA_ID_CONFIG = void 0;
|
|
4
|
-
exports.ENTRA_ID_CONFIG = 'ENTRA_ID_CONFIG';
|
|
5
|
-
exports.MICROSOFT_AUTHORITY_URL = 'https://login.microsoftonline.com';
|
|
6
|
-
//# sourceMappingURL=entraID.constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entraID.constants.js","sourceRoot":"","sources":["../../../src/lib/entraID/entraID.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,iBAAiB,CAAC;AACpC,QAAA,uBAAuB,GAAG,mCAAmC,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, ModuleMetadata, Type } from '@nestjs/common';
|
|
2
|
-
import { InternalTokenService } from './internal-token/internal-token.service';
|
|
3
|
-
import { ENTRA_ID_CONFIG } from './entraID.constants';
|
|
4
|
-
import { EntraIDAsyncOptions, EntraIDSetup } from './types/entraID-module-init.types';
|
|
5
|
-
export { ENTRA_ID_CONFIG };
|
|
6
|
-
export type EntraIDModuleOptions = {
|
|
7
|
-
internalTokenService?: Type<InternalTokenService>;
|
|
8
|
-
imports?: ModuleMetadata['imports'];
|
|
9
|
-
};
|
|
10
|
-
export declare class EntraIDModule {
|
|
11
|
-
private static buildModule;
|
|
12
|
-
static forRoot(params: EntraIDSetup, options?: EntraIDModuleOptions): DynamicModule;
|
|
13
|
-
static forRootAsync(paramsAsync: EntraIDAsyncOptions, options?: EntraIDModuleOptions): DynamicModule;
|
|
14
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
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 EntraIDModule_1;
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.EntraIDModule = exports.ENTRA_ID_CONFIG = void 0;
|
|
11
|
-
const common_1 = require("@nestjs/common");
|
|
12
|
-
const entraID_service_1 = require("./entraID.service");
|
|
13
|
-
const entra_auth_guard_1 = require("./guards/entra-auth.guard");
|
|
14
|
-
const internal_token_service_1 = require("./internal-token/internal-token.service");
|
|
15
|
-
const microsoft_module_1 = require("./microsoft/microsoft.module");
|
|
16
|
-
const security_module_1 = require("./security/security.module");
|
|
17
|
-
const entraID_constants_1 = require("./entraID.constants");
|
|
18
|
-
Object.defineProperty(exports, "ENTRA_ID_CONFIG", { enumerable: true, get: function () { return entraID_constants_1.ENTRA_ID_CONFIG; } });
|
|
19
|
-
let EntraIDModule = EntraIDModule_1 = class EntraIDModule {
|
|
20
|
-
static buildModule(configProvider, imports = [], options = {}) {
|
|
21
|
-
const tokenServiceClass = options.internalTokenService ?? internal_token_service_1.InternalTokenService;
|
|
22
|
-
return {
|
|
23
|
-
global: true,
|
|
24
|
-
module: EntraIDModule_1,
|
|
25
|
-
imports: [...imports, ...(options.imports ?? []), microsoft_module_1.MicrosoftModule, security_module_1.SecurityModule],
|
|
26
|
-
providers: [
|
|
27
|
-
configProvider,
|
|
28
|
-
tokenServiceClass,
|
|
29
|
-
{ provide: internal_token_service_1.InternalTokenService, useExisting: tokenServiceClass },
|
|
30
|
-
entraID_service_1.EntraIDService,
|
|
31
|
-
entra_auth_guard_1.EntraAuthGuard,
|
|
32
|
-
],
|
|
33
|
-
exports: [
|
|
34
|
-
entraID_constants_1.ENTRA_ID_CONFIG,
|
|
35
|
-
internal_token_service_1.InternalTokenService,
|
|
36
|
-
entraID_service_1.EntraIDService,
|
|
37
|
-
entra_auth_guard_1.EntraAuthGuard,
|
|
38
|
-
],
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
static forRoot(params, options) {
|
|
42
|
-
return this.buildModule({ provide: entraID_constants_1.ENTRA_ID_CONFIG, useValue: params }, [], options);
|
|
43
|
-
}
|
|
44
|
-
static forRootAsync(paramsAsync, options) {
|
|
45
|
-
return this.buildModule({
|
|
46
|
-
provide: entraID_constants_1.ENTRA_ID_CONFIG,
|
|
47
|
-
useFactory: paramsAsync.useFactory,
|
|
48
|
-
inject: paramsAsync.inject ?? [],
|
|
49
|
-
}, paramsAsync.imports ?? [], options);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
exports.EntraIDModule = EntraIDModule;
|
|
53
|
-
exports.EntraIDModule = EntraIDModule = EntraIDModule_1 = __decorate([
|
|
54
|
-
(0, common_1.Module)({})
|
|
55
|
-
], EntraIDModule);
|
|
56
|
-
//# sourceMappingURL=entraID.module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entraID.module.js","sourceRoot":"","sources":["../../../src/lib/entraID/entraID.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAMwB;AACxB,uDAAmD;AACnD,gEAA2D;AAC3D,oFAA+E;AAC/E,mEAA+D;AAC/D,gEAA4D;AAC5D,2DAAsD;AAM7C,gGANA,mCAAe,OAMA;AAQjB,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAChB,MAAM,CAAC,WAAW,CACxB,cAAwB,EACxB,UAAqC,EAAE,EACvC,UAAgC,EAAE;QAElC,MAAM,iBAAiB,GACrB,OAAO,CAAC,oBAAoB,IAAI,6CAAoB,CAAC;QAEvD,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,kCAAe,EAAE,gCAAc,CAAC;YAClF,SAAS,EAAE;gBACT,cAAc;gBACd,iBAAiB;gBACjB,EAAE,OAAO,EAAE,6CAAoB,EAAE,WAAW,EAAE,iBAAiB,EAAE;gBACjE,gCAAc;gBACd,iCAAc;aACf;YACD,OAAO,EAAE;gBACP,mCAAe;gBACf,6CAAoB;gBACpB,gCAAc;gBACd,iCAAc;aACf;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,MAAoB,EAAE,OAA8B;QACjE,OAAO,IAAI,CAAC,WAAW,CACrB,EAAE,OAAO,EAAE,mCAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC9C,EAAE,EACF,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,WAAgC,EAChC,OAA8B;QAE9B,OAAO,IAAI,CAAC,WAAW,CACrB;YACE,OAAO,EAAE,mCAAe;YACxB,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE;SACjC,EACD,WAAW,CAAC,OAAO,IAAI,EAAE,EACzB,OAAO,CACR,CAAC;IACJ,CAAC;CACF,CAAA;AAnDY,sCAAa;wBAAb,aAAa;IADzB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,aAAa,CAmDzB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
-
import { InternalTokenService } from './internal-token/internal-token.service';
|
|
3
|
-
import { MicrosoftService } from './microsoft/microsoft.service';
|
|
4
|
-
import { SecurityService } from './security/security.service';
|
|
5
|
-
import { AuthResult, CallbackParams, CreateStateNonce, EntraUser, IdTokenPayload, UrlRedirectSso } from './types/entraID.type';
|
|
6
|
-
import { EntraIDSetup } from './types/entraID-module-init.types';
|
|
7
|
-
import { IEntraIDService } from './interfaces/entraID-service.interface';
|
|
8
|
-
export declare class EntraIDService implements OnModuleInit, IEntraIDService {
|
|
9
|
-
protected readonly config: EntraIDSetup;
|
|
10
|
-
protected readonly microsoftService: MicrosoftService;
|
|
11
|
-
protected readonly securityService: SecurityService;
|
|
12
|
-
protected readonly internalTokenService: InternalTokenService;
|
|
13
|
-
private jwksClientRsa;
|
|
14
|
-
constructor(config: EntraIDSetup, microsoftService: MicrosoftService, securityService: SecurityService, internalTokenService: InternalTokenService);
|
|
15
|
-
onModuleInit(): void;
|
|
16
|
-
handleCallback(params: CallbackParams): Promise<AuthResult>;
|
|
17
|
-
refresh(refreshToken: string): Promise<AuthResult>;
|
|
18
|
-
logout(userId: string): Promise<void>;
|
|
19
|
-
initiateLogin(): Promise<UrlRedirectSso>;
|
|
20
|
-
decodeLocalToken(token: string): EntraUser;
|
|
21
|
-
protected verifyIdToken(idToken: string, nonce: string): Promise<IdTokenPayload>;
|
|
22
|
-
protected buildUserJwt(accessToken: string, email: string, name: string): Promise<AuthResult>;
|
|
23
|
-
protected createSignedState(): CreateStateNonce;
|
|
24
|
-
protected verifyStateAndReturnNonce(state: string): string;
|
|
25
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
-
};
|
|
17
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.EntraIDService = void 0;
|
|
19
|
-
const common_1 = require("@nestjs/common");
|
|
20
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
21
|
-
const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
|
|
22
|
-
const entraID_constants_1 = require("./entraID.constants");
|
|
23
|
-
const internal_token_service_1 = require("./internal-token/internal-token.service");
|
|
24
|
-
const microsoft_service_1 = require("./microsoft/microsoft.service");
|
|
25
|
-
const security_service_1 = require("./security/security.service");
|
|
26
|
-
const entraID_exception_1 = require("./customError/entraID.exception");
|
|
27
|
-
const crypto_utils_1 = require("./utils/crypto.utils");
|
|
28
|
-
const STATE_TTL_MS = 600_000;
|
|
29
|
-
let EntraIDService = class EntraIDService {
|
|
30
|
-
constructor(config, microsoftService, securityService, internalTokenService) {
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.microsoftService = microsoftService;
|
|
33
|
-
this.securityService = securityService;
|
|
34
|
-
this.internalTokenService = internalTokenService;
|
|
35
|
-
}
|
|
36
|
-
onModuleInit() {
|
|
37
|
-
const { tenantID, clientID, clientSecret, stateSecret, redirectUri } = this.config;
|
|
38
|
-
if (!tenantID ||
|
|
39
|
-
!clientID ||
|
|
40
|
-
!clientSecret ||
|
|
41
|
-
!stateSecret ||
|
|
42
|
-
!redirectUri) {
|
|
43
|
-
throw new entraID_exception_1.EntraIDException('INVALID_CONFIG');
|
|
44
|
-
}
|
|
45
|
-
const authorityUrl = this.config.authorityUrl ?? entraID_constants_1.MICROSOFT_AUTHORITY_URL;
|
|
46
|
-
this.jwksClientRsa = (0, jwks_rsa_1.default)({
|
|
47
|
-
jwksUri: `${authorityUrl}/${tenantID}/discovery/v2.0/keys`,
|
|
48
|
-
cache: true,
|
|
49
|
-
cacheMaxAge: 10 * 60 * 1000,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
async handleCallback(params) {
|
|
53
|
-
this.securityService.validateCallbackParams(params);
|
|
54
|
-
const nonce = this.verifyStateAndReturnNonce(params.state);
|
|
55
|
-
const tokens = await this.microsoftService.exchangeCode(params.code);
|
|
56
|
-
const payload = await this.verifyIdToken(tokens.id_token, nonce);
|
|
57
|
-
const email = payload.preferred_username ?? payload.email ?? payload.upn;
|
|
58
|
-
if (!email) {
|
|
59
|
-
throw new entraID_exception_1.EntraIDException('PAYLOAD_ID_TOKEN_INVALID');
|
|
60
|
-
}
|
|
61
|
-
const result = await this.buildUserJwt(tokens.access_token, email, payload.name);
|
|
62
|
-
return { ...result, refreshToken: tokens.refresh_token };
|
|
63
|
-
}
|
|
64
|
-
async refresh(refreshToken) {
|
|
65
|
-
const tokens = await this.microsoftService.refreshToken(refreshToken);
|
|
66
|
-
const result = await this.buildUserJwt(tokens.access_token, '', '');
|
|
67
|
-
return { ...result, refreshToken: tokens.refresh_token };
|
|
68
|
-
}
|
|
69
|
-
async logout(userId) {
|
|
70
|
-
await this.microsoftService.revokeUserSessions(userId);
|
|
71
|
-
}
|
|
72
|
-
async initiateLogin() {
|
|
73
|
-
const { state, nonce } = this.createSignedState();
|
|
74
|
-
const { clientID, redirectUri, tenantID, scope, prompt } = this.config;
|
|
75
|
-
const authorityUrl = this.config.authorityUrl ?? entraID_constants_1.MICROSOFT_AUTHORITY_URL;
|
|
76
|
-
const params = new URLSearchParams({
|
|
77
|
-
client_id: clientID,
|
|
78
|
-
response_type: 'code',
|
|
79
|
-
redirect_uri: redirectUri,
|
|
80
|
-
response_mode: 'form_post',
|
|
81
|
-
scope: scope ?? 'openid profile email User.Read GroupMember.Read.All',
|
|
82
|
-
state,
|
|
83
|
-
nonce,
|
|
84
|
-
prompt: prompt ?? 'select_account',
|
|
85
|
-
});
|
|
86
|
-
return `${authorityUrl}/${tenantID}/oauth2/v2.0/authorize?${params.toString()}`;
|
|
87
|
-
}
|
|
88
|
-
decodeLocalToken(token) {
|
|
89
|
-
return this.internalTokenService.verify(token);
|
|
90
|
-
}
|
|
91
|
-
async verifyIdToken(idToken, nonce) {
|
|
92
|
-
const decoded = jsonwebtoken_1.default.decode(idToken, { complete: true });
|
|
93
|
-
if (!decoded?.header) {
|
|
94
|
-
throw new entraID_exception_1.EntraIDException('TOKEN_INVALID_HEADER');
|
|
95
|
-
}
|
|
96
|
-
const publicKey = await crypto_utils_1.CryptoUtils.getPublicKeyRsa(decoded.header.kid, this.jwksClientRsa);
|
|
97
|
-
const expectedIssuers = [
|
|
98
|
-
`https://login.microsoftonline.com/${this.config.tenantID}/v2.0`,
|
|
99
|
-
`https://sts.windows.net/${this.config.tenantID}/`,
|
|
100
|
-
];
|
|
101
|
-
const payload = jsonwebtoken_1.default.verify(idToken, publicKey, {
|
|
102
|
-
algorithms: ['RS256'],
|
|
103
|
-
audience: this.config.clientID,
|
|
104
|
-
issuer: expectedIssuers,
|
|
105
|
-
});
|
|
106
|
-
if (payload.nonce !== nonce) {
|
|
107
|
-
throw new entraID_exception_1.EntraIDException('INVALID_NONCE');
|
|
108
|
-
}
|
|
109
|
-
return payload;
|
|
110
|
-
}
|
|
111
|
-
async buildUserJwt(accessToken, email, name) {
|
|
112
|
-
const msUser = await this.microsoftService.getMe(accessToken);
|
|
113
|
-
let groups = [];
|
|
114
|
-
try {
|
|
115
|
-
const raw = await this.microsoftService.getMemberOf(accessToken);
|
|
116
|
-
groups = raw.filter((g) => !!g.displayName);
|
|
117
|
-
}
|
|
118
|
-
catch { }
|
|
119
|
-
const user = {
|
|
120
|
-
entraId: msUser.id,
|
|
121
|
-
email: msUser.mail ?? msUser.userPrincipalName ?? email,
|
|
122
|
-
name: msUser.displayName ?? name,
|
|
123
|
-
tenantId: this.config.tenantID,
|
|
124
|
-
matricula: msUser.employeeId,
|
|
125
|
-
groups,
|
|
126
|
-
};
|
|
127
|
-
const token = await this.internalTokenService.sign({ user, accessToken });
|
|
128
|
-
return { token, user };
|
|
129
|
-
}
|
|
130
|
-
createSignedState() {
|
|
131
|
-
const { stateSecret } = this.config;
|
|
132
|
-
const nonce = crypto_utils_1.CryptoUtils.generateHash();
|
|
133
|
-
const payload = Buffer.from(JSON.stringify({ nonce, ts: Date.now() })).toString('base64url');
|
|
134
|
-
const state = crypto_utils_1.CryptoUtils.createSignedPayloadWithHMAC(payload, stateSecret);
|
|
135
|
-
return { nonce, state };
|
|
136
|
-
}
|
|
137
|
-
verifyStateAndReturnNonce(state) {
|
|
138
|
-
const { stateSecret } = this.config;
|
|
139
|
-
const parts = state.split('.');
|
|
140
|
-
crypto_utils_1.CryptoUtils.verifyPayloadWithHMAC(parts, stateSecret);
|
|
141
|
-
const payload = parts[0];
|
|
142
|
-
let nonce;
|
|
143
|
-
let ts;
|
|
144
|
-
try {
|
|
145
|
-
const parsed = JSON.parse(Buffer.from(payload, 'base64url').toString());
|
|
146
|
-
nonce = parsed.nonce;
|
|
147
|
-
ts = parsed.ts;
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
throw new entraID_exception_1.EntraIDException('STATE_MISMATCH');
|
|
151
|
-
}
|
|
152
|
-
if (Date.now() - ts > STATE_TTL_MS) {
|
|
153
|
-
throw new entraID_exception_1.EntraIDException('STATE_MISMATCH');
|
|
154
|
-
}
|
|
155
|
-
return nonce;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
exports.EntraIDService = EntraIDService;
|
|
159
|
-
exports.EntraIDService = EntraIDService = __decorate([
|
|
160
|
-
(0, common_1.Injectable)(),
|
|
161
|
-
__param(0, (0, common_1.Inject)(entraID_constants_1.ENTRA_ID_CONFIG)),
|
|
162
|
-
__metadata("design:paramtypes", [Object, microsoft_service_1.MicrosoftService,
|
|
163
|
-
security_service_1.SecurityService,
|
|
164
|
-
internal_token_service_1.InternalTokenService])
|
|
165
|
-
], EntraIDService);
|
|
166
|
-
//# sourceMappingURL=entraID.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entraID.service.js","sourceRoot":"","sources":["../../../src/lib/entraID/entraID.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
-
import type { Request } from 'express';
|
|
3
|
-
import { InternalTokenService } from '../internal-token/internal-token.service';
|
|
4
|
-
import { EntraUser } from '../types/entraID.type';
|
|
5
|
-
import { Reflector } from '@nestjs/core';
|
|
6
|
-
export declare class EntraAuthGuard implements CanActivate {
|
|
7
|
-
private readonly internalTokenService;
|
|
8
|
-
private readonly reflector;
|
|
9
|
-
constructor(internalTokenService: InternalTokenService, reflector: Reflector);
|
|
10
|
-
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
11
|
-
protected isTokenRevoked(_payload: EntraUser, _request: Request): Promise<boolean>;
|
|
12
|
-
protected transformPayload(payload: EntraUser): Promise<unknown>;
|
|
13
|
-
protected extractToken(request: {
|
|
14
|
-
headers: {
|
|
15
|
-
authorization?: string;
|
|
16
|
-
};
|
|
17
|
-
cookies?: {
|
|
18
|
-
auth_token?: string;
|
|
19
|
-
};
|
|
20
|
-
}): string | undefined;
|
|
21
|
-
}
|