prime-sdk 3.0.4 → 3.0.7-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/.yarnrc.yml +1 -0
- package/README.md +307 -0
- package/dist/external/aws/s3/s3.provider.d.ts +1 -0
- package/dist/external/aws/s3/s3.provider.js +5 -0
- package/dist/external/aws/s3/s3.provider.js.map +1 -1
- package/dist/external/aws/sns/sns.provider.d.ts +1 -0
- package/dist/external/aws/sns/sns.provider.js +5 -0
- package/dist/external/aws/sns/sns.provider.js.map +1 -1
- package/dist/external/aws/sqs/sqs.provider.d.ts +1 -0
- package/dist/external/aws/sqs/sqs.provider.js +5 -0
- package/dist/external/aws/sqs/sqs.provider.js.map +1 -1
- 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 +52 -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 +7 -0
- package/dist/lib/entraID/utils/cookie.utils.js +42 -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 +5 -1
- package/src/external/aws/s3/s3.provider.ts +6 -0
- package/src/external/aws/sns/sns.provider.ts +6 -0
- package/src/external/aws/sqs/sqs.provider.ts +6 -0
- package/src/index.ts +42 -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 +57 -0
- package/src/lib/entraID/utils/cookie.utils.ts +50 -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 -3
package/.eslintrc.js
CHANGED
|
@@ -21,5 +21,9 @@ module.exports = {
|
|
|
21
21
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
22
22
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
23
23
|
'@typescript-eslint/no-explicit-any': 'off',
|
|
24
|
+
'@typescript-eslint/no-unused-vars': [
|
|
25
|
+
'error',
|
|
26
|
+
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
|
|
27
|
+
],
|
|
24
28
|
},
|
|
25
29
|
};
|
|
Binary file
|
package/.yarnrc.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nodeLinker: node-modules
|
package/README.md
CHANGED
|
@@ -270,3 +270,310 @@ export class AppService {
|
|
|
270
270
|
#### Next steps
|
|
271
271
|
|
|
272
272
|
- Interface for Class to facilite test
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### EntraID (Microsoft Entra ID / Azure AD)
|
|
277
|
+
|
|
278
|
+
Módulo de autenticação SSO com Microsoft Entra ID via OAuth 2.0 + OIDC. Emite um JWT interno após validar o token do Azure, evitando expor o `access_token` da Microsoft para o frontend.
|
|
279
|
+
|
|
280
|
+
#### Pré-requisitos no Azure
|
|
281
|
+
|
|
282
|
+
No [Portal Azure](https://portal.azure.com), crie um **App Registration** e configure:
|
|
283
|
+
|
|
284
|
+
| Campo | Valor |
|
|
285
|
+
|---|---|
|
|
286
|
+
| Redirect URI | `https://seu-dominio.com/auth/sso/callback` (tipo: Web) |
|
|
287
|
+
| Client Secret | Gere em **Certificates & secrets** |
|
|
288
|
+
| API Permissions | `openid`, `profile`, `email`, `User.Read`, `User.ReadBasic.All` |
|
|
289
|
+
|
|
290
|
+
Anote o **Tenant ID**, **Client ID** e **Client Secret**.
|
|
291
|
+
|
|
292
|
+
#### Variáveis de ambiente
|
|
293
|
+
|
|
294
|
+
```env
|
|
295
|
+
TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
296
|
+
CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
297
|
+
CLIENT_SECRET=sua-secret-aqui
|
|
298
|
+
REDIRECT_URI=http://localhost:3000/auth/sso/callback
|
|
299
|
+
STATE_SECRET=string-aleatoria-32-chars
|
|
300
|
+
JWT_SECRET=string-aleatoria-32-chars
|
|
301
|
+
JWT_EXPIRES_IN=8h
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### 1. Registrar o módulo
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
import { EntraIDModule } from 'prime-sdk';
|
|
308
|
+
|
|
309
|
+
@Module({
|
|
310
|
+
imports: [
|
|
311
|
+
EntraIDModule.forRoot({
|
|
312
|
+
tenantID: process.env.TENANT_ID!,
|
|
313
|
+
clientID: process.env.CLIENT_ID!,
|
|
314
|
+
clientSecret: process.env.CLIENT_SECRET!,
|
|
315
|
+
stateSecret: process.env.STATE_SECRET!,
|
|
316
|
+
redirectUri: process.env.REDIRECT_URI!,
|
|
317
|
+
jwtSecret: process.env.JWT_SECRET!,
|
|
318
|
+
jwtExpiresIn: process.env.JWT_EXPIRES_IN ?? '8h',
|
|
319
|
+
}),
|
|
320
|
+
],
|
|
321
|
+
})
|
|
322
|
+
export class AppModule {}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
Com factory assíncrona (ex: usando `ConfigService`):
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
EntraIDModule.forRootAsync({
|
|
329
|
+
imports: [ConfigModule],
|
|
330
|
+
inject: [ConfigService],
|
|
331
|
+
useFactory: (config: ConfigService) => ({
|
|
332
|
+
tenantID: config.get('TENANT_ID')!,
|
|
333
|
+
clientID: config.get('CLIENT_ID')!,
|
|
334
|
+
clientSecret: config.get('CLIENT_SECRET')!,
|
|
335
|
+
stateSecret: config.get('STATE_SECRET')!,
|
|
336
|
+
redirectUri: config.get('REDIRECT_URI')!,
|
|
337
|
+
jwtSecret: config.get('JWT_SECRET')!,
|
|
338
|
+
}),
|
|
339
|
+
}),
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
O módulo é registrado como **global** — não é necessário importá-lo em outros módulos.
|
|
343
|
+
|
|
344
|
+
#### 2. Implementar o controller de autenticação
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
// auth.controller.ts
|
|
348
|
+
import { Controller, Get, Post, Body, Res, HttpCode, Redirect } from '@nestjs/common';
|
|
349
|
+
import { Response } from 'express';
|
|
350
|
+
import { EntraIDService, CallbackParams, CookieUtils } from 'prime-sdk';
|
|
351
|
+
|
|
352
|
+
@Controller('auth')
|
|
353
|
+
export class AuthController {
|
|
354
|
+
constructor(private readonly entraService: EntraIDService) {}
|
|
355
|
+
|
|
356
|
+
@Get('login')
|
|
357
|
+
@Redirect()
|
|
358
|
+
async login() {
|
|
359
|
+
const url = await this.entraService.initiateLogin();
|
|
360
|
+
return { url };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Passo 2: a Microsoft faz POST aqui após o login bem-sucedido
|
|
364
|
+
@Post('sso/callback')
|
|
365
|
+
@HttpCode(302)
|
|
366
|
+
@Redirect()
|
|
367
|
+
async callback(@Body() body: CallbackParams, @Res({ passthrough: true }) res: Response) {
|
|
368
|
+
const { token, user, refreshToken } = await this.entraService.handleCallback(body);
|
|
369
|
+
|
|
370
|
+
CookieUtils.setAuthCookie(res, token); // cookie httpOnly com o JWT
|
|
371
|
+
CookieUtils.setUserDataCookie(res, user);
|
|
372
|
+
if (refreshToken) {
|
|
373
|
+
res.cookie('refresh_token', refreshToken, { httpOnly: true, path: '/' });
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return { url: 'http://localhost:9000/dashboard' };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Renovar o JWT usando o refresh token
|
|
380
|
+
@Post('refresh')
|
|
381
|
+
@HttpCode(200)
|
|
382
|
+
async refresh(@Req() req: Request, @Res({ passthrough: true }) res: Response) {
|
|
383
|
+
const refreshToken = req.cookies?.refresh_token;
|
|
384
|
+
const { token, user } = await this.entraService.refresh(refreshToken);
|
|
385
|
+
|
|
386
|
+
CookieUtils.setAuthCookie(res, token);
|
|
387
|
+
CookieUtils.setUserDataCookie(res, user);
|
|
388
|
+
return { user };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Logout: revoga sessões no Azure e limpa cookies
|
|
392
|
+
@Post('logout')
|
|
393
|
+
@HttpCode(200)
|
|
394
|
+
async logout(@Req() req: Request, @Res({ passthrough: true }) res: Response) {
|
|
395
|
+
const token = req.cookies?.auth_token;
|
|
396
|
+
if (token) {
|
|
397
|
+
try {
|
|
398
|
+
const user = this.entraService.decodeLocalToken(token);
|
|
399
|
+
await this.entraService.logout(user.id);
|
|
400
|
+
} catch {}
|
|
401
|
+
}
|
|
402
|
+
CookieUtils.clearAuthCookies(res);
|
|
403
|
+
return { message: 'Logout realizado com sucesso' };
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
#### 3. Proteger rotas com `@UseGuards(EntraAuthGuard)`
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// profile.controller.ts
|
|
412
|
+
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
413
|
+
import { EntraAuthGuard, CurrentUser, EntraUser } from 'prime-sdk';
|
|
414
|
+
|
|
415
|
+
@Controller('profile')
|
|
416
|
+
@UseGuards(EntraAuthGuard) // protege todos os endpoints da classe
|
|
417
|
+
export class ProfileController {
|
|
418
|
+
|
|
419
|
+
@Get()
|
|
420
|
+
getProfile(@CurrentUser() user: EntraUser) {
|
|
421
|
+
return { user };
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
O `EntraAuthGuard` aceita o token via:
|
|
427
|
+
- Header `Authorization: Bearer <token>`
|
|
428
|
+
- Cookie `auth_token` (httpOnly)
|
|
429
|
+
|
|
430
|
+
#### 4. Controlar acesso por grupos do Azure AD com `@Roles()` e `RolesGuard`
|
|
431
|
+
|
|
432
|
+
As permissões vêm dos **grupos do Azure AD** aos quais o usuário pertence. Esses grupos são buscados automaticamente pelo SDK via Graph API e incluídos no JWT como `groups[]`. Não é necessário consultar banco de dados para autorização.
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
436
|
+
import { EntraAuthGuard, CurrentUser, EntraUser, RolesGuard, Roles } from 'prime-sdk';
|
|
437
|
+
|
|
438
|
+
@Controller('pedidos')
|
|
439
|
+
@UseGuards(EntraAuthGuard)
|
|
440
|
+
export class PedidosController {
|
|
441
|
+
|
|
442
|
+
@Get()
|
|
443
|
+
listar(@CurrentUser() user: EntraUser) {
|
|
444
|
+
return { pedidos: [] };
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
@Get('aprovar')
|
|
448
|
+
@UseGuards(RolesGuard)
|
|
449
|
+
@Roles('portal-promo-dpsp-comercial-hml', 'portal-promo-dpsp-price-hml')
|
|
450
|
+
aprovar(@CurrentUser() user: EntraUser) {
|
|
451
|
+
// só chega aqui se user.groups[] contiver ao menos um dos grupos acima
|
|
452
|
+
return { aprovado: true };
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
O `RolesGuard` verifica se `user.groups[].displayName` contém **ao menos um** dos grupos declarados em `@Roles()`. Se nenhum grupo bater, retorna **403** com a mensagem indicando quais grupos são necessários.
|
|
458
|
+
|
|
459
|
+
> Os grupos são gerenciados exclusivamente pelo administrador do Azure AD — sem nenhuma alteração no código da aplicação.
|
|
460
|
+
|
|
461
|
+
#### 5. Liberar rotas com `@Public()`
|
|
462
|
+
|
|
463
|
+
Use `@Public()` em um método para que o guard **ignore a autenticação** naquele endpoint específico, mesmo que o controller inteiro seja protegido:
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
467
|
+
import { EntraAuthGuard, Public } from 'prime-sdk';
|
|
468
|
+
|
|
469
|
+
@Controller('info')
|
|
470
|
+
@UseGuards(EntraAuthGuard)
|
|
471
|
+
export class InfoController {
|
|
472
|
+
|
|
473
|
+
@Get('status')
|
|
474
|
+
@Public() // acessível sem token
|
|
475
|
+
getStatus() {
|
|
476
|
+
return { status: 'online', timestamp: new Date().toISOString() };
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
@Get('me') // ainda requer autenticação
|
|
480
|
+
getMe(@CurrentUser() user: EntraUser) {
|
|
481
|
+
return { user };
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### 5. Enriquecer o JWT com dados da aplicação
|
|
487
|
+
|
|
488
|
+
Por padrão o JWT contém: `id`, `email`, `name`, `tenantId`, `matricula` e `groups`.
|
|
489
|
+
|
|
490
|
+
Para adicionar campos extras (ex: dados do banco de dados consultados pelo email), estenda o `InternalTokenService` e sobrescreva `enrichTokenPayload`:
|
|
491
|
+
|
|
492
|
+
```typescript
|
|
493
|
+
// custom-token.service.ts
|
|
494
|
+
import { Injectable } from '@nestjs/common';
|
|
495
|
+
import { InternalTokenService, TokenEnrichmentContext } from 'prime-sdk';
|
|
496
|
+
|
|
497
|
+
@Injectable()
|
|
498
|
+
export class CustomTokenService extends InternalTokenService {
|
|
499
|
+
protected override async enrichTokenPayload(
|
|
500
|
+
context: TokenEnrichmentContext,
|
|
501
|
+
): Promise<Record<string, unknown>> {
|
|
502
|
+
// context.user → dados base do usuário (EntraUser)
|
|
503
|
+
// context.accessToken → token da Microsoft (para chamadas ao Graph API)
|
|
504
|
+
|
|
505
|
+
// Exemplo: lookup no banco usando o email como chave
|
|
506
|
+
const profile = await this.userRepository.findByEmail(context.user.email);
|
|
507
|
+
|
|
508
|
+
return {
|
|
509
|
+
role: profile?.role ?? 'USER',
|
|
510
|
+
cargo: profile?.cargo,
|
|
511
|
+
departamento: profile?.departamento,
|
|
512
|
+
permissoes: profile?.permissoes ?? [],
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
Registre o serviço customizado na opção `internalTokenService` do `forRoot`:
|
|
519
|
+
|
|
520
|
+
```typescript
|
|
521
|
+
EntraIDModule.forRoot(
|
|
522
|
+
{
|
|
523
|
+
tenantID: process.env.TENANT_ID!,
|
|
524
|
+
// ... demais configurações
|
|
525
|
+
},
|
|
526
|
+
{ internalTokenService: CustomTokenService }, // <-- aqui
|
|
527
|
+
),
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
> **Atenção:** `enrichTokenPayload` não pode retornar claims reservados do JWT (`sub`, `iss`, `aud`, `exp`, `iat`, `nbf`, `jti`). O SDK lança `RESERVED_CLAIM_OVERRIDE` caso isso ocorra.
|
|
531
|
+
|
|
532
|
+
#### 6. Tipar o usuário enriquecido
|
|
533
|
+
|
|
534
|
+
Como `EntraUser` usa `& Record<string, unknown>` para os campos extras, crie uma interface própria para ter tipagem completa no seu projeto:
|
|
535
|
+
|
|
536
|
+
```typescript
|
|
537
|
+
// types/app-user.types.ts
|
|
538
|
+
export interface AppUser {
|
|
539
|
+
id: string;
|
|
540
|
+
email: string;
|
|
541
|
+
name: string;
|
|
542
|
+
tenantId: string;
|
|
543
|
+
matricula?: string | null;
|
|
544
|
+
groups: { displayName: string }[];
|
|
545
|
+
// campos adicionados pelo CustomTokenService
|
|
546
|
+
role: 'ADMIN' | 'USER';
|
|
547
|
+
cargo: string;
|
|
548
|
+
departamento: string;
|
|
549
|
+
permissoes: string[];
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
```typescript
|
|
554
|
+
@Get('profile')
|
|
555
|
+
getProfile(@CurrentUser() user: AppUser) {
|
|
556
|
+
return user;
|
|
557
|
+
}
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
#### 7. Referência das exportações
|
|
561
|
+
|
|
562
|
+
| Exportação | Tipo | Descrição |
|
|
563
|
+
|---|---|---|
|
|
564
|
+
| `EntraIDModule` | Module | Módulo principal — use `forRoot()` ou `forRootAsync()` |
|
|
565
|
+
| `EntraIDService` | Service | `initiateLogin()`, `handleCallback()`, `refresh()`, `logout()`, `decodeLocalToken()` |
|
|
566
|
+
| `EntraAuthGuard` | Guard | Valida o JWT no header ou cookie |
|
|
567
|
+
| `RolesGuard` | Guard | Verifica se `user.groups[]` contém os grupos exigidos por `@Roles()` |
|
|
568
|
+
| `InternalTokenService` | Service | Estenda para enriquecer o JWT via `enrichTokenPayload()` |
|
|
569
|
+
| `CurrentUser` | Decorator | Injeta o usuário autenticado no parâmetro do método |
|
|
570
|
+
| `Public` | Decorator | Marca um endpoint como público, ignorado pelo `EntraAuthGuard` |
|
|
571
|
+
| `Roles` | Decorator | Define os grupos do Azure AD exigidos pelo `RolesGuard` |
|
|
572
|
+
| `CookieUtils` | Class | `setAuthCookie()`, `setUserDataCookie()`, `clearAuthCookies()` |
|
|
573
|
+
| `TokenUtils` | Class | `extractFromRequest()`, `extractUserDataFromCookie()` |
|
|
574
|
+
| `EntraIDException` | Error | Erros tipados do SDK — acesse o código via `.code` |
|
|
575
|
+
| `EntraUser` | Type | Tipo base do usuário no JWT |
|
|
576
|
+
| `EntraIDSetup` | Type | Configuração do `forRoot()` |
|
|
577
|
+
| `TokenEnrichmentContext` | Type | Parâmetro de `enrichTokenPayload()` |
|
|
578
|
+
| `CallbackParams` | Type | Body do callback OAuth (`code`, `state`, `error`) |
|
|
579
|
+
| `AuthResult` | Type | Retorno de `handleCallback()` e `refresh()` |
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.S3Module = void 0;
|
|
4
4
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
5
|
+
const node_http_handler_1 = require("@smithy/node-http-handler");
|
|
6
|
+
const https_1 = require("https");
|
|
5
7
|
const S3Provider = (params) => {
|
|
6
8
|
return {
|
|
7
9
|
provide: 'CONNECTION_S3',
|
|
@@ -10,6 +12,9 @@ const S3Provider = (params) => {
|
|
|
10
12
|
credentials: params.credentials,
|
|
11
13
|
...(params.endpoint && { endpoint: params.endpoint }),
|
|
12
14
|
region: params.region,
|
|
15
|
+
requestHandler: new node_http_handler_1.NodeHttpHandler({
|
|
16
|
+
httpsAgent: new https_1.Agent({ keepAlive: params.keepAlive ?? true }),
|
|
17
|
+
}),
|
|
13
18
|
});
|
|
14
19
|
},
|
|
15
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/s3/s3.provider.ts"],"names":[],"mappings":";;;AAAA,kDAA8C;
|
|
1
|
+
{"version":3,"file":"s3.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/s3/s3.provider.ts"],"names":[],"mappings":";;;AAAA,kDAA8C;AAC9C,iEAA4D;AAE5D,iCAA4C;AAa5C,MAAM,UAAU,GAAG,CAAC,MAAe,EAAE,EAAE;IACrC,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,GAAG,EAAE;YACf,OAAO,IAAI,oBAAQ,CAAC;gBAClB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrD,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,IAAI,mCAAe,CAAC;oBAClC,UAAU,EAAE,IAAI,aAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;iBACpE,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAa,QAAQ;IACnB,MAAM,CAAC,OAAO,CAAC,MAAe;QAC5B,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEtC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,CAAC,UAAU,CAAC;YACvB,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;IACJ,CAAC;CACF;AAVD,4BAUC"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SNSModule = void 0;
|
|
4
4
|
const client_sns_1 = require("@aws-sdk/client-sns");
|
|
5
|
+
const node_http_handler_1 = require("@smithy/node-http-handler");
|
|
6
|
+
const https_1 = require("https");
|
|
5
7
|
const SNSProvider = (params) => {
|
|
6
8
|
return {
|
|
7
9
|
provide: 'CONNECTION_SNS',
|
|
@@ -10,6 +12,9 @@ const SNSProvider = (params) => {
|
|
|
10
12
|
credentials: params.credentials,
|
|
11
13
|
...(params.endpoint && { endpoint: params.endpoint }),
|
|
12
14
|
region: params.region,
|
|
15
|
+
requestHandler: new node_http_handler_1.NodeHttpHandler({
|
|
16
|
+
httpsAgent: new https_1.Agent({ keepAlive: params.keepAlive ?? true }),
|
|
17
|
+
}),
|
|
13
18
|
});
|
|
14
19
|
},
|
|
15
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sns.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/sns/sns.provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;
|
|
1
|
+
{"version":3,"file":"sns.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/sns/sns.provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;AAChD,iEAA4D;AAE5D,iCAA4C;AAa5C,MAAM,WAAW,GAAG,CAAC,MAAgB,EAAE,EAAE;IACvC,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,UAAU,EAAE,GAAG,EAAE;YACf,OAAO,IAAI,sBAAS,CAAC;gBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrD,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,IAAI,mCAAe,CAAC;oBAClC,UAAU,EAAE,IAAI,aAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;iBACpE,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAa,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,MAAgB;QAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAExC,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB,CAAC;IACJ,CAAC;CACF;AAVD,8BAUC"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SqsModule = void 0;
|
|
4
4
|
const client_sqs_1 = require("@aws-sdk/client-sqs");
|
|
5
|
+
const node_http_handler_1 = require("@smithy/node-http-handler");
|
|
6
|
+
const https_1 = require("https");
|
|
5
7
|
const SqsProvider = (params) => {
|
|
6
8
|
return {
|
|
7
9
|
provide: 'CONNECTION_SQS',
|
|
@@ -10,6 +12,9 @@ const SqsProvider = (params) => {
|
|
|
10
12
|
credentials: params.credentials,
|
|
11
13
|
region: params.region,
|
|
12
14
|
...(params.endpoint && { endpoint: params.endpoint }),
|
|
15
|
+
requestHandler: new node_http_handler_1.NodeHttpHandler({
|
|
16
|
+
httpsAgent: new https_1.Agent({ keepAlive: params.keepAlive ?? true }),
|
|
17
|
+
}),
|
|
13
18
|
});
|
|
14
19
|
},
|
|
15
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqs.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/sqs/sqs.provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;
|
|
1
|
+
{"version":3,"file":"sqs.provider.js","sourceRoot":"","sources":["../../../../src/external/aws/sqs/sqs.provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;AAChD,iEAA4D;AAE5D,iCAA4C;AAa5C,MAAM,WAAW,GAAG,CAAC,MAAgB,EAAE,EAAE;IACvC,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,UAAU,EAAE,GAAG,EAAE;YACf,OAAO,IAAI,sBAAS,CAAC;gBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrD,cAAc,EAAE,IAAI,mCAAe,CAAC;oBAClC,UAAU,EAAE,IAAI,aAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;iBACpE,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAa,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,MAAgB;QAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAExC,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB,CAAC;IACJ,CAAC;CACF;AAVD,8BAUC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,4 +20,18 @@ import { DocumentsModule } from './lib/documents/documents.module';
|
|
|
20
20
|
import { Documents } from './lib/documents/documents';
|
|
21
21
|
import { IBedrock, ITextract } from './lib/documents/interfaces/documents.interface';
|
|
22
22
|
import { SimpleRedisSetup, ClusterRedisSetup, TypeRedis, PubSubRedis } from './external/redis/types/ioredis.types';
|
|
23
|
-
|
|
23
|
+
import { EntraIDModule, ENTRA_ID_CONFIG } from './lib/entraID/entraID.module';
|
|
24
|
+
import type { EntraIDModuleOptions } from './lib/entraID/entraID.module';
|
|
25
|
+
import { EntraIDService } from './lib/entraID/entraID.service';
|
|
26
|
+
import { EntraAuthGuard } from './lib/entraID/guards/entra-auth.guard';
|
|
27
|
+
import { RolesGuard } from './lib/entraID/guards/roles.guard';
|
|
28
|
+
import { InternalTokenService } from './lib/entraID/internal-token/internal-token.service';
|
|
29
|
+
import { CurrentUser } from './lib/entraID/decorators/current-user.decorator';
|
|
30
|
+
import { Public } from './lib/entraID/decorators/public.decorator';
|
|
31
|
+
import { Roles } from './lib/entraID/decorators/roles.decorator';
|
|
32
|
+
import { CookieUtils, TokenUtils } from './lib/entraID/utils';
|
|
33
|
+
import { SecurityService } from './lib/entraID/security/security.service';
|
|
34
|
+
import { EntraIDException } from './lib/entraID/customError/entraID.exception';
|
|
35
|
+
import type { EntraUser, AuthResult, CallbackParams, TokenEnrichmentContext } from './lib/entraID/types/entraID.type';
|
|
36
|
+
import type { EntraIDSetup, EntraIDAsyncOptions } from './lib/entraID/types/entraID-module-init.types';
|
|
37
|
+
export { QueueModule, Queue, IConsumer, StorageModule, Storage, IStorage, EventModule, Events, IEvent, EmailModule, Email, IEmail, CryptoModule, Crypto, ICrypto, CacheModule, Cache, ICache, DocumentsModule, Documents, IBedrock, ITextract, SimpleRedisSetup, ClusterRedisSetup, TypeRedis, PubSubRedis, EntraIDModule, EntraIDModuleOptions, ENTRA_ID_CONFIG, EntraIDService, EntraAuthGuard, RolesGuard, InternalTokenService, CurrentUser, Public, Roles, CookieUtils, TokenUtils, SecurityService, EntraIDException, EntraIDSetup, EntraIDAsyncOptions, EntraUser, AuthResult, CallbackParams, TokenEnrichmentContext, };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TypeRedis = exports.ITextract = exports.IBedrock = exports.Documents = exports.DocumentsModule = exports.ICache = exports.Cache = exports.CacheModule = exports.ICrypto = exports.Crypto = exports.CryptoModule = exports.IEmail = exports.Email = exports.EmailModule = exports.IEvent = exports.Events = exports.EventModule = exports.IStorage = exports.Storage = exports.StorageModule = exports.IConsumer = exports.Queue = exports.QueueModule = void 0;
|
|
3
|
+
exports.EntraIDException = exports.SecurityService = exports.TokenUtils = exports.CookieUtils = exports.Roles = exports.Public = exports.CurrentUser = exports.InternalTokenService = exports.RolesGuard = exports.EntraAuthGuard = exports.EntraIDService = exports.ENTRA_ID_CONFIG = exports.EntraIDModule = exports.TypeRedis = exports.ITextract = exports.IBedrock = exports.Documents = exports.DocumentsModule = exports.ICache = exports.Cache = exports.CacheModule = exports.ICrypto = exports.Crypto = exports.CryptoModule = exports.IEmail = exports.Email = exports.EmailModule = exports.IEvent = exports.Events = exports.EventModule = exports.IStorage = exports.Storage = exports.StorageModule = exports.IConsumer = exports.Queue = exports.QueueModule = void 0;
|
|
4
4
|
const queue_module_1 = require("./lib/queue/queue.module");
|
|
5
5
|
Object.defineProperty(exports, "QueueModule", { enumerable: true, get: function () { return queue_module_1.QueueModule; } });
|
|
6
6
|
const queue_1 = require("./lib/queue/queue");
|
|
@@ -46,4 +46,28 @@ Object.defineProperty(exports, "IBedrock", { enumerable: true, get: function ()
|
|
|
46
46
|
Object.defineProperty(exports, "ITextract", { enumerable: true, get: function () { return documents_interface_1.ITextract; } });
|
|
47
47
|
const ioredis_types_1 = require("./external/redis/types/ioredis.types");
|
|
48
48
|
Object.defineProperty(exports, "TypeRedis", { enumerable: true, get: function () { return ioredis_types_1.TypeRedis; } });
|
|
49
|
+
const entraID_module_1 = require("./lib/entraID/entraID.module");
|
|
50
|
+
Object.defineProperty(exports, "EntraIDModule", { enumerable: true, get: function () { return entraID_module_1.EntraIDModule; } });
|
|
51
|
+
Object.defineProperty(exports, "ENTRA_ID_CONFIG", { enumerable: true, get: function () { return entraID_module_1.ENTRA_ID_CONFIG; } });
|
|
52
|
+
const entraID_service_1 = require("./lib/entraID/entraID.service");
|
|
53
|
+
Object.defineProperty(exports, "EntraIDService", { enumerable: true, get: function () { return entraID_service_1.EntraIDService; } });
|
|
54
|
+
const entra_auth_guard_1 = require("./lib/entraID/guards/entra-auth.guard");
|
|
55
|
+
Object.defineProperty(exports, "EntraAuthGuard", { enumerable: true, get: function () { return entra_auth_guard_1.EntraAuthGuard; } });
|
|
56
|
+
const roles_guard_1 = require("./lib/entraID/guards/roles.guard");
|
|
57
|
+
Object.defineProperty(exports, "RolesGuard", { enumerable: true, get: function () { return roles_guard_1.RolesGuard; } });
|
|
58
|
+
const internal_token_service_1 = require("./lib/entraID/internal-token/internal-token.service");
|
|
59
|
+
Object.defineProperty(exports, "InternalTokenService", { enumerable: true, get: function () { return internal_token_service_1.InternalTokenService; } });
|
|
60
|
+
const current_user_decorator_1 = require("./lib/entraID/decorators/current-user.decorator");
|
|
61
|
+
Object.defineProperty(exports, "CurrentUser", { enumerable: true, get: function () { return current_user_decorator_1.CurrentUser; } });
|
|
62
|
+
const public_decorator_1 = require("./lib/entraID/decorators/public.decorator");
|
|
63
|
+
Object.defineProperty(exports, "Public", { enumerable: true, get: function () { return public_decorator_1.Public; } });
|
|
64
|
+
const roles_decorator_1 = require("./lib/entraID/decorators/roles.decorator");
|
|
65
|
+
Object.defineProperty(exports, "Roles", { enumerable: true, get: function () { return roles_decorator_1.Roles; } });
|
|
66
|
+
const utils_1 = require("./lib/entraID/utils");
|
|
67
|
+
Object.defineProperty(exports, "CookieUtils", { enumerable: true, get: function () { return utils_1.CookieUtils; } });
|
|
68
|
+
Object.defineProperty(exports, "TokenUtils", { enumerable: true, get: function () { return utils_1.TokenUtils; } });
|
|
69
|
+
const security_service_1 = require("./lib/entraID/security/security.service");
|
|
70
|
+
Object.defineProperty(exports, "SecurityService", { enumerable: true, get: function () { return security_service_1.SecurityService; } });
|
|
71
|
+
const entraID_exception_1 = require("./lib/entraID/customError/entraID.exception");
|
|
72
|
+
Object.defineProperty(exports, "EntraIDException", { enumerable: true, get: function () { return entraID_exception_1.EntraIDException; } });
|
|
49
73
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAuD;AA2DrD,4FA3DO,0BAAW,OA2DP;AA1Db,6CAA0C;AA2DxC,sFA3DO,aAAK,OA2DP;AA1DP,kFAAsE;AA2DpE,0FA3DO,8BAAS,OA2DP;AAzDX,iEAA6D;AA0D3D,8FA1DO,8BAAa,OA0DP;AAzDf,mDAAgD;AA0D9C,wFA1DO,iBAAO,OA0DP;AAzDT,kFAAsE;AA0DpE,yFA1DO,4BAAQ,OA0DP;AAxDV,4DAAwD;AAyDtD,4FAzDO,0BAAW,OAyDP;AAxDb,gDAA6C;AAyD3C,uFAzDO,eAAM,OAyDP;AAxDR,6EAAiE;AAyD/D,uFAzDO,wBAAM,OAyDP;AAvDR,2DAAuD;AAwDrD,4FAxDO,0BAAW,OAwDP;AAvDb,6CAA0C;AAwDxC,sFAxDO,aAAK,OAwDP;AAvDP,4EAAgE;AAwD9D,uFAxDO,wBAAM,OAwDP;AAtDR,8DAA0D;AAuDxD,6FAvDO,4BAAY,OAuDP;AAtDd,gDAA6C;AAuD3C,uFAvDO,eAAM,OAuDP;AAtDR,+EAAmE;AAuDjE,wFAvDO,0BAAO,OAuDP;AArDT,2DAAuD;AAsDrD,4FAtDO,0BAAW,OAsDP;AArDb,6CAA0C;AAsDxC,sFAtDO,aAAK,OAsDP;AArDP,4EAAgE;AAsD9D,uFAtDO,wBAAM,OAsDP;AArDR,uEAAmE;AAsDjE,gGAtDO,kCAAe,OAsDP;AArDjB,yDAAsD;AAsDpD,0FAtDO,qBAAS,OAsDP;AArDX,wFAGwD;AAmDtD,yFArDA,8BAAQ,OAqDA;AACR,0FArDA,+BAAS,OAqDA;AAnDX,wEAK8C;AAiD5C,0FAnDA,yBAAS,OAmDA;AAhDX,iEAA8E;AAkD5E,8FAlDO,8BAAa,OAkDP;AAEb,gGApDsB,gCAAe,OAoDtB;AAlDjB,mEAA+D;AAmD7D,+FAnDO,gCAAc,OAmDP;AAlDhB,4EAAuE;AAmDrE,+FAnDO,iCAAc,OAmDP;AAlDhB,kEAA8D;AAmD5D,2FAnDO,wBAAU,OAmDP;AAlDZ,gGAA2F;AAmDzF,qGAnDO,6CAAoB,OAmDP;AAlDtB,4FAA8E;AAmD5E,4FAnDO,oCAAW,OAmDP;AAlDb,gFAAmE;AAmDjE,uFAnDO,yBAAM,OAmDP;AAlDR,8EAAiE;AAmD/D,sFAnDO,uBAAK,OAmDP;AAlDP,+CAA8D;AAmD5D,4FAnDO,mBAAW,OAmDP;AACX,2FApDoB,kBAAU,OAoDpB;AAnDZ,8EAA0E;AAoDxE,gGApDO,kCAAe,OAoDP;AAnDjB,mFAA+E;AAoD7E,iGApDO,oCAAgB,OAoDP"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CurrentUser: <T = Record<string, unknown>>(...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|