prime-sdk 3.0.7 → 3.0.9-beta.0
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 +4 -0
- package/.yarn/install-state.gz +0 -0
- package/README.md +307 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/entraID/customError/entraID.exception.d.ts +5 -0
- package/dist/lib/entraID/customError/entraID.exception.js +43 -0
- package/dist/lib/entraID/customError/entraID.exception.js.map +1 -0
- package/dist/lib/entraID/decorators/current-user.decorator.d.ts +1 -0
- package/dist/lib/entraID/decorators/current-user.decorator.js +9 -0
- package/dist/lib/entraID/decorators/current-user.decorator.js.map +1 -0
- package/dist/lib/entraID/decorators/public.decorator.d.ts +2 -0
- package/dist/lib/entraID/decorators/public.decorator.js +8 -0
- package/dist/lib/entraID/decorators/public.decorator.js.map +1 -0
- package/dist/lib/entraID/decorators/roles.decorator.d.ts +2 -0
- package/dist/lib/entraID/decorators/roles.decorator.js +8 -0
- package/dist/lib/entraID/decorators/roles.decorator.js.map +1 -0
- package/dist/lib/entraID/entraID.constants.d.ts +2 -0
- package/dist/lib/entraID/entraID.constants.js +6 -0
- package/dist/lib/entraID/entraID.constants.js.map +1 -0
- package/dist/lib/entraID/entraID.module.d.ts +14 -0
- package/dist/lib/entraID/entraID.module.js +56 -0
- package/dist/lib/entraID/entraID.module.js.map +1 -0
- package/dist/lib/entraID/entraID.service.d.ts +25 -0
- package/dist/lib/entraID/entraID.service.js +166 -0
- package/dist/lib/entraID/entraID.service.js.map +1 -0
- package/dist/lib/entraID/guards/entra-auth.guard.d.ts +21 -0
- package/dist/lib/entraID/guards/entra-auth.guard.js +70 -0
- package/dist/lib/entraID/guards/entra-auth.guard.js.map +1 -0
- package/dist/lib/entraID/guards/roles.guard.d.ts +7 -0
- package/dist/lib/entraID/guards/roles.guard.js +41 -0
- package/dist/lib/entraID/guards/roles.guard.js.map +1 -0
- package/dist/lib/entraID/interfaces/entraID-service.interface.d.ts +7 -0
- package/dist/lib/entraID/interfaces/entraID-service.interface.js +3 -0
- package/dist/lib/entraID/interfaces/entraID-service.interface.js.map +1 -0
- package/dist/lib/entraID/internal-token/internal-token.module.d.ts +2 -0
- package/dist/lib/entraID/internal-token/internal-token.module.js +21 -0
- package/dist/lib/entraID/internal-token/internal-token.module.js.map +1 -0
- package/dist/lib/entraID/internal-token/internal-token.service.d.ts +10 -0
- package/dist/lib/entraID/internal-token/internal-token.service.js +76 -0
- package/dist/lib/entraID/internal-token/internal-token.service.js.map +1 -0
- package/dist/lib/entraID/microsoft/microsoft.module.d.ts +2 -0
- package/dist/lib/entraID/microsoft/microsoft.module.js +21 -0
- package/dist/lib/entraID/microsoft/microsoft.module.js.map +1 -0
- package/dist/lib/entraID/microsoft/microsoft.service.d.ts +14 -0
- package/dist/lib/entraID/microsoft/microsoft.service.js +132 -0
- package/dist/lib/entraID/microsoft/microsoft.service.js.map +1 -0
- package/dist/lib/entraID/security/security.module.d.ts +2 -0
- package/dist/lib/entraID/security/security.module.js +21 -0
- package/dist/lib/entraID/security/security.module.js.map +1 -0
- package/dist/lib/entraID/security/security.service.d.ts +9 -0
- package/dist/lib/entraID/security/security.service.js +65 -0
- package/dist/lib/entraID/security/security.service.js.map +1 -0
- package/dist/lib/entraID/types/entraID-module-init.types.d.ts +18 -0
- package/dist/lib/entraID/types/entraID-module-init.types.js +3 -0
- package/dist/lib/entraID/types/entraID-module-init.types.js.map +1 -0
- package/dist/lib/entraID/types/entraID.type.d.ts +55 -0
- package/dist/lib/entraID/types/entraID.type.js +3 -0
- package/dist/lib/entraID/types/entraID.type.js.map +1 -0
- package/dist/lib/entraID/utils/cookie.utils.d.ts +8 -0
- package/dist/lib/entraID/utils/cookie.utils.js +46 -0
- package/dist/lib/entraID/utils/cookie.utils.js.map +1 -0
- package/dist/lib/entraID/utils/crypto.utils.d.ts +9 -0
- package/dist/lib/entraID/utils/crypto.utils.js +47 -0
- package/dist/lib/entraID/utils/crypto.utils.js.map +1 -0
- package/dist/lib/entraID/utils/index.d.ts +2 -0
- package/dist/lib/entraID/utils/index.js +8 -0
- package/dist/lib/entraID/utils/index.js.map +1 -0
- package/dist/lib/entraID/utils/token.utils.d.ts +6 -0
- package/dist/lib/entraID/utils/token.utils.js +24 -0
- package/dist/lib/entraID/utils/token.utils.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -1
- package/src/index.ts +44 -0
- package/src/lib/entraID/customError/entraID.exception.ts +43 -0
- package/src/lib/entraID/decorators/current-user.decorator.ts +8 -0
- package/src/lib/entraID/decorators/public.decorator.ts +5 -0
- package/src/lib/entraID/decorators/roles.decorator.ts +5 -0
- package/src/lib/entraID/entraID.constants.ts +2 -0
- package/src/lib/entraID/entraID.module.ts +78 -0
- package/src/lib/entraID/entraID.service.ts +206 -0
- package/src/lib/entraID/guards/entra-auth.guard.ts +77 -0
- package/src/lib/entraID/guards/roles.guard.ts +34 -0
- package/src/lib/entraID/interfaces/entraID-service.interface.ts +12 -0
- package/src/lib/entraID/internal-token/internal-token.module.ts +8 -0
- package/src/lib/entraID/internal-token/internal-token.service.ts +66 -0
- package/src/lib/entraID/microsoft/microsoft.module.ts +8 -0
- package/src/lib/entraID/microsoft/microsoft.service.ts +158 -0
- package/src/lib/entraID/security/security.module.ts +8 -0
- package/src/lib/entraID/security/security.service.ts +68 -0
- package/src/lib/entraID/types/entraID-module-init.types.ts +25 -0
- package/src/lib/entraID/types/entraID.type.ts +61 -0
- package/src/lib/entraID/utils/cookie.utils.ts +60 -0
- package/src/lib/entraID/utils/crypto.utils.ts +53 -0
- package/src/lib/entraID/utils/index.ts +2 -0
- package/src/lib/entraID/utils/token.utils.ts +20 -0
- package/tsconfig.json +1 -0
- package/.vscode/settings.json +0 -4
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MicrosoftService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const entraID_exception_1 = require("../customError/entraID.exception");
|
|
18
|
+
const entraID_constants_1 = require("../entraID.constants");
|
|
19
|
+
const GRAPH_BASE = 'https://graph.microsoft.com/v1.0';
|
|
20
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
21
|
+
let MicrosoftService = class MicrosoftService {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
}
|
|
25
|
+
async exchangeCode(code) {
|
|
26
|
+
const body = new URLSearchParams({
|
|
27
|
+
client_id: this.config.clientID,
|
|
28
|
+
client_secret: this.config.clientSecret,
|
|
29
|
+
code,
|
|
30
|
+
redirect_uri: this.config.redirectUri,
|
|
31
|
+
grant_type: 'authorization_code',
|
|
32
|
+
scope: this.config.scope ??
|
|
33
|
+
'openid profile email User.Read GroupMember.Read.All',
|
|
34
|
+
});
|
|
35
|
+
const authorityUrl = this.config.authorityUrl ?? entraID_constants_1.MICROSOFT_AUTHORITY_URL;
|
|
36
|
+
const response = await fetch(`${authorityUrl}/${this.config.tenantID}/oauth2/v2.0/token`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
39
|
+
body: body.toString(),
|
|
40
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok)
|
|
43
|
+
throw new entraID_exception_1.EntraIDException('CODE_EXCHANGE_FAILED');
|
|
44
|
+
const tokens = (await response.json());
|
|
45
|
+
if (!tokens.access_token || !tokens.id_token) {
|
|
46
|
+
throw new entraID_exception_1.EntraIDException('CODE_EXCHANGE_FAILED');
|
|
47
|
+
}
|
|
48
|
+
return tokens;
|
|
49
|
+
}
|
|
50
|
+
async refreshToken(refreshToken) {
|
|
51
|
+
const body = new URLSearchParams({
|
|
52
|
+
client_id: this.config.clientID,
|
|
53
|
+
client_secret: this.config.clientSecret,
|
|
54
|
+
refresh_token: refreshToken,
|
|
55
|
+
grant_type: 'refresh_token',
|
|
56
|
+
});
|
|
57
|
+
const authorityUrl = this.config.authorityUrl ?? entraID_constants_1.MICROSOFT_AUTHORITY_URL;
|
|
58
|
+
const response = await fetch(`${authorityUrl}/${this.config.tenantID}/oauth2/v2.0/token`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
61
|
+
body: body.toString(),
|
|
62
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok)
|
|
65
|
+
throw new entraID_exception_1.EntraIDException('REFRESH_TOKEN_FAILED');
|
|
66
|
+
const tokens = (await response.json());
|
|
67
|
+
if (!tokens.access_token)
|
|
68
|
+
throw new entraID_exception_1.EntraIDException('REFRESH_TOKEN_FAILED');
|
|
69
|
+
return tokens;
|
|
70
|
+
}
|
|
71
|
+
async revokeUserSessions(userId) {
|
|
72
|
+
const adminToken = await this.getClientCredentialsToken();
|
|
73
|
+
const response = await fetch(`${GRAPH_BASE}/users/${userId}/revokeSignInSessions`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { Authorization: `Bearer ${adminToken}` },
|
|
76
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
77
|
+
});
|
|
78
|
+
if (!response.ok)
|
|
79
|
+
throw new entraID_exception_1.EntraIDException('REVOKE_SESSIONS_FAILED');
|
|
80
|
+
}
|
|
81
|
+
async getClientCredentialsToken() {
|
|
82
|
+
const authorityUrl = this.config.authorityUrl ?? entraID_constants_1.MICROSOFT_AUTHORITY_URL;
|
|
83
|
+
const body = new URLSearchParams({
|
|
84
|
+
client_id: this.config.clientID,
|
|
85
|
+
client_secret: this.config.clientSecret,
|
|
86
|
+
scope: 'https://graph.microsoft.com/.default',
|
|
87
|
+
grant_type: 'client_credentials',
|
|
88
|
+
});
|
|
89
|
+
const response = await fetch(`${authorityUrl}/${this.config.tenantID}/oauth2/v2.0/token`, {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
92
|
+
body: body.toString(),
|
|
93
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok)
|
|
96
|
+
throw new entraID_exception_1.EntraIDException('REVOKE_SESSIONS_FAILED');
|
|
97
|
+
const data = (await response.json());
|
|
98
|
+
return data.access_token;
|
|
99
|
+
}
|
|
100
|
+
async getMe(accessToken) {
|
|
101
|
+
const response = await fetch(`${GRAPH_BASE}/me?$select=id,displayName,mail,userPrincipalName,employeeId`, {
|
|
102
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
103
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
104
|
+
});
|
|
105
|
+
if (!response.ok)
|
|
106
|
+
throw new entraID_exception_1.EntraIDException('GRAPH_FETCH_FAILED');
|
|
107
|
+
return (await response.json());
|
|
108
|
+
}
|
|
109
|
+
async getMemberOf(accessToken) {
|
|
110
|
+
const allGroups = [];
|
|
111
|
+
let url = `${GRAPH_BASE}/me/memberOf?$select=displayName&$top=100`;
|
|
112
|
+
while (url) {
|
|
113
|
+
const response = await fetch(url, {
|
|
114
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
115
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok)
|
|
118
|
+
throw new entraID_exception_1.EntraIDException('GRAPH_FETCH_FAILED');
|
|
119
|
+
const data = (await response.json());
|
|
120
|
+
allGroups.push(...data.value);
|
|
121
|
+
url = data['@odata.nextLink'] ?? null;
|
|
122
|
+
}
|
|
123
|
+
return allGroups;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
exports.MicrosoftService = MicrosoftService;
|
|
127
|
+
exports.MicrosoftService = MicrosoftService = __decorate([
|
|
128
|
+
(0, common_1.Injectable)(),
|
|
129
|
+
__param(0, (0, common_1.Inject)(entraID_constants_1.ENTRA_ID_CONFIG)),
|
|
130
|
+
__metadata("design:paramtypes", [Object])
|
|
131
|
+
], MicrosoftService);
|
|
132
|
+
//# sourceMappingURL=microsoft.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft.service.js","sourceRoot":"","sources":["../../../../src/lib/entraID/microsoft/microsoft.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SecurityModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const security_service_1 = require("./security.service");
|
|
12
|
+
let SecurityModule = class SecurityModule {
|
|
13
|
+
};
|
|
14
|
+
exports.SecurityModule = SecurityModule;
|
|
15
|
+
exports.SecurityModule = SecurityModule = __decorate([
|
|
16
|
+
(0, common_1.Module)({
|
|
17
|
+
providers: [security_service_1.SecurityService],
|
|
18
|
+
exports: [security_service_1.SecurityService],
|
|
19
|
+
})
|
|
20
|
+
], SecurityModule);
|
|
21
|
+
//# sourceMappingURL=security.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.module.js","sourceRoot":"","sources":["../../../../src/lib/entraID/security/security.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAAqD;AAM9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAJ1B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,kCAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SecurityService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const entraID_exception_1 = require("../customError/entraID.exception");
|
|
12
|
+
const PATH_TRAVERSAL_PATTERNS = [
|
|
13
|
+
/\.\.[/\\]/,
|
|
14
|
+
/\.\.[/\\].*\.\.[/\\]/,
|
|
15
|
+
/%2e%2e[/\\]/i,
|
|
16
|
+
/%2e%2e%2f/i,
|
|
17
|
+
/%2e%2e%5c/i,
|
|
18
|
+
];
|
|
19
|
+
const NULL_BYTE_PATTERN = /\0|%00/;
|
|
20
|
+
const DANGEROUS_CHARS = /<|>|"|'|`|\$\{|javascript:/i;
|
|
21
|
+
let SecurityService = class SecurityService {
|
|
22
|
+
validateInput(value, field = 'input') {
|
|
23
|
+
if (NULL_BYTE_PATTERN.test(value)) {
|
|
24
|
+
throw new entraID_exception_1.EntraIDException('SECURITY_NULL_BYTE');
|
|
25
|
+
}
|
|
26
|
+
if (PATH_TRAVERSAL_PATTERNS.some((p) => p.test(value))) {
|
|
27
|
+
throw new entraID_exception_1.EntraIDException('SECURITY_PATH_TRAVERSAL');
|
|
28
|
+
}
|
|
29
|
+
if (DANGEROUS_CHARS.test(value)) {
|
|
30
|
+
throw new entraID_exception_1.EntraIDException('SECURITY_INVALID_CHARS');
|
|
31
|
+
}
|
|
32
|
+
void field;
|
|
33
|
+
return value.trim();
|
|
34
|
+
}
|
|
35
|
+
validateRedirectUri(uri, allowedUri) {
|
|
36
|
+
try {
|
|
37
|
+
const parsed = new URL(uri);
|
|
38
|
+
const allowed = new URL(allowedUri);
|
|
39
|
+
if (parsed.hostname !== allowed.hostname ||
|
|
40
|
+
parsed.protocol !== allowed.protocol) {
|
|
41
|
+
throw new entraID_exception_1.EntraIDException('SECURITY_OPEN_REDIRECT');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof entraID_exception_1.EntraIDException)
|
|
46
|
+
throw err;
|
|
47
|
+
throw new entraID_exception_1.EntraIDException('SECURITY_INVALID_URL');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
validateCallbackParams(params) {
|
|
51
|
+
if (params.error) {
|
|
52
|
+
throw new entraID_exception_1.EntraIDException('OAUTH_PROVIDER_ERROR');
|
|
53
|
+
}
|
|
54
|
+
if (!params.code || !params.state) {
|
|
55
|
+
throw new entraID_exception_1.EntraIDException('OAUTH_MISSING_PARAMS');
|
|
56
|
+
}
|
|
57
|
+
this.validateInput(params.code, 'code');
|
|
58
|
+
this.validateInput(params.state, 'state');
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.SecurityService = SecurityService;
|
|
62
|
+
exports.SecurityService = SecurityService = __decorate([
|
|
63
|
+
(0, common_1.Injectable)()
|
|
64
|
+
], SecurityService);
|
|
65
|
+
//# sourceMappingURL=security.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../../../src/lib/entraID/security/security.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,wEAAoE;AAEpE,MAAM,uBAAuB,GAAG;IAC9B,WAAW;IACX,sBAAsB;IACtB,cAAc;IACd,YAAY;IACZ,YAAY;CACb,CAAC;AAEF,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAEnC,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAG/C,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,aAAa,CAAC,KAAa,EAAE,KAAK,GAAG,OAAO;QAC1C,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,oCAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,oCAAgB,CAAC,yBAAyB,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,oCAAgB,CAAC,wBAAwB,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,KAAK,CAAC;QACX,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,GAAW,EAAE,UAAkB;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;YAEpC,IACE,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;gBACpC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACpC,CAAC;gBACD,MAAM,IAAI,oCAAgB,CAAC,wBAAwB,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,oCAAgB;gBAAE,MAAM,GAAG,CAAC;YAC/C,MAAM,IAAI,oCAAgB,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,sBAAsB,CAAC,MAItB;QACC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,oCAAgB,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,IAAI,oCAAgB,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAnDY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;GACA,eAAe,CAmD3B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InjectionToken, ModuleMetadata, OptionalFactoryDependency } from '@nestjs/common';
|
|
2
|
+
export type EntraIDSetup = {
|
|
3
|
+
tenantID: string;
|
|
4
|
+
clientID: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
stateSecret: string;
|
|
7
|
+
scope?: string;
|
|
8
|
+
prompt?: string;
|
|
9
|
+
authorityUrl?: string;
|
|
10
|
+
redirectUri: string;
|
|
11
|
+
jwtSecret: string;
|
|
12
|
+
jwtExpiresIn?: string | number;
|
|
13
|
+
};
|
|
14
|
+
export type EntraIDAsyncOptions = {
|
|
15
|
+
imports?: ModuleMetadata['imports'];
|
|
16
|
+
inject?: Array<InjectionToken | OptionalFactoryDependency>;
|
|
17
|
+
useFactory: (...args: any[]) => EntraIDSetup | Promise<EntraIDSetup>;
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entraID-module-init.types.js","sourceRoot":"","sources":["../../../../src/lib/entraID/types/entraID-module-init.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type CreateStateNonce = {
|
|
2
|
+
nonce: string;
|
|
3
|
+
state: string;
|
|
4
|
+
};
|
|
5
|
+
export type UrlRedirectSso = string;
|
|
6
|
+
export type CallbackParams = {
|
|
7
|
+
code?: string;
|
|
8
|
+
state?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
error_description?: string;
|
|
11
|
+
};
|
|
12
|
+
export type AzureTokenResponse = {
|
|
13
|
+
access_token: string;
|
|
14
|
+
id_token: string;
|
|
15
|
+
refresh_token?: string;
|
|
16
|
+
token_type: string;
|
|
17
|
+
expires_in: number;
|
|
18
|
+
};
|
|
19
|
+
export type IdTokenPayload = {
|
|
20
|
+
sub: string;
|
|
21
|
+
name: string;
|
|
22
|
+
preferred_username?: string;
|
|
23
|
+
email?: string;
|
|
24
|
+
upn?: string;
|
|
25
|
+
nonce: string;
|
|
26
|
+
aud: string;
|
|
27
|
+
iss: string;
|
|
28
|
+
exp: number;
|
|
29
|
+
};
|
|
30
|
+
export type TokenEnrichmentContext = {
|
|
31
|
+
user: EntraUser;
|
|
32
|
+
accessToken: string;
|
|
33
|
+
};
|
|
34
|
+
export type GraphUser = {
|
|
35
|
+
id: string;
|
|
36
|
+
displayName: string;
|
|
37
|
+
mail: string | null;
|
|
38
|
+
userPrincipalName: string;
|
|
39
|
+
employeeId?: string | null;
|
|
40
|
+
};
|
|
41
|
+
export type EntraUser = {
|
|
42
|
+
entraId: string;
|
|
43
|
+
email: string;
|
|
44
|
+
name: string;
|
|
45
|
+
tenantId: string;
|
|
46
|
+
matricula?: string | null;
|
|
47
|
+
} & Record<string, unknown>;
|
|
48
|
+
export type AuthResult = {
|
|
49
|
+
token: string;
|
|
50
|
+
user: EntraUser;
|
|
51
|
+
refreshToken?: string;
|
|
52
|
+
};
|
|
53
|
+
export type CookieDomainOptions = {
|
|
54
|
+
domain?: string;
|
|
55
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entraID.type.js","sourceRoot":"","sources":["../../../../src/lib/entraID/types/entraID.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { CookieDomainOptions, EntraUser } from '../types/entraID.type';
|
|
3
|
+
export declare class CookieUtils {
|
|
4
|
+
private static buildBaseCookieOptions;
|
|
5
|
+
static setAuthCookie(res: Response, token: string, refreshToken?: string, options?: CookieDomainOptions): void;
|
|
6
|
+
static setUserDataCookie(res: Response, user: EntraUser, options?: CookieDomainOptions): void;
|
|
7
|
+
static clearAuthCookies(res: Response, options?: CookieDomainOptions): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CookieUtils = void 0;
|
|
4
|
+
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
|
|
5
|
+
const REFRESH_TOKEN_MAX_AGE = 30 * 24 * 60 * 60 * 1000;
|
|
6
|
+
class CookieUtils {
|
|
7
|
+
static buildBaseCookieOptions(options) {
|
|
8
|
+
return {
|
|
9
|
+
httpOnly: true,
|
|
10
|
+
secure: IS_PRODUCTION,
|
|
11
|
+
sameSite: (IS_PRODUCTION ? 'none' : 'lax'),
|
|
12
|
+
path: '/',
|
|
13
|
+
...(options?.domain ? { domain: options.domain } : {}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
static setAuthCookie(res, token, refreshToken, options) {
|
|
17
|
+
const baseCookieOptions = CookieUtils.buildBaseCookieOptions(options);
|
|
18
|
+
res.cookie('auth_token', token, {
|
|
19
|
+
...baseCookieOptions,
|
|
20
|
+
maxAge: 24 * 60 * 60 * 1000,
|
|
21
|
+
});
|
|
22
|
+
if (refreshToken) {
|
|
23
|
+
res.cookie('refresh_token', refreshToken, {
|
|
24
|
+
...baseCookieOptions,
|
|
25
|
+
maxAge: REFRESH_TOKEN_MAX_AGE,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static setUserDataCookie(res, user, options) {
|
|
30
|
+
res.cookie('user_data', JSON.stringify(user), {
|
|
31
|
+
...CookieUtils.buildBaseCookieOptions(options),
|
|
32
|
+
maxAge: 60 * 1000,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
static clearAuthCookies(res, options) {
|
|
36
|
+
const clearOptions = {
|
|
37
|
+
...CookieUtils.buildBaseCookieOptions(options),
|
|
38
|
+
maxAge: 0,
|
|
39
|
+
};
|
|
40
|
+
res.clearCookie('auth_token', clearOptions);
|
|
41
|
+
res.clearCookie('user_data', clearOptions);
|
|
42
|
+
res.clearCookie('refresh_token', clearOptions);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.CookieUtils = CookieUtils;
|
|
46
|
+
//# sourceMappingURL=cookie.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.utils.js","sourceRoot":"","sources":["../../../../src/lib/entraID/utils/cookie.utils.ts"],"names":[],"mappings":";;;AAGA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE5D,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,MAAa,WAAW;IACd,MAAM,CAAC,sBAAsB,CAAC,OAA6B;QACjE,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAmB;YAC5D,IAAI,EAAE,GAAG;YACT,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,GAAa,EACb,KAAa,EACb,YAAqB,EACrB,OAA6B;QAE7B,MAAM,iBAAiB,GAAG,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEtE,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE;YAC9B,GAAG,iBAAiB;YACpB,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;SAC5B,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,EAAE;gBACxC,GAAG,iBAAiB;gBACpB,MAAM,EAAE,qBAAqB;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CACtB,GAAa,EACb,IAAe,EACf,OAA6B;QAE7B,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAC5C,GAAG,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC;YAC9C,MAAM,EAAE,EAAE,GAAG,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAa,EAAE,OAA6B;QAClE,MAAM,YAAY,GAAG;YACnB,GAAG,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC;YAC9C,MAAM,EAAE,CAAC;SACV,CAAC;QACF,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC5C,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3C,GAAG,CAAC,WAAW,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;CACF;AApDD,kCAoDC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import crypto from 'crypto';
|
|
3
|
+
import jwksClient from 'jwks-rsa';
|
|
4
|
+
export declare class CryptoUtils {
|
|
5
|
+
static createSignedPayloadWithHMAC(payload: string, secret: string): string;
|
|
6
|
+
static generateHash(length?: number): string;
|
|
7
|
+
static verifyPayloadWithHMAC(parts: string[], secret: string): void;
|
|
8
|
+
static getPublicKeyRsa(kid: string, jwksClientInstance: ReturnType<typeof jwksClient>): Promise<crypto.KeyObject>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CryptoUtils = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const entraID_exception_1 = require("../customError/entraID.exception");
|
|
9
|
+
class CryptoUtils {
|
|
10
|
+
static createSignedPayloadWithHMAC(payload, secret) {
|
|
11
|
+
const hash = crypto_1.default
|
|
12
|
+
.createHmac('sha256', secret)
|
|
13
|
+
.update(payload)
|
|
14
|
+
.digest('base64url');
|
|
15
|
+
return `${payload}.${hash}`;
|
|
16
|
+
}
|
|
17
|
+
static generateHash(length = 32) {
|
|
18
|
+
return crypto_1.default.randomBytes(length).toString('hex');
|
|
19
|
+
}
|
|
20
|
+
static verifyPayloadWithHMAC(parts, secret) {
|
|
21
|
+
if (parts.length !== 2) {
|
|
22
|
+
throw new entraID_exception_1.EntraIDException('STATE_MISMATCH');
|
|
23
|
+
}
|
|
24
|
+
const [payload, receivedSig] = parts;
|
|
25
|
+
const expectedSig = crypto_1.default
|
|
26
|
+
.createHmac('sha256', secret)
|
|
27
|
+
.update(payload)
|
|
28
|
+
.digest('base64url');
|
|
29
|
+
const sigBuf = new Uint8Array(Buffer.from(receivedSig));
|
|
30
|
+
const expectedBuf = new Uint8Array(Buffer.from(expectedSig));
|
|
31
|
+
if (sigBuf.length !== expectedBuf.length ||
|
|
32
|
+
!crypto_1.default.timingSafeEqual(sigBuf, expectedBuf)) {
|
|
33
|
+
throw new entraID_exception_1.EntraIDException('STATE_MISMATCH');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
static async getPublicKeyRsa(kid, jwksClientInstance) {
|
|
37
|
+
try {
|
|
38
|
+
const key = await jwksClientInstance.getSigningKey(kid);
|
|
39
|
+
return crypto_1.default.createPublicKey(key.getPublicKey());
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new entraID_exception_1.EntraIDException('JWKS_KEY_NOT_FOUND');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.CryptoUtils = CryptoUtils;
|
|
47
|
+
//# sourceMappingURL=crypto.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.utils.js","sourceRoot":"","sources":["../../../../src/lib/entraID/utils/crypto.utils.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,wEAAoE;AAGpE,MAAa,WAAW;IACtB,MAAM,CAAC,2BAA2B,CAAC,OAAe,EAAE,MAAc;QAChE,MAAM,IAAI,GAAG,gBAAM;aAChB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvB,OAAO,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,SAAiB,EAAE;QACrC,OAAO,gBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,KAAe,EAAE,MAAc;QAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,oCAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC;QAErC,MAAM,WAAW,GAAG,gBAAM;aACvB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAE7D,IACE,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;YACpC,CAAC,gBAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,EAC5C,CAAC;YACD,MAAM,IAAI,oCAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAC1B,GAAW,EACX,kBAAiD;QAEjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACxD,OAAO,gBAAM,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,oCAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF;AAhDD,kCAgDC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenUtils = exports.CookieUtils = void 0;
|
|
4
|
+
var cookie_utils_1 = require("./cookie.utils");
|
|
5
|
+
Object.defineProperty(exports, "CookieUtils", { enumerable: true, get: function () { return cookie_utils_1.CookieUtils; } });
|
|
6
|
+
var token_utils_1 = require("./token.utils");
|
|
7
|
+
Object.defineProperty(exports, "TokenUtils", { enumerable: true, get: function () { return token_utils_1.TokenUtils; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/entraID/utils/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenUtils = void 0;
|
|
4
|
+
class TokenUtils {
|
|
5
|
+
static extractFromRequest(req) {
|
|
6
|
+
const auth = req.headers.authorization;
|
|
7
|
+
if (auth?.startsWith('Bearer '))
|
|
8
|
+
return auth.slice(7);
|
|
9
|
+
return req.cookies?.auth_token;
|
|
10
|
+
}
|
|
11
|
+
static extractUserDataFromCookie(req) {
|
|
12
|
+
const raw = req.cookies?.user_data;
|
|
13
|
+
if (!raw)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.TokenUtils = TokenUtils;
|
|
24
|
+
//# sourceMappingURL=token.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.utils.js","sourceRoot":"","sources":["../../../../src/lib/entraID/utils/token.utils.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACrB,MAAM,CAAC,kBAAkB,CAAC,GAAY;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QACvC,IAAI,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,OAAO,EAAE,UAAgC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,yBAAyB,CAAC,GAAY;QAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,SAA+B,CAAC;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAhBD,gCAgBC"}
|