emilsoftware-utilities 2.0.0-dev.67 → 2.0.0-dev.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/accessi/resource-server/errors.d.ts +1 -1
  2. package/dist/accessi/resource-server/errors.js.map +1 -1
  3. package/dist/accessi/resource-server/express.js +21 -0
  4. package/dist/accessi/resource-server/express.js.map +1 -1
  5. package/dist/accessi/resource-server/nest.js +13 -0
  6. package/dist/accessi/resource-server/nest.js.map +1 -1
  7. package/dist/accessi/resource-server/runtime.js +11 -1
  8. package/dist/accessi/resource-server/runtime.js.map +1 -1
  9. package/dist/accessi/resource-server/types.d.ts +7 -0
  10. package/dist/accessi/resource-server/types.js.map +1 -1
  11. package/dist/accessi/server/index.d.ts +1 -0
  12. package/dist/accessi/server/index.js +1 -0
  13. package/dist/accessi/server/index.js.map +1 -1
  14. package/dist/accessi/server/standalone.d.ts +41 -0
  15. package/dist/accessi/server/standalone.js +264 -0
  16. package/dist/accessi/server/standalone.js.map +1 -0
  17. package/dist/accessi-module/AccessiModule.d.ts +53 -2
  18. package/dist/accessi-module/AccessiModule.js +5 -2
  19. package/dist/accessi-module/AccessiModule.js.map +1 -1
  20. package/dist/accessi-module/Console/accessiFetch.d.ts +5 -0
  21. package/dist/accessi-module/Console/accessiFetch.js +7 -4
  22. package/dist/accessi-module/Console/accessiFetch.js.map +1 -1
  23. package/dist/accessi-module/Console/console.js +21 -7
  24. package/dist/accessi-module/Console/generated/emilsoftware-utilities.d.ts +31 -1
  25. package/dist/accessi-module/Console/generated/emilsoftware-utilities.js +28 -3
  26. package/dist/accessi-module/Console/generated/emilsoftware-utilities.js.map +1 -1
  27. package/dist/accessi-module/Console/generated/model/exchangeFederatedIdentityRequest.d.ts +12 -0
  28. package/dist/accessi-module/Console/generated/model/exchangeFederatedIdentityRequest.js +9 -0
  29. package/dist/accessi-module/Console/generated/model/exchangeFederatedIdentityRequest.js.map +1 -0
  30. package/dist/accessi-module/Console/generated/model/federatedAuthenticationResultDto.d.ts +15 -0
  31. package/dist/accessi-module/Console/generated/model/federatedAuthenticationResultDto.js +3 -0
  32. package/dist/accessi-module/Console/generated/model/federatedAuthenticationResultDto.js.map +1 -0
  33. package/dist/accessi-module/Console/generated/model/federatedExchangeResponse.d.ts +14 -0
  34. package/dist/accessi-module/Console/generated/model/federatedExchangeResponse.js +3 -0
  35. package/dist/accessi-module/Console/generated/model/federatedExchangeResponse.js.map +1 -0
  36. package/dist/accessi-module/Console/generated/model/index.d.ts +6 -0
  37. package/dist/accessi-module/Console/generated/model/index.js +6 -0
  38. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  39. package/dist/accessi-module/Console/generated/model/loginResult.d.ts +2 -0
  40. package/dist/accessi-module/Console/generated/model/loginResult.js.map +1 -1
  41. package/dist/accessi-module/Console/generated/model/refreshTokenRequest.d.ts +10 -0
  42. package/dist/accessi-module/Console/generated/model/refreshTokenRequest.js +9 -0
  43. package/dist/accessi-module/Console/generated/model/refreshTokenRequest.js.map +1 -0
  44. package/dist/accessi-module/Console/generated/model/refreshTokenResponse.d.ts +14 -0
  45. package/dist/accessi-module/Console/generated/model/refreshTokenResponse.js +3 -0
  46. package/dist/accessi-module/Console/generated/model/refreshTokenResponse.js.map +1 -0
  47. package/dist/accessi-module/Console/generated/model/refreshTokenResult.d.ts +13 -0
  48. package/dist/accessi-module/Console/generated/model/refreshTokenResult.js +3 -0
  49. package/dist/accessi-module/Console/generated/model/refreshTokenResult.js.map +1 -0
  50. package/dist/accessi-module/Console/wiki.js +16 -3
  51. package/dist/accessi-module/Console/wiki.js.map +1 -1
  52. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +6 -1
  53. package/dist/accessi-module/Controllers/AccessiConsoleController.js +24 -1
  54. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -1
  55. package/dist/accessi-module/Controllers/AuthController.d.ts +3 -1
  56. package/dist/accessi-module/Controllers/AuthController.js +90 -8
  57. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  58. package/dist/accessi-module/Controllers/ConsoleEntryController.d.ts +2 -0
  59. package/dist/accessi-module/Controllers/ConsoleEntryController.js +11 -3
  60. package/dist/accessi-module/Controllers/ConsoleEntryController.js.map +1 -1
  61. package/dist/accessi-module/Controllers/EmailController.js +1 -1
  62. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  63. package/dist/accessi-module/Controllers/UserController.js +1 -1
  64. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  65. package/dist/accessi-module/Dtos/FederatedExchangeDtos.d.ts +21 -0
  66. package/dist/accessi-module/Dtos/FederatedExchangeDtos.js +74 -0
  67. package/dist/accessi-module/Dtos/FederatedExchangeDtos.js.map +1 -0
  68. package/dist/accessi-module/Dtos/LoginResponse.d.ts +1 -0
  69. package/dist/accessi-module/Dtos/LoginResponse.js +6 -0
  70. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  71. package/dist/accessi-module/Dtos/RefreshTokenDtos.d.ts +12 -0
  72. package/dist/accessi-module/Dtos/RefreshTokenDtos.js +50 -0
  73. package/dist/accessi-module/Dtos/RefreshTokenDtos.js.map +1 -0
  74. package/dist/accessi-module/Dtos/index.d.ts +2 -0
  75. package/dist/accessi-module/Dtos/index.js +2 -0
  76. package/dist/accessi-module/Dtos/index.js.map +1 -1
  77. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +14 -0
  78. package/dist/accessi-module/Services/AuthService/AuthService.js +99 -6
  79. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  80. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js +8 -16
  81. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js.map +1 -1
  82. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.d.ts +15 -0
  83. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js +85 -0
  84. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js.map +1 -0
  85. package/dist/accessi-module/federated-auth/FederatedAuthService.js +7 -1
  86. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -1
  87. package/dist/accessi-module/index.d.ts +17 -1
  88. package/dist/accessi-module/index.js +71 -5
  89. package/dist/accessi-module/index.js.map +1 -1
  90. package/dist/accessi-module/jwt/jwt.strategy.js +4 -0
  91. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  92. package/dist/accessi-module/middleware/authenticateGen.js +4 -0
  93. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  94. package/dist/accessi-module/security/audit.d.ts +7 -0
  95. package/dist/accessi-module/security/audit.js +14 -0
  96. package/dist/accessi-module/security/audit.js.map +1 -0
  97. package/dist/accessi-module/security/authenticatedToken.d.ts +1 -1
  98. package/dist/accessi-module/security/authenticatedToken.js +3 -3
  99. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  100. package/dist/accessi-module/security/consoleEntry.d.ts +58 -11
  101. package/dist/accessi-module/security/consoleEntry.js +181 -31
  102. package/dist/accessi-module/security/consoleEntry.js.map +1 -1
  103. package/dist/accessi-module/security/edgeRateLimit.d.ts +33 -0
  104. package/dist/accessi-module/security/edgeRateLimit.js +81 -0
  105. package/dist/accessi-module/security/edgeRateLimit.js.map +1 -0
  106. package/dist/accessi-module/security/jwks.d.ts +33 -0
  107. package/dist/accessi-module/security/jwks.js +83 -0
  108. package/dist/accessi-module/security/jwks.js.map +1 -0
  109. package/dist/accessi-module/security/jwksBootstrap.d.ts +15 -0
  110. package/dist/accessi-module/security/jwksBootstrap.js +44 -0
  111. package/dist/accessi-module/security/jwksBootstrap.js.map +1 -0
  112. package/dist/accessi-module/security/jwtTokenOptions.d.ts +9 -2
  113. package/dist/accessi-module/security/jwtTokenOptions.js +18 -4
  114. package/dist/accessi-module/security/jwtTokenOptions.js.map +1 -1
  115. package/dist/accessi-module/security/passwordResetToken.d.ts +1 -1
  116. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  117. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +9 -7
  118. package/dist/accessi-module/security/publicAuthRateLimit.js +55 -78
  119. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  120. package/dist/accessi-module/security/rateLimitStore.d.ts +34 -0
  121. package/dist/accessi-module/security/rateLimitStore.js +145 -0
  122. package/dist/accessi-module/security/rateLimitStore.js.map +1 -0
  123. package/dist/accessi-module/security/refreshTokenRotation.d.ts +40 -0
  124. package/dist/accessi-module/security/refreshTokenRotation.js +91 -0
  125. package/dist/accessi-module/security/refreshTokenRotation.js.map +1 -0
  126. package/dist/accessi-module/security/serviceTokenGuard.d.ts +3 -1
  127. package/dist/accessi-module/security/serviceTokenGuard.js +11 -6
  128. package/dist/accessi-module/security/serviceTokenGuard.js.map +1 -1
  129. package/dist/accessi-module/security/serviceTokenRateLimit.d.ts +5 -4
  130. package/dist/accessi-module/security/serviceTokenRateLimit.js +33 -29
  131. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +1 -1
  132. package/dist/accessi-module/security/sessionRevocation.d.ts +52 -0
  133. package/dist/accessi-module/security/sessionRevocation.js +124 -0
  134. package/dist/accessi-module/security/sessionRevocation.js.map +1 -0
  135. package/dist/accessi-module/security/validateOptions.d.ts +19 -0
  136. package/dist/accessi-module/security/validateOptions.js +115 -0
  137. package/dist/accessi-module/security/validateOptions.js.map +1 -0
  138. package/dist/emilsoftware-utilities-2.0.0-dev.69.tgz +0 -0
  139. package/dist/initEmilsoftwareModule.js +39 -3
  140. package/dist/initEmilsoftwareModule.js.map +1 -1
  141. package/dist/scripts/startAccessiService.d.ts +1 -0
  142. package/dist/scripts/startAccessiService.js +11 -0
  143. package/dist/scripts/startAccessiService.js.map +1 -0
  144. package/docs/accessi-openapi-fingerprint.json +190 -0
  145. package/docs/gateway-rate-limit.md +98 -0
  146. package/docs/standalone-service.md +176 -0
  147. package/integration-prompt.md +299 -8
  148. package/package.json +11 -5
  149. package/dist/emilsoftware-utilities-2.0.0-dev.67.tgz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"FederatedAuthService.js","sourceRoot":"","sources":["../../../src/accessi-module/federated-auth/FederatedAuthService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, ForbiddenException, Inject, Injectable, InternalServerErrorException, NotFoundException, OnModuleInit, ServiceUnavailableException } from '@nestjs/common';\nimport { createHash } from 'crypto';\nimport { AccessiDatabaseUpdater } from '../database-updates/AccessiDatabaseUpdater';\nimport { Orm } from '../../Orm';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { RegisterRequest } from '../Dtos/RegisterRequest';\nimport { StatoRegistrazione } from '../Dtos/StatoRegistrazione';\nimport { AuthService } from '../Services/AuthService/AuthService';\nimport { UserService } from '../Services/UserService/UserService';\nimport { isAuthenticatedUserEnabledForJwt } from '../security/authenticatedToken';\nimport { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './FederatedAuthTypes';\n\ntype IdentityRow = {\n identityKey?: string;\n codiceUtente?: number;\n provider?: string;\n subject?: string;\n active?: unknown;\n createdAt?: Date | string;\n lastLoginAt?: Date | string;\n disabledAt?: Date | string;\n note?: string;\n passwordLoginEnabled?: unknown;\n};\n\ntype ProviderRow = {\n provider?: string;\n description?: string;\n active?: unknown;\n createdAt?: Date | string;\n note?: string;\n};\n\n/**\n * Maps externally verified identities to Accessi users and issues the usual\n * Accessi JWT. It deliberately has no provider SDK dependency: validating an\n * Azure, Google, Apple, SAML, or custom token is always the hosting backend's job.\n */\n@Injectable()\nexport class FederatedAuthService implements OnModuleInit {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions,\n private readonly userService: UserService,\n private readonly authService: AuthService,\n ) {}\n\n /** Await the same schema barrier as the module updater; never race two DDL implementations. */\n async onModuleInit(): Promise<void> {\n await AccessiDatabaseUpdater.initialize(this.options);\n }\n\n /** Returns true only when the host application opted in to federated authentication. */\n isEnabled(): boolean {\n return this.options.federatedAuthentication?.enabled === true;\n }\n\n /**\n * Exchanges a backend-verified identity for the same login result and JWT\n * emitted by the local password endpoint. No raw external token is accepted.\n */\n async authenticate(identity: VerifiedFederatedIdentity): Promise<FederatedAuthenticationResult> {\n this.assertEnabled();\n const normalized = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalized.provider);\n const linkedIdentity = await this.findIdentity(normalized, true);\n\n if (!linkedIdentity) {\n throw new NotFoundException({ code: 'FEDERATED_IDENTITY_NOT_LINKED', message: 'Identita esterna non associata a un utente Accessi.' });\n }\n\n const currentUser = await this.userService.getAuthenticatedUserSnapshot(linkedIdentity.codiceUtente);\n if (!isAuthenticatedUserEnabledForJwt(currentUser)) {\n throw new ForbiddenException({ code: 'FEDERATED_USER_DISABLED', message: 'Utente Accessi non abilitato.' });\n }\n\n if (currentUser.flagDueFattori) {\n const login = await this.authService.beginFederatedTwoFactor(linkedIdentity.codiceUtente, linkedIdentity.identityKey);\n return { codiceUtente: linkedIdentity.codiceUtente, login };\n }\n\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET DATLASTLOGIN = CURRENT_TIMESTAMP WHERE IDNKEY = ?',\n [linkedIdentity.identityKey],\n );\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI SET DATLASTLOGIN = CURRENT_TIMESTAMP WHERE CODUTE = ?',\n [linkedIdentity.codiceUtente],\n );\n\n const login = await this.authService.getLoginResultForUser(linkedIdentity.codiceUtente);\n return {\n codiceUtente: linkedIdentity.codiceUtente,\n login,\n token: this.authService.createAccessiToken(login.utente, ['federated']),\n };\n }\n\n /** Links an external identity to an existing Accessi user. It never changes that user's password policy. */\n async linkIdentity(codiceUtente: number, identity: VerifiedFederatedIdentity, note?: string): Promise<FederatedIdentity> {\n this.assertEnabled();\n await this.assertUserExists(codiceUtente);\n const normalized = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalized.provider);\n const existing = await this.findIdentity(normalized, false);\n\n if (existing && existing.codiceUtente !== codiceUtente) {\n throw new ConflictException({ code: 'FEDERATED_IDENTITY_ALREADY_LINKED', message: 'Identita esterna gia associata a un altro utente.' });\n }\n\n if (existing) {\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET FLGATTIVO = 1, DATDISATT = NULL, NOTA = ? WHERE IDNKEY = ?',\n [note ?? existing.note ?? null, existing.identityKey],\n );\n } else {\n await Orm.execute(\n this.options.databaseOptions,\n `INSERT INTO UTENTI_IDENTITA_EXT (IDNKEY, CODUTE, PROVIDER, SUBJECT, FLGATTIVO, NOTA)\n VALUES (?, ?, ?, ?, 1, ?)`,\n [this.getIdentityKey(normalized), codiceUtente, normalized.provider, normalized.subject, note ?? null],\n );\n }\n\n return (await this.findIdentity(normalized, false))!;\n }\n\n /** Creates a confirmed Accessi user, associates an SSO identity and defaults the new user to SSO-only. */\n async createManagedFederatedUser(\n registrationData: RegisterRequest,\n identity: VerifiedFederatedIdentity,\n passwordLoginEnabled = false,\n note?: string,\n ): Promise<FederatedIdentity> {\n this.assertEnabled();\n const normalizedIdentity = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalizedIdentity.provider);\n if (await this.findIdentity(normalizedIdentity, false)) {\n throw new ConflictException({ code: 'FEDERATED_IDENTITY_ALREADY_LINKED', message: 'Identità esterna già associata a un utente Accessi.' });\n }\n\n try {\n const codiceUtente = await this.userService.register(registrationData, {\n allowPrivilegedFields: true,\n initialState: StatoRegistrazione.CONF,\n });\n await this.setPasswordLoginEnabled(codiceUtente, passwordLoginEnabled);\n return await this.linkIdentity(codiceUtente, normalizedIdentity, note);\n } catch (error) {\n if (error instanceof BadRequestException || error instanceof ConflictException || error instanceof ForbiddenException || error instanceof NotFoundException || error instanceof ServiceUnavailableException) {\n throw error;\n }\n if (RestUtilities.isDatabaseSchemaError(error)) {\n throw new ServiceUnavailableException({ code: 'ACCESSI_DATABASE_SCHEMA_OUTDATED', message: 'Lo schema del database Accessi non è aggiornato. Eseguire la migrazione database e riprovare.' });\n }\n throw new InternalServerErrorException({ code: 'FEDERATED_USER_PROVISIONING_FAILED', message: 'La creazione dell’utente SSO non è stata completata. Verificare il log del backend e l’eventuale utente creato senza identità SSO.' });\n }\n }\n\n /**\n * Allows self-provisioning only when explicitly enabled. The caller must have\n * verified the external identity and decide which profile fields are trusted.\n */\n async registerSelfServiceFederatedUser(\n registrationData: RegisterRequest,\n identity: VerifiedFederatedIdentity,\n ): Promise<FederatedIdentity> {\n this.assertEnabled();\n if (this.options.federatedAuthentication?.allowSelfRegistration !== true) {\n throw new ForbiddenException({ code: 'FEDERATED_SELF_REGISTRATION_DISABLED', message: 'Auto-registrazione SSO non abilitata.' });\n }\n\n const codiceUtente = await this.userService.register(registrationData, {\n allowPrivilegedFields: false,\n initialState: StatoRegistrazione.CONF,\n });\n await this.setPasswordLoginEnabled(codiceUtente, false);\n return this.linkIdentity(codiceUtente, identity);\n }\n\n /** Returns all linked identities for administration; disabled identities are included. */\n async getUserIdentities(codiceUtente: number): Promise<FederatedIdentity[]> {\n this.assertEnabled();\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT I.IDNKEY AS identity_key, I.CODUTE AS codice_utente, I.PROVIDER, I.SUBJECT,\n I.FLGATTIVO AS active, I.DATINS AS created_at, I.DATLASTLOGIN AS last_login_at,\n I.DATDISATT AS disabled_at, I.NOTA,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI_IDENTITA_EXT I\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = I.CODUTE\n WHERE I.CODUTE = ?\n ORDER BY I.DATINS DESC`,\n [codiceUtente],\n );\n return rows.map(RestUtilities.convertKeysToCamelCase).map((row: IdentityRow) => this.toIdentity(row));\n }\n\n /** Returns the complete provider catalog, including inactive providers, for superuser administration. */\n async getProviders(): Promise<FederatedProvider[]> {\n this.assertEnabled();\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT PROVIDER AS provider, DESCRIZIONE AS description, FLGATTIVO AS active,\n DATINS AS created_at, NOTA AS note\n FROM SSO_PROVIDER\n ORDER BY FLGATTIVO DESC, DESCRIZIONE, PROVIDER`,\n );\n return rows.map(RestUtilities.convertKeysToCamelCase).map((row: ProviderRow) => this.toProvider(row));\n }\n\n /** Registers a provider key that must match the backend's SSO configuration exactly. */\n async createProvider(input: { provider: string; description: string; note?: string }): Promise<FederatedProvider> {\n this.assertEnabled();\n const provider = this.normalizeProvider(input.provider);\n const description = this.normalizeDescription(input.description);\n const existing = await this.findProvider(provider);\n if (existing) {\n throw new ConflictException({ code: 'FEDERATED_PROVIDER_ALREADY_EXISTS', message: 'Il provider SSO è già registrato.' });\n }\n await Orm.execute(\n this.options.databaseOptions,\n 'INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO, NOTA) VALUES (?, ?, 1, ?)',\n [provider, description, input.note?.trim() || null],\n );\n return (await this.findProvider(provider))!;\n }\n\n /** Updates provider metadata or disables the provider without removing its identity history. */\n /**\n * Aggiorna metadati amministrativi del catalogo. La chiave provider e immutabile perche parte dell'identita\n * persistita e deve coincidere esattamente con la configurazione del backend validante.\n */\n async updateProvider(providerValue: string, update: { description?: string; active?: boolean; note?: string }): Promise<FederatedProvider> {\n this.assertEnabled();\n const provider = this.normalizeProvider(providerValue);\n if (!(await this.findProvider(provider))) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n const changes: string[] = [];\n const params: unknown[] = [];\n if (update.description !== undefined) {\n changes.push('DESCRIZIONE = ?');\n params.push(this.normalizeDescription(update.description));\n }\n if (update.active !== undefined) {\n changes.push('FLGATTIVO = ?');\n params.push(update.active ? 1 : 0);\n }\n if (update.note !== undefined) {\n changes.push('NOTA = ?');\n params.push(update.note.trim() || null);\n }\n if (changes.length > 0) {\n params.push(provider);\n await Orm.execute(this.options.databaseOptions, `UPDATE SSO_PROVIDER SET ${changes.join(', ')} WHERE PROVIDER = ?`, params);\n }\n return (await this.findProvider(provider))!;\n }\n\n /**\n * Elimina un provider dal catalogo. Consentito solo se nessuna identita lo referenzia: la FK\n * `FK_UTEIDEXT_PROVIDER` impedirebbe comunque la delete, ma verifichiamo prima per restituire un\n * messaggio amministrativo chiaro. I collegamenti storici vanno rimossi o il provider disabilitato.\n */\n async deleteProvider(providerValue: string): Promise<void> {\n this.assertEnabled();\n const provider = this.normalizeProvider(providerValue);\n if (!(await this.findProvider(provider))) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n const usage = await Orm.query(\n this.options.databaseOptions,\n 'SELECT COUNT(*) AS total FROM UTENTI_IDENTITA_EXT WHERE PROVIDER = ?',\n [provider],\n );\n const rawTotal = (usage?.[0] as Record<string, unknown> | undefined)?.TOTAL\n ?? (usage?.[0] as Record<string, unknown> | undefined)?.total;\n const total = typeof rawTotal === 'number' ? rawTotal : Number.parseInt(`${rawTotal ?? '0'}`, 10);\n if (total > 0) {\n throw new ConflictException({\n code: 'FEDERATED_PROVIDER_IN_USE',\n message: `Impossibile eliminare il provider ${provider}: ${total} identita collegate. Disabilitalo oppure rimuovi prima i collegamenti.`,\n });\n }\n await Orm.execute(this.options.databaseOptions, 'DELETE FROM SSO_PROVIDER WHERE PROVIDER = ?', [provider]);\n }\n\n /** Enables or disables all local password authentication for one user. */\n /**\n * Imposta la policy di login locale. `false` non rimuove password ne identita SSO: blocca solo il percorso\n * email/password, che restituisce `PASSWORD_LOGIN_DISABLED`. L'assenza della riga mantiene il default legacy `true`.\n */\n async setPasswordLoginEnabled(codiceUtente: number, enabled: boolean): Promise<void> {\n this.assertEnabled();\n await this.assertUserExists(codiceUtente);\n // Upsert: per utenti legacy senza riga in UTENTI_CONFIG una UPDATE a vuoto\n // lasciava la policy al default, rendendo la disattivazione un no-op silenzioso.\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE OR INSERT INTO UTENTI_CONFIG (CODUTE, FLGPASSWORD) VALUES (?, ?) MATCHING (CODUTE)',\n [codiceUtente, enabled ? 1 : 0],\n );\n }\n\n /** Returns the effective local password policy. Users without a policy row retain the historic enabled default. */\n /** Restituisce la policy effettiva; utenti precedenti alla migrazione restano abilitati alla password. */\n async isPasswordLoginEnabled(codiceUtente: number): Promise<boolean> {\n if (!this.isEnabled()) return true;\n const rows = await Orm.query(\n this.options.databaseOptions,\n 'SELECT COALESCE(FLGPASSWORD, 1) AS password_login_enabled FROM UTENTI_CONFIG WHERE CODUTE = ?',\n [codiceUtente],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as IdentityRow | undefined;\n return row?.passwordLoginEnabled !== false && row?.passwordLoginEnabled !== 0 && row?.passwordLoginEnabled !== '0';\n }\n\n /** Soft-disables a linked identity without deleting operational history. */\n /** Disabilita logicamente un collegamento SSO conservando audit e possibilita di successiva riattivazione. */\n async disableIdentity(identityKey: string): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET FLGATTIVO = 0, DATDISATT = CURRENT_TIMESTAMP WHERE IDNKEY = ?',\n [identityKey],\n );\n }\n\n /** Restituisce il CODUTE proprietario di un collegamento SSO, o null se assente. */\n async getIdentityOwner(identityKey: string): Promise<number | null> {\n this.assertIdentityKey(identityKey);\n const rows = (await Orm.query(\n this.options.databaseOptions,\n 'SELECT CODUTE AS codice_utente FROM UTENTI_IDENTITA_EXT WHERE IDNKEY = ?',\n [identityKey],\n )) as Array<Record<string, unknown>>;\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as { codiceUtente?: number } | undefined;\n const owner = Number(row?.codiceUtente);\n return Number.isSafeInteger(owner) && owner > 0 ? owner : null;\n }\n\n /** Permanently removes one identity link from its owning user after administrative confirmation. */\n /**\n * Elimina fisicamente un collegamento SSO soltanto dopo aver verificato che appartenga all'utente indicato.\n * Non elimina mai l'utente Accessi, password, ruoli o grant associati.\n */\n async deleteIdentity(codiceUtente: number, identityKey: string): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n const identity = (await this.getUserIdentities(codiceUtente)).find((item) => item.identityKey === identityKey);\n if (!identity) {\n throw new NotFoundException({ code: 'FEDERATED_IDENTITY_NOT_FOUND', message: 'Collegamento SSO non trovato per questo utente.' });\n }\n await Orm.execute(\n this.options.databaseOptions,\n 'DELETE FROM UTENTI_IDENTITA_EXT WHERE IDNKEY = ? AND CODUTE = ?',\n [identityKey, codiceUtente],\n );\n }\n\n /** Aggiorna lo stato o la nota di un collegamento SSO usando la sua chiave tecnica amministrativa. */\n /** Aggiorna stato o nota amministrativa senza modificare provider e subject, che identificano la persona. */\n async updateIdentity(identityKey: string, update: { active?: boolean; note?: string }): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n const changes: string[] = [];\n const params: unknown[] = [];\n if (update.active !== undefined) {\n changes.push('FLGATTIVO = ?');\n params.push(update.active ? 1 : 0);\n if (update.active) changes.push('DATDISATT = NULL');\n else changes.push('DATDISATT = CURRENT_TIMESTAMP');\n }\n if (update.note !== undefined) {\n changes.push('NOTA = ?');\n params.push(update.note);\n }\n if (changes.length === 0) return;\n params.push(identityKey);\n await Orm.execute(this.options.databaseOptions, `UPDATE UTENTI_IDENTITA_EXT SET ${changes.join(', ')} WHERE IDNKEY = ?`, params);\n }\n\n /** Explicit administrative schema reconciliation, shared with the standard updater. */\n async ensureSchema(): Promise<void> {\n if (this.isEnabled()) await AccessiDatabaseUpdater.run(this.options);\n }\n\n private async findIdentity(identity: VerifiedFederatedIdentity, onlyActive: boolean): Promise<FederatedIdentity | null> {\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT I.IDNKEY AS identity_key, I.CODUTE AS codice_utente, I.PROVIDER, I.SUBJECT,\n I.FLGATTIVO AS active, I.DATINS AS created_at, I.DATLASTLOGIN AS last_login_at,\n I.DATDISATT AS disabled_at, I.NOTA,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI_IDENTITA_EXT I\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = I.CODUTE\n WHERE I.IDNKEY = ? AND I.PROVIDER = ? AND I.SUBJECT = ?${onlyActive ? ' AND I.FLGATTIVO = 1' : ''}`,\n [this.getIdentityKey(identity), identity.provider, identity.subject],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as IdentityRow | undefined;\n return row ? this.toIdentity(row) : null;\n }\n\n private async assertUserExists(codiceUtente: number): Promise<void> {\n const user = await this.userService.getAuthenticatedUserSnapshot(codiceUtente);\n if (!user) throw new NotFoundException('Utente Accessi non trovato.');\n }\n\n private assertEnabled(): void {\n if (!this.isEnabled()) {\n throw new ForbiddenException({ code: 'FEDERATED_AUTH_DISABLED', message: 'Autenticazione federata non abilitata in AccessiOptions.' });\n }\n }\n\n /** Validates the opaque SHA-256 key used only by administrative identity endpoints. */\n private assertIdentityKey(identityKey: string): void {\n if (!/^[a-f0-9]{64}$/i.test(identityKey)) {\n throw new BadRequestException({ code: 'FEDERATED_IDENTITY_KEY_INVALID', message: 'Chiave del collegamento SSO non valida.' });\n }\n }\n\n private normalizeIdentity(identity: VerifiedFederatedIdentity): VerifiedFederatedIdentity {\n const provider = this.normalizeProvider(identity?.provider);\n const subject = typeof identity?.subject === 'string' ? identity.subject.trim() : '';\n if (!subject || Buffer.byteLength(subject, 'utf8') > 512) {\n throw new BadRequestException({ code: 'FEDERATED_SUBJECT_INVALID', message: 'Subject non valido: è obbligatorio e può occupare al massimo 512 byte UTF-8.' });\n }\n return { provider, subject };\n }\n\n private normalizeProvider(value: unknown): string {\n const provider = typeof value === 'string' ? value.trim().toLowerCase() : '';\n if (!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(provider)) {\n throw new BadRequestException({ code: 'FEDERATED_PROVIDER_INVALID', message: 'Provider non valido: usare un namespace ASCII stabile di massimo 64 caratteri.' });\n }\n return provider;\n }\n\n private normalizeDescription(value: unknown): string {\n const description = typeof value === 'string' ? value.trim() : '';\n if (!description || description.length > 160) {\n throw new BadRequestException({ code: 'FEDERATED_PROVIDER_DESCRIPTION_INVALID', message: 'La descrizione del provider deve contenere da 1 a 160 caratteri.' });\n }\n return description;\n }\n\n private async assertProviderActive(provider: string): Promise<FederatedProvider> {\n const registered = await this.findProvider(provider);\n if (!registered) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n if (!registered.active) {\n throw new ForbiddenException({ code: 'FEDERATED_PROVIDER_DISABLED', message: 'Provider SSO disabilitato.' });\n }\n return registered;\n }\n\n private async findProvider(provider: string): Promise<FederatedProvider | null> {\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT PROVIDER AS provider, DESCRIZIONE AS description, FLGATTIVO AS active,\n DATINS AS created_at, NOTA AS note\n FROM SSO_PROVIDER\n WHERE PROVIDER = ?`,\n [provider],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as ProviderRow | undefined;\n return row ? this.toProvider(row) : null;\n }\n\n private getIdentityKey(identity: VerifiedFederatedIdentity): string {\n const provider = Buffer.from(identity.provider, 'utf8');\n const subject = Buffer.from(identity.subject, 'utf8');\n const payload = Buffer.concat([Buffer.from('accessi:federated:v1:'), Buffer.from(`${provider.length}:`), provider, Buffer.from(`${subject.length}:`), subject]);\n return createHash('sha256').update(payload).digest('hex');\n }\n\n private toIdentity(row: IdentityRow): FederatedIdentity {\n return {\n identityKey: String(row.identityKey),\n codiceUtente: Number(row.codiceUtente),\n provider: String(row.provider).trim(),\n subject: String(row.subject),\n active: row.active === true || row.active === 1 || row.active === '1',\n passwordLoginEnabled: !(row.passwordLoginEnabled === false || row.passwordLoginEnabled === 0 || row.passwordLoginEnabled === '0'),\n createdAt: row.createdAt,\n lastLoginAt: row.lastLoginAt,\n disabledAt: row.disabledAt,\n note: row.note,\n };\n }\n\n private toProvider(row: ProviderRow): FederatedProvider {\n return {\n provider: String(row.provider).trim(),\n description: String(row.description ?? '').trim(),\n active: row.active === true || row.active === 1 || row.active === '1',\n createdAt: row.createdAt,\n note: row.note,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"FederatedAuthService.js","sourceRoot":"","sources":["../../../src/accessi-module/federated-auth/FederatedAuthService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, ForbiddenException, Inject, Injectable, InternalServerErrorException, NotFoundException, OnModuleInit, ServiceUnavailableException } from '@nestjs/common';\nimport { createHash } from 'crypto';\nimport { AccessiDatabaseUpdater } from '../database-updates/AccessiDatabaseUpdater';\nimport { Orm } from '../../Orm';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { RegisterRequest } from '../Dtos/RegisterRequest';\nimport { StatoRegistrazione } from '../Dtos/StatoRegistrazione';\nimport { AuthService } from '../Services/AuthService/AuthService';\nimport { UserService } from '../Services/UserService/UserService';\nimport { isAuthenticatedUserEnabledForJwt } from '../security/authenticatedToken';\nimport { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './FederatedAuthTypes';\n\ntype IdentityRow = {\n identityKey?: string;\n codiceUtente?: number;\n provider?: string;\n subject?: string;\n active?: unknown;\n createdAt?: Date | string;\n lastLoginAt?: Date | string;\n disabledAt?: Date | string;\n note?: string;\n passwordLoginEnabled?: unknown;\n};\n\ntype ProviderRow = {\n provider?: string;\n description?: string;\n active?: unknown;\n createdAt?: Date | string;\n note?: string;\n};\n\n/**\n * Maps externally verified identities to Accessi users and issues the usual\n * Accessi JWT. It deliberately has no provider SDK dependency: validating an\n * Azure, Google, Apple, SAML, or custom token is always the hosting backend's job.\n */\n@Injectable()\nexport class FederatedAuthService implements OnModuleInit {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions,\n private readonly userService: UserService,\n private readonly authService: AuthService,\n ) {}\n\n /** Await the same schema barrier as the module updater; never race two DDL implementations. */\n async onModuleInit(): Promise<void> {\n await AccessiDatabaseUpdater.initialize(this.options);\n }\n\n /** Returns true only when the host application opted in to federated authentication. */\n isEnabled(): boolean {\n return this.options.federatedAuthentication?.enabled === true;\n }\n\n /**\n * Exchanges a backend-verified identity for the same login result and JWT\n * emitted by the local password endpoint. No raw external token is accepted.\n */\n async authenticate(identity: VerifiedFederatedIdentity): Promise<FederatedAuthenticationResult> {\n this.assertEnabled();\n const normalized = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalized.provider);\n const linkedIdentity = await this.findIdentity(normalized, true);\n\n if (!linkedIdentity) {\n throw new NotFoundException({ code: 'FEDERATED_IDENTITY_NOT_LINKED', message: 'Identita esterna non associata a un utente Accessi.' });\n }\n\n const currentUser = await this.userService.getAuthenticatedUserSnapshot(linkedIdentity.codiceUtente);\n if (!isAuthenticatedUserEnabledForJwt(currentUser)) {\n throw new ForbiddenException({ code: 'FEDERATED_USER_DISABLED', message: 'Utente Accessi non abilitato.' });\n }\n\n if (currentUser.flagDueFattori) {\n const login = await this.authService.beginFederatedTwoFactor(linkedIdentity.codiceUtente, linkedIdentity.identityKey);\n return { codiceUtente: linkedIdentity.codiceUtente, login };\n }\n\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET DATLASTLOGIN = CURRENT_TIMESTAMP WHERE IDNKEY = ?',\n [linkedIdentity.identityKey],\n );\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI SET DATLASTLOGIN = CURRENT_TIMESTAMP WHERE CODUTE = ?',\n [linkedIdentity.codiceUtente],\n );\n\n const login = await this.authService.getLoginResultForUser(linkedIdentity.codiceUtente);\n const tokens = typeof this.authService.createTokenPair === 'function'\n ? this.authService.createTokenPair(login.utente, ['federated'])\n : { access: this.authService.createAccessiToken(login.utente, ['federated']), refresh: undefined };\n login.token = tokens.access;\n if (tokens.refresh) login.refreshToken = tokens.refresh;\n return {\n codiceUtente: linkedIdentity.codiceUtente,\n login,\n token: tokens.access,\n };\n }\n\n /** Links an external identity to an existing Accessi user. It never changes that user's password policy. */\n async linkIdentity(codiceUtente: number, identity: VerifiedFederatedIdentity, note?: string): Promise<FederatedIdentity> {\n this.assertEnabled();\n await this.assertUserExists(codiceUtente);\n const normalized = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalized.provider);\n const existing = await this.findIdentity(normalized, false);\n\n if (existing && existing.codiceUtente !== codiceUtente) {\n throw new ConflictException({ code: 'FEDERATED_IDENTITY_ALREADY_LINKED', message: 'Identita esterna gia associata a un altro utente.' });\n }\n\n if (existing) {\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET FLGATTIVO = 1, DATDISATT = NULL, NOTA = ? WHERE IDNKEY = ?',\n [note ?? existing.note ?? null, existing.identityKey],\n );\n } else {\n await Orm.execute(\n this.options.databaseOptions,\n `INSERT INTO UTENTI_IDENTITA_EXT (IDNKEY, CODUTE, PROVIDER, SUBJECT, FLGATTIVO, NOTA)\n VALUES (?, ?, ?, ?, 1, ?)`,\n [this.getIdentityKey(normalized), codiceUtente, normalized.provider, normalized.subject, note ?? null],\n );\n }\n\n return (await this.findIdentity(normalized, false))!;\n }\n\n /** Creates a confirmed Accessi user, associates an SSO identity and defaults the new user to SSO-only. */\n async createManagedFederatedUser(\n registrationData: RegisterRequest,\n identity: VerifiedFederatedIdentity,\n passwordLoginEnabled = false,\n note?: string,\n ): Promise<FederatedIdentity> {\n this.assertEnabled();\n const normalizedIdentity = this.normalizeIdentity(identity);\n await this.assertProviderActive(normalizedIdentity.provider);\n if (await this.findIdentity(normalizedIdentity, false)) {\n throw new ConflictException({ code: 'FEDERATED_IDENTITY_ALREADY_LINKED', message: 'Identità esterna già associata a un utente Accessi.' });\n }\n\n try {\n const codiceUtente = await this.userService.register(registrationData, {\n allowPrivilegedFields: true,\n initialState: StatoRegistrazione.CONF,\n });\n await this.setPasswordLoginEnabled(codiceUtente, passwordLoginEnabled);\n return await this.linkIdentity(codiceUtente, normalizedIdentity, note);\n } catch (error) {\n if (error instanceof BadRequestException || error instanceof ConflictException || error instanceof ForbiddenException || error instanceof NotFoundException || error instanceof ServiceUnavailableException) {\n throw error;\n }\n if (RestUtilities.isDatabaseSchemaError(error)) {\n throw new ServiceUnavailableException({ code: 'ACCESSI_DATABASE_SCHEMA_OUTDATED', message: 'Lo schema del database Accessi non è aggiornato. Eseguire la migrazione database e riprovare.' });\n }\n throw new InternalServerErrorException({ code: 'FEDERATED_USER_PROVISIONING_FAILED', message: 'La creazione dell’utente SSO non è stata completata. Verificare il log del backend e l’eventuale utente creato senza identità SSO.' });\n }\n }\n\n /**\n * Allows self-provisioning only when explicitly enabled. The caller must have\n * verified the external identity and decide which profile fields are trusted.\n */\n async registerSelfServiceFederatedUser(\n registrationData: RegisterRequest,\n identity: VerifiedFederatedIdentity,\n ): Promise<FederatedIdentity> {\n this.assertEnabled();\n if (this.options.federatedAuthentication?.allowSelfRegistration !== true) {\n throw new ForbiddenException({ code: 'FEDERATED_SELF_REGISTRATION_DISABLED', message: 'Auto-registrazione SSO non abilitata.' });\n }\n\n const codiceUtente = await this.userService.register(registrationData, {\n allowPrivilegedFields: false,\n initialState: StatoRegistrazione.CONF,\n });\n await this.setPasswordLoginEnabled(codiceUtente, false);\n return this.linkIdentity(codiceUtente, identity);\n }\n\n /** Returns all linked identities for administration; disabled identities are included. */\n async getUserIdentities(codiceUtente: number): Promise<FederatedIdentity[]> {\n this.assertEnabled();\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT I.IDNKEY AS identity_key, I.CODUTE AS codice_utente, I.PROVIDER, I.SUBJECT,\n I.FLGATTIVO AS active, I.DATINS AS created_at, I.DATLASTLOGIN AS last_login_at,\n I.DATDISATT AS disabled_at, I.NOTA,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI_IDENTITA_EXT I\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = I.CODUTE\n WHERE I.CODUTE = ?\n ORDER BY I.DATINS DESC`,\n [codiceUtente],\n );\n return rows.map(RestUtilities.convertKeysToCamelCase).map((row: IdentityRow) => this.toIdentity(row));\n }\n\n /** Returns the complete provider catalog, including inactive providers, for superuser administration. */\n async getProviders(): Promise<FederatedProvider[]> {\n this.assertEnabled();\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT PROVIDER AS provider, DESCRIZIONE AS description, FLGATTIVO AS active,\n DATINS AS created_at, NOTA AS note\n FROM SSO_PROVIDER\n ORDER BY FLGATTIVO DESC, DESCRIZIONE, PROVIDER`,\n );\n return rows.map(RestUtilities.convertKeysToCamelCase).map((row: ProviderRow) => this.toProvider(row));\n }\n\n /** Registers a provider key that must match the backend's SSO configuration exactly. */\n async createProvider(input: { provider: string; description: string; note?: string }): Promise<FederatedProvider> {\n this.assertEnabled();\n const provider = this.normalizeProvider(input.provider);\n const description = this.normalizeDescription(input.description);\n const existing = await this.findProvider(provider);\n if (existing) {\n throw new ConflictException({ code: 'FEDERATED_PROVIDER_ALREADY_EXISTS', message: 'Il provider SSO è già registrato.' });\n }\n await Orm.execute(\n this.options.databaseOptions,\n 'INSERT INTO SSO_PROVIDER (PROVIDER, DESCRIZIONE, FLGATTIVO, NOTA) VALUES (?, ?, 1, ?)',\n [provider, description, input.note?.trim() || null],\n );\n return (await this.findProvider(provider))!;\n }\n\n /** Updates provider metadata or disables the provider without removing its identity history. */\n /**\n * Aggiorna metadati amministrativi del catalogo. La chiave provider e immutabile perche parte dell'identita\n * persistita e deve coincidere esattamente con la configurazione del backend validante.\n */\n async updateProvider(providerValue: string, update: { description?: string; active?: boolean; note?: string }): Promise<FederatedProvider> {\n this.assertEnabled();\n const provider = this.normalizeProvider(providerValue);\n if (!(await this.findProvider(provider))) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n const changes: string[] = [];\n const params: unknown[] = [];\n if (update.description !== undefined) {\n changes.push('DESCRIZIONE = ?');\n params.push(this.normalizeDescription(update.description));\n }\n if (update.active !== undefined) {\n changes.push('FLGATTIVO = ?');\n params.push(update.active ? 1 : 0);\n }\n if (update.note !== undefined) {\n changes.push('NOTA = ?');\n params.push(update.note.trim() || null);\n }\n if (changes.length > 0) {\n params.push(provider);\n await Orm.execute(this.options.databaseOptions, `UPDATE SSO_PROVIDER SET ${changes.join(', ')} WHERE PROVIDER = ?`, params);\n }\n return (await this.findProvider(provider))!;\n }\n\n /**\n * Elimina un provider dal catalogo. Consentito solo se nessuna identita lo referenzia: la FK\n * `FK_UTEIDEXT_PROVIDER` impedirebbe comunque la delete, ma verifichiamo prima per restituire un\n * messaggio amministrativo chiaro. I collegamenti storici vanno rimossi o il provider disabilitato.\n */\n async deleteProvider(providerValue: string): Promise<void> {\n this.assertEnabled();\n const provider = this.normalizeProvider(providerValue);\n if (!(await this.findProvider(provider))) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n const usage = await Orm.query(\n this.options.databaseOptions,\n 'SELECT COUNT(*) AS total FROM UTENTI_IDENTITA_EXT WHERE PROVIDER = ?',\n [provider],\n );\n const rawTotal = (usage?.[0] as Record<string, unknown> | undefined)?.TOTAL\n ?? (usage?.[0] as Record<string, unknown> | undefined)?.total;\n const total = typeof rawTotal === 'number' ? rawTotal : Number.parseInt(`${rawTotal ?? '0'}`, 10);\n if (total > 0) {\n throw new ConflictException({\n code: 'FEDERATED_PROVIDER_IN_USE',\n message: `Impossibile eliminare il provider ${provider}: ${total} identita collegate. Disabilitalo oppure rimuovi prima i collegamenti.`,\n });\n }\n await Orm.execute(this.options.databaseOptions, 'DELETE FROM SSO_PROVIDER WHERE PROVIDER = ?', [provider]);\n }\n\n /** Enables or disables all local password authentication for one user. */\n /**\n * Imposta la policy di login locale. `false` non rimuove password ne identita SSO: blocca solo il percorso\n * email/password, che restituisce `PASSWORD_LOGIN_DISABLED`. L'assenza della riga mantiene il default legacy `true`.\n */\n async setPasswordLoginEnabled(codiceUtente: number, enabled: boolean): Promise<void> {\n this.assertEnabled();\n await this.assertUserExists(codiceUtente);\n // Upsert: per utenti legacy senza riga in UTENTI_CONFIG una UPDATE a vuoto\n // lasciava la policy al default, rendendo la disattivazione un no-op silenzioso.\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE OR INSERT INTO UTENTI_CONFIG (CODUTE, FLGPASSWORD) VALUES (?, ?) MATCHING (CODUTE)',\n [codiceUtente, enabled ? 1 : 0],\n );\n }\n\n /** Returns the effective local password policy. Users without a policy row retain the historic enabled default. */\n /** Restituisce la policy effettiva; utenti precedenti alla migrazione restano abilitati alla password. */\n async isPasswordLoginEnabled(codiceUtente: number): Promise<boolean> {\n if (!this.isEnabled()) return true;\n const rows = await Orm.query(\n this.options.databaseOptions,\n 'SELECT COALESCE(FLGPASSWORD, 1) AS password_login_enabled FROM UTENTI_CONFIG WHERE CODUTE = ?',\n [codiceUtente],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as IdentityRow | undefined;\n return row?.passwordLoginEnabled !== false && row?.passwordLoginEnabled !== 0 && row?.passwordLoginEnabled !== '0';\n }\n\n /** Soft-disables a linked identity without deleting operational history. */\n /** Disabilita logicamente un collegamento SSO conservando audit e possibilita di successiva riattivazione. */\n async disableIdentity(identityKey: string): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n await Orm.execute(\n this.options.databaseOptions,\n 'UPDATE UTENTI_IDENTITA_EXT SET FLGATTIVO = 0, DATDISATT = CURRENT_TIMESTAMP WHERE IDNKEY = ?',\n [identityKey],\n );\n }\n\n /** Restituisce il CODUTE proprietario di un collegamento SSO, o null se assente. */\n async getIdentityOwner(identityKey: string): Promise<number | null> {\n this.assertIdentityKey(identityKey);\n const rows = (await Orm.query(\n this.options.databaseOptions,\n 'SELECT CODUTE AS codice_utente FROM UTENTI_IDENTITA_EXT WHERE IDNKEY = ?',\n [identityKey],\n )) as Array<Record<string, unknown>>;\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as { codiceUtente?: number } | undefined;\n const owner = Number(row?.codiceUtente);\n return Number.isSafeInteger(owner) && owner > 0 ? owner : null;\n }\n\n /** Permanently removes one identity link from its owning user after administrative confirmation. */\n /**\n * Elimina fisicamente un collegamento SSO soltanto dopo aver verificato che appartenga all'utente indicato.\n * Non elimina mai l'utente Accessi, password, ruoli o grant associati.\n */\n async deleteIdentity(codiceUtente: number, identityKey: string): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n const identity = (await this.getUserIdentities(codiceUtente)).find((item) => item.identityKey === identityKey);\n if (!identity) {\n throw new NotFoundException({ code: 'FEDERATED_IDENTITY_NOT_FOUND', message: 'Collegamento SSO non trovato per questo utente.' });\n }\n await Orm.execute(\n this.options.databaseOptions,\n 'DELETE FROM UTENTI_IDENTITA_EXT WHERE IDNKEY = ? AND CODUTE = ?',\n [identityKey, codiceUtente],\n );\n }\n\n /** Aggiorna lo stato o la nota di un collegamento SSO usando la sua chiave tecnica amministrativa. */\n /** Aggiorna stato o nota amministrativa senza modificare provider e subject, che identificano la persona. */\n async updateIdentity(identityKey: string, update: { active?: boolean; note?: string }): Promise<void> {\n this.assertEnabled();\n this.assertIdentityKey(identityKey);\n const changes: string[] = [];\n const params: unknown[] = [];\n if (update.active !== undefined) {\n changes.push('FLGATTIVO = ?');\n params.push(update.active ? 1 : 0);\n if (update.active) changes.push('DATDISATT = NULL');\n else changes.push('DATDISATT = CURRENT_TIMESTAMP');\n }\n if (update.note !== undefined) {\n changes.push('NOTA = ?');\n params.push(update.note);\n }\n if (changes.length === 0) return;\n params.push(identityKey);\n await Orm.execute(this.options.databaseOptions, `UPDATE UTENTI_IDENTITA_EXT SET ${changes.join(', ')} WHERE IDNKEY = ?`, params);\n }\n\n /** Explicit administrative schema reconciliation, shared with the standard updater. */\n async ensureSchema(): Promise<void> {\n if (this.isEnabled()) await AccessiDatabaseUpdater.run(this.options);\n }\n\n private async findIdentity(identity: VerifiedFederatedIdentity, onlyActive: boolean): Promise<FederatedIdentity | null> {\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT I.IDNKEY AS identity_key, I.CODUTE AS codice_utente, I.PROVIDER, I.SUBJECT,\n I.FLGATTIVO AS active, I.DATINS AS created_at, I.DATLASTLOGIN AS last_login_at,\n I.DATDISATT AS disabled_at, I.NOTA,\n COALESCE(C.FLGPASSWORD, 1) AS password_login_enabled\n FROM UTENTI_IDENTITA_EXT I\n LEFT JOIN UTENTI_CONFIG C ON C.CODUTE = I.CODUTE\n WHERE I.IDNKEY = ? AND I.PROVIDER = ? AND I.SUBJECT = ?${onlyActive ? ' AND I.FLGATTIVO = 1' : ''}`,\n [this.getIdentityKey(identity), identity.provider, identity.subject],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as IdentityRow | undefined;\n return row ? this.toIdentity(row) : null;\n }\n\n private async assertUserExists(codiceUtente: number): Promise<void> {\n const user = await this.userService.getAuthenticatedUserSnapshot(codiceUtente);\n if (!user) throw new NotFoundException('Utente Accessi non trovato.');\n }\n\n private assertEnabled(): void {\n if (!this.isEnabled()) {\n throw new ForbiddenException({ code: 'FEDERATED_AUTH_DISABLED', message: 'Autenticazione federata non abilitata in AccessiOptions.' });\n }\n }\n\n /** Validates the opaque SHA-256 key used only by administrative identity endpoints. */\n private assertIdentityKey(identityKey: string): void {\n if (!/^[a-f0-9]{64}$/i.test(identityKey)) {\n throw new BadRequestException({ code: 'FEDERATED_IDENTITY_KEY_INVALID', message: 'Chiave del collegamento SSO non valida.' });\n }\n }\n\n private normalizeIdentity(identity: VerifiedFederatedIdentity): VerifiedFederatedIdentity {\n const provider = this.normalizeProvider(identity?.provider);\n const subject = typeof identity?.subject === 'string' ? identity.subject.trim() : '';\n if (!subject || Buffer.byteLength(subject, 'utf8') > 512) {\n throw new BadRequestException({ code: 'FEDERATED_SUBJECT_INVALID', message: 'Subject non valido: è obbligatorio e può occupare al massimo 512 byte UTF-8.' });\n }\n return { provider, subject };\n }\n\n private normalizeProvider(value: unknown): string {\n const provider = typeof value === 'string' ? value.trim().toLowerCase() : '';\n if (!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(provider)) {\n throw new BadRequestException({ code: 'FEDERATED_PROVIDER_INVALID', message: 'Provider non valido: usare un namespace ASCII stabile di massimo 64 caratteri.' });\n }\n return provider;\n }\n\n private normalizeDescription(value: unknown): string {\n const description = typeof value === 'string' ? value.trim() : '';\n if (!description || description.length > 160) {\n throw new BadRequestException({ code: 'FEDERATED_PROVIDER_DESCRIPTION_INVALID', message: 'La descrizione del provider deve contenere da 1 a 160 caratteri.' });\n }\n return description;\n }\n\n private async assertProviderActive(provider: string): Promise<FederatedProvider> {\n const registered = await this.findProvider(provider);\n if (!registered) {\n throw new NotFoundException({ code: 'FEDERATED_PROVIDER_NOT_FOUND', message: 'Provider SSO non registrato.' });\n }\n if (!registered.active) {\n throw new ForbiddenException({ code: 'FEDERATED_PROVIDER_DISABLED', message: 'Provider SSO disabilitato.' });\n }\n return registered;\n }\n\n private async findProvider(provider: string): Promise<FederatedProvider | null> {\n const rows = await Orm.query(\n this.options.databaseOptions,\n `SELECT PROVIDER AS provider, DESCRIZIONE AS description, FLGATTIVO AS active,\n DATINS AS created_at, NOTA AS note\n FROM SSO_PROVIDER\n WHERE PROVIDER = ?`,\n [provider],\n );\n const row = rows.map(RestUtilities.convertKeysToCamelCase)[0] as ProviderRow | undefined;\n return row ? this.toProvider(row) : null;\n }\n\n private getIdentityKey(identity: VerifiedFederatedIdentity): string {\n const provider = Buffer.from(identity.provider, 'utf8');\n const subject = Buffer.from(identity.subject, 'utf8');\n const payload = Buffer.concat([Buffer.from('accessi:federated:v1:'), Buffer.from(`${provider.length}:`), provider, Buffer.from(`${subject.length}:`), subject]);\n return createHash('sha256').update(payload).digest('hex');\n }\n\n private toIdentity(row: IdentityRow): FederatedIdentity {\n return {\n identityKey: String(row.identityKey),\n codiceUtente: Number(row.codiceUtente),\n provider: String(row.provider).trim(),\n subject: String(row.subject),\n active: row.active === true || row.active === 1 || row.active === '1',\n passwordLoginEnabled: !(row.passwordLoginEnabled === false || row.passwordLoginEnabled === 0 || row.passwordLoginEnabled === '0'),\n createdAt: row.createdAt,\n lastLoginAt: row.lastLoginAt,\n disabledAt: row.disabledAt,\n note: row.note,\n };\n }\n\n private toProvider(row: ProviderRow): FederatedProvider {\n return {\n provider: String(row.provider).trim(),\n description: String(row.description ?? '').trim(),\n active: row.active === true || row.active === 1 || row.active === '1',\n createdAt: row.createdAt,\n note: row.note,\n };\n }\n}\n"]}
@@ -25,11 +25,25 @@ export interface AccessiModuleInitializationResult {
25
25
  export declare function initializeAccessiModule(app: Application, options: AccessiOptions): Promise<AccessiModuleInitializationResult>;
26
26
  export { AccessiModule } from "./AccessiModule";
27
27
  export { AccessiIntrospectionController } from "./Controllers/AccessiIntrospectionController";
28
+ export { FederatedAuthExchangeController } from "./federated-auth/FederatedAuthExchangeController";
28
29
  export type { AccessiTokenIntrospectionResult } from "./Services/AuthService/AuthService";
29
30
  export { AccessiDatabaseUpdater } from "./database-updates/AccessiDatabaseUpdater";
30
31
  export type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from "./AccessiModule";
31
32
  export type { PublicRegistrationOptions, FederatedAuthenticationOptions, ServiceTokenOptions } from "./AccessiModule";
32
- export type { CatalogScriptsOptions, CatalogScriptChecksumPolicy } from "./AccessiModule";
33
+ export type { CatalogScriptsOptions, CatalogScriptChecksumPolicy, ConsoleEntryOptions } from "./AccessiModule";
34
+ export { createMemoryConsoleEntryStore, createRedisConsoleEntryStore, getDefaultConsoleEntryStore } from './security/consoleEntry';
35
+ export type { ConsoleEntryRedisClient, ConsoleEntryRecord, ConsoleEntryStore, ConsoleEntryTicket, MemoryConsoleEntryStore, RedisConsoleEntryStoreOptions } from './security/consoleEntry';
36
+ export { createMemoryRateLimitStore, createRedisRateLimitStore, getDefaultRateLimitStore } from './security/rateLimitStore';
37
+ export type { MemoryRateLimitStore, RateLimitDecision, RateLimitRedisClient, RateLimitStore, RedisRateLimitStoreOptions } from './security/rateLimitStore';
38
+ export { createAccessiEdgeRateLimitMiddleware } from './security/edgeRateLimit';
39
+ export type { AccessiEdgeRateLimitMiddleware, AccessiEdgeRateLimitOptions } from './security/edgeRateLimit';
40
+ export { assertValidAccessiOptions, validateAccessiOptions } from './security/validateOptions';
41
+ export { auditAccessi } from './security/audit';
42
+ export { createMemorySessionRevocationStore, createRedisSessionRevocationStore, revokeAccessiUserSessions, isAccessiTokenRevoked, getSessionRevocationStore } from './security/sessionRevocation';
43
+ export type { MemorySessionRevocationStore, RedisSessionRevocationStoreOptions, SessionRevocationOptions, SessionRevocationRedisClient, SessionRevocationStore } from './security/sessionRevocation';
44
+ export { createMemoryRefreshTokenRotationStore, createRedisRefreshTokenRotationStore, getRefreshTokenRotationStore } from './security/refreshTokenRotation';
45
+ export type { MemoryRefreshTokenRotationStore, RedisRefreshTokenRotationStoreOptions, RefreshTokenRotationOptions, RefreshTokenRotationRedisClient, RefreshTokenRotationStore } from './security/refreshTokenRotation';
46
+ export type { AccessiOptionsValidationIssue, AccessiOptionsValidationResult } from './security/validateOptions';
33
47
  export { AccessiCatalogMigrator, applyCatalogScripts, listPendingCatalogScripts, splitSqlStatements, analyzeCatalogScript, leadingStatementKeyword, computeCatalogScriptChecksum, discoverCatalogScripts } from "./database-updates/AccessiCatalogMigrator";
34
48
  export type { CatalogMigrationReport, CatalogScriptMigration } from "./database-updates/AccessiCatalogMigrator";
35
49
  export { ServiceTokenService } from './Services/ServiceTokenService/ServiceTokenService';
@@ -42,6 +56,8 @@ export { getOrCreateAdminBootstrapToken, getAdminBootstrapToken, clearAdminBoots
42
56
  export { ServiceTokenGuard, RequireServiceTokenScopes, getAccessiServiceToken } from './security/serviceTokenGuard';
43
57
  export { assertEmailConfigured, isEmailConfigured, AccessiEmailNotConfiguredError, ACCESSI_EMAIL_NOT_CONFIGURED } from './security/emailConfiguration';
44
58
  export { buildLoginAsUrl, LOGIN_AS_QUERY_PARAM } from './security/loginAs';
59
+ export { buildAccessiJwks, createAccessiJwksHandler, getAccessiJwksPath, setupAccessiJwks } from './security/jwks';
60
+ export type { AccessiJwksDocument, AccessiJwksKey } from './security/jwks';
45
61
  export { FederatedAuthService } from './federated-auth/FederatedAuthService';
46
62
  export type { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './federated-auth/FederatedAuthTypes';
47
63
  export * from "./Dtos";
@@ -26,7 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.ACCESSI_MODULE_SERVICES_LOCALS_KEY = exports.getAccessiModuleServices = exports.registerAccessiModuleServices = exports.accessiRequirement = exports.authenticateGen = exports.authorizeAccessi = exports.FederatedAuthService = exports.LOGIN_AS_QUERY_PARAM = exports.buildLoginAsUrl = exports.ACCESSI_EMAIL_NOT_CONFIGURED = exports.AccessiEmailNotConfiguredError = exports.isEmailConfigured = exports.assertEmailConfigured = exports.getAccessiServiceToken = exports.RequireServiceTokenScopes = exports.ServiceTokenGuard = exports.isValidAdminBootstrapToken = exports.clearAdminBootstrapToken = exports.getAdminBootstrapToken = exports.getOrCreateAdminBootstrapToken = exports.AdminBootstrapService = exports.SchemaExportService = exports.ServiceTokenService = exports.discoverCatalogScripts = exports.computeCatalogScriptChecksum = exports.leadingStatementKeyword = exports.analyzeCatalogScript = exports.splitSqlStatements = exports.listPendingCatalogScripts = exports.applyCatalogScripts = exports.AccessiCatalogMigrator = exports.AccessiDatabaseUpdater = exports.AccessiIntrospectionController = exports.AccessiModule = void 0;
29
+ exports.setupAccessiJwks = exports.getAccessiJwksPath = exports.createAccessiJwksHandler = exports.buildAccessiJwks = exports.LOGIN_AS_QUERY_PARAM = exports.buildLoginAsUrl = exports.ACCESSI_EMAIL_NOT_CONFIGURED = exports.AccessiEmailNotConfiguredError = exports.isEmailConfigured = exports.assertEmailConfigured = exports.getAccessiServiceToken = exports.RequireServiceTokenScopes = exports.ServiceTokenGuard = exports.isValidAdminBootstrapToken = exports.clearAdminBootstrapToken = exports.getAdminBootstrapToken = exports.getOrCreateAdminBootstrapToken = exports.AdminBootstrapService = exports.SchemaExportService = exports.ServiceTokenService = exports.discoverCatalogScripts = exports.computeCatalogScriptChecksum = exports.leadingStatementKeyword = exports.analyzeCatalogScript = exports.splitSqlStatements = exports.listPendingCatalogScripts = exports.applyCatalogScripts = exports.AccessiCatalogMigrator = exports.getRefreshTokenRotationStore = exports.createRedisRefreshTokenRotationStore = exports.createMemoryRefreshTokenRotationStore = exports.getSessionRevocationStore = exports.isAccessiTokenRevoked = exports.revokeAccessiUserSessions = exports.createRedisSessionRevocationStore = exports.createMemorySessionRevocationStore = exports.auditAccessi = exports.validateAccessiOptions = exports.assertValidAccessiOptions = exports.createAccessiEdgeRateLimitMiddleware = exports.getDefaultRateLimitStore = exports.createRedisRateLimitStore = exports.createMemoryRateLimitStore = exports.getDefaultConsoleEntryStore = exports.createRedisConsoleEntryStore = exports.createMemoryConsoleEntryStore = exports.AccessiDatabaseUpdater = exports.FederatedAuthExchangeController = exports.AccessiIntrospectionController = exports.AccessiModule = void 0;
30
+ exports.ACCESSI_MODULE_SERVICES_LOCALS_KEY = exports.getAccessiModuleServices = exports.registerAccessiModuleServices = exports.accessiRequirement = exports.authenticateGen = exports.authorizeAccessi = exports.FederatedAuthService = void 0;
30
31
  exports.initializeAccessiModule = initializeAccessiModule;
31
32
  const express_1 = __importDefault(require("express"));
32
33
  const core_1 = require("@nestjs/core");
@@ -41,6 +42,8 @@ const startupLog_1 = require("./startupLog");
41
42
  const accessiValidation_1 = require("./security/accessiValidation");
42
43
  const AccessiHttpExceptionFilter_1 = require("./security/AccessiHttpExceptionFilter");
43
44
  const emailConfiguration_1 = require("./security/emailConfiguration");
45
+ const jwks_1 = require("./security/jwks");
46
+ const edgeRateLimit_1 = require("./security/edgeRateLimit");
44
47
  function describeDatabaseTarget(options) {
45
48
  var _a, _b, _c, _d;
46
49
  const dbOptions = options.databaseOptions;
@@ -61,6 +64,7 @@ function describeDatabaseTarget(options) {
61
64
  */
62
65
  function initializeAccessiModule(app, options) {
63
66
  return __awaiter(this, void 0, void 0, function* () {
67
+ var _a, _b, _c, _d, _e, _f;
64
68
  // Il servizio email e obbligatorio: reset password, 2FA e creazione utente ne dipendono.
65
69
  (0, emailConfiguration_1.assertEmailConfigured)(options);
66
70
  const logger = new Logger_1.Logger("initializeAccessiModule");
@@ -72,19 +76,49 @@ function initializeAccessiModule(app, options) {
72
76
  logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);
73
77
  logger.info(`Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`);
74
78
  const nestHostApp = (0, express_1.default)();
75
- const isNestRoute = (path) => path === "/api/accessi" ||
79
+ if (((_a = options.http) === null || _a === void 0 ? void 0 : _a.trustProxy) !== undefined) {
80
+ app.set('trust proxy', options.http.trustProxy);
81
+ nestHostApp.set('trust proxy', options.http.trustProxy);
82
+ }
83
+ const jwksPath = (0, jwks_1.getAccessiJwksPath)(options);
84
+ const isAccessiRoute = (path) => path === "/api/accessi" ||
76
85
  path.startsWith("/api/accessi/") ||
77
- (0, OpenApiConfig_1.isOpenApiRequestPath)(path, resolvedOpenApi);
86
+ (0, OpenApiConfig_1.isOpenApiRequestPath)(path, resolvedOpenApi) ||
87
+ (jwksPath !== undefined && path === jwksPath);
88
+ const edgeRateLimit = options.edgeRateLimit
89
+ ? (0, edgeRateLimit_1.createAccessiEdgeRateLimitMiddleware)(Object.assign(Object.assign({}, options.edgeRateLimit), { match: (_b = options.edgeRateLimit.match) !== null && _b !== void 0 ? _b : ((path) => isAccessiRoute(path)) }))
90
+ : undefined;
91
+ if (edgeRateLimit) {
92
+ app.use(edgeRateLimit);
93
+ }
94
+ if (((_c = options.http) === null || _c === void 0 ? void 0 : _c.securityHeaders) !== false) {
95
+ app.use((req, res, next) => {
96
+ if (!isAccessiRoute(req.path)) {
97
+ return next();
98
+ }
99
+ res.setHeader('X-Content-Type-Options', 'nosniff');
100
+ res.setHeader('X-Frame-Options', 'SAMEORIGIN');
101
+ res.setHeader('Referrer-Policy', 'no-referrer');
102
+ res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
103
+ return next();
104
+ });
105
+ }
78
106
  app.use((req, res, next) => {
79
- if (!isNestRoute(req.path)) {
107
+ if (!isAccessiRoute(req.path)) {
80
108
  return next();
81
109
  }
82
110
  return nestHostApp(req, res, next);
83
111
  });
112
+ (0, jwks_1.setupAccessiJwks)(app, options);
113
+ if (jwksPath) {
114
+ logger.info(`JWKS accessi disponibile su: ${jwksPath}`);
115
+ }
84
116
  const nestExpressInstance = new platform_express_1.ExpressAdapter(nestHostApp);
85
117
  const nestApp = yield core_1.NestFactory.create(AccessiModule_1.AccessiModule.forRoot(options), nestExpressInstance, Object.assign({ bufferLogs: options.bufferLogs !== false }, (options.logger ? { logger: options.logger } : {})));
86
118
  logger.info("Applicazione Nest accessi creata.");
87
- nestApp.enableCors({ exposedHeaders: ['X-Total-Count'] });
119
+ if (((_d = options.http) === null || _d === void 0 ? void 0 : _d.cors) !== false) {
120
+ nestApp.enableCors((_f = (_e = options.http) === null || _e === void 0 ? void 0 : _e.cors) !== null && _f !== void 0 ? _f : { exposedHeaders: ['X-Total-Count'] });
121
+ }
88
122
  nestApp.useGlobalPipes((0, accessiValidation_1.createAccessiValidationPipe)());
89
123
  nestApp.useGlobalFilters(new AccessiHttpExceptionFilter_1.AccessiHttpExceptionFilter());
90
124
  nestApp.setGlobalPrefix('api', {
@@ -121,8 +155,35 @@ var AccessiModule_2 = require("./AccessiModule");
121
155
  Object.defineProperty(exports, "AccessiModule", { enumerable: true, get: function () { return AccessiModule_2.AccessiModule; } });
122
156
  var AccessiIntrospectionController_1 = require("./Controllers/AccessiIntrospectionController");
123
157
  Object.defineProperty(exports, "AccessiIntrospectionController", { enumerable: true, get: function () { return AccessiIntrospectionController_1.AccessiIntrospectionController; } });
158
+ var FederatedAuthExchangeController_1 = require("./federated-auth/FederatedAuthExchangeController");
159
+ Object.defineProperty(exports, "FederatedAuthExchangeController", { enumerable: true, get: function () { return FederatedAuthExchangeController_1.FederatedAuthExchangeController; } });
124
160
  var AccessiDatabaseUpdater_1 = require("./database-updates/AccessiDatabaseUpdater");
125
161
  Object.defineProperty(exports, "AccessiDatabaseUpdater", { enumerable: true, get: function () { return AccessiDatabaseUpdater_1.AccessiDatabaseUpdater; } });
162
+ var consoleEntry_1 = require("./security/consoleEntry");
163
+ Object.defineProperty(exports, "createMemoryConsoleEntryStore", { enumerable: true, get: function () { return consoleEntry_1.createMemoryConsoleEntryStore; } });
164
+ Object.defineProperty(exports, "createRedisConsoleEntryStore", { enumerable: true, get: function () { return consoleEntry_1.createRedisConsoleEntryStore; } });
165
+ Object.defineProperty(exports, "getDefaultConsoleEntryStore", { enumerable: true, get: function () { return consoleEntry_1.getDefaultConsoleEntryStore; } });
166
+ var rateLimitStore_1 = require("./security/rateLimitStore");
167
+ Object.defineProperty(exports, "createMemoryRateLimitStore", { enumerable: true, get: function () { return rateLimitStore_1.createMemoryRateLimitStore; } });
168
+ Object.defineProperty(exports, "createRedisRateLimitStore", { enumerable: true, get: function () { return rateLimitStore_1.createRedisRateLimitStore; } });
169
+ Object.defineProperty(exports, "getDefaultRateLimitStore", { enumerable: true, get: function () { return rateLimitStore_1.getDefaultRateLimitStore; } });
170
+ var edgeRateLimit_2 = require("./security/edgeRateLimit");
171
+ Object.defineProperty(exports, "createAccessiEdgeRateLimitMiddleware", { enumerable: true, get: function () { return edgeRateLimit_2.createAccessiEdgeRateLimitMiddleware; } });
172
+ var validateOptions_1 = require("./security/validateOptions");
173
+ Object.defineProperty(exports, "assertValidAccessiOptions", { enumerable: true, get: function () { return validateOptions_1.assertValidAccessiOptions; } });
174
+ Object.defineProperty(exports, "validateAccessiOptions", { enumerable: true, get: function () { return validateOptions_1.validateAccessiOptions; } });
175
+ var audit_1 = require("./security/audit");
176
+ Object.defineProperty(exports, "auditAccessi", { enumerable: true, get: function () { return audit_1.auditAccessi; } });
177
+ var sessionRevocation_1 = require("./security/sessionRevocation");
178
+ Object.defineProperty(exports, "createMemorySessionRevocationStore", { enumerable: true, get: function () { return sessionRevocation_1.createMemorySessionRevocationStore; } });
179
+ Object.defineProperty(exports, "createRedisSessionRevocationStore", { enumerable: true, get: function () { return sessionRevocation_1.createRedisSessionRevocationStore; } });
180
+ Object.defineProperty(exports, "revokeAccessiUserSessions", { enumerable: true, get: function () { return sessionRevocation_1.revokeAccessiUserSessions; } });
181
+ Object.defineProperty(exports, "isAccessiTokenRevoked", { enumerable: true, get: function () { return sessionRevocation_1.isAccessiTokenRevoked; } });
182
+ Object.defineProperty(exports, "getSessionRevocationStore", { enumerable: true, get: function () { return sessionRevocation_1.getSessionRevocationStore; } });
183
+ var refreshTokenRotation_1 = require("./security/refreshTokenRotation");
184
+ Object.defineProperty(exports, "createMemoryRefreshTokenRotationStore", { enumerable: true, get: function () { return refreshTokenRotation_1.createMemoryRefreshTokenRotationStore; } });
185
+ Object.defineProperty(exports, "createRedisRefreshTokenRotationStore", { enumerable: true, get: function () { return refreshTokenRotation_1.createRedisRefreshTokenRotationStore; } });
186
+ Object.defineProperty(exports, "getRefreshTokenRotationStore", { enumerable: true, get: function () { return refreshTokenRotation_1.getRefreshTokenRotationStore; } });
126
187
  var AccessiCatalogMigrator_1 = require("./database-updates/AccessiCatalogMigrator");
127
188
  Object.defineProperty(exports, "AccessiCatalogMigrator", { enumerable: true, get: function () { return AccessiCatalogMigrator_1.AccessiCatalogMigrator; } });
128
189
  Object.defineProperty(exports, "applyCatalogScripts", { enumerable: true, get: function () { return AccessiCatalogMigrator_1.applyCatalogScripts; } });
@@ -155,6 +216,11 @@ Object.defineProperty(exports, "ACCESSI_EMAIL_NOT_CONFIGURED", { enumerable: tru
155
216
  var loginAs_1 = require("./security/loginAs");
156
217
  Object.defineProperty(exports, "buildLoginAsUrl", { enumerable: true, get: function () { return loginAs_1.buildLoginAsUrl; } });
157
218
  Object.defineProperty(exports, "LOGIN_AS_QUERY_PARAM", { enumerable: true, get: function () { return loginAs_1.LOGIN_AS_QUERY_PARAM; } });
219
+ var jwks_2 = require("./security/jwks");
220
+ Object.defineProperty(exports, "buildAccessiJwks", { enumerable: true, get: function () { return jwks_2.buildAccessiJwks; } });
221
+ Object.defineProperty(exports, "createAccessiJwksHandler", { enumerable: true, get: function () { return jwks_2.createAccessiJwksHandler; } });
222
+ Object.defineProperty(exports, "getAccessiJwksPath", { enumerable: true, get: function () { return jwks_2.getAccessiJwksPath; } });
223
+ Object.defineProperty(exports, "setupAccessiJwks", { enumerable: true, get: function () { return jwks_2.setupAccessiJwks; } });
158
224
  var FederatedAuthService_1 = require("./federated-auth/FederatedAuthService");
159
225
  Object.defineProperty(exports, "FederatedAuthService", { enumerable: true, get: function () { return FederatedAuthService_1.FederatedAuthService; } });
160
226
  __exportStar(require("./Dtos"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { Application, Request } from \"express\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport type { INestApplication } from \"@nestjs/common\";\nimport type { OpenAPIObject } from \"@nestjs/swagger\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\nimport { Logger } from \"../Logger\";\nimport { AuthService } from \"./Services/AuthService/AuthService\";\nimport {\n buildOpenApiExcludePaths,\n isOpenApiRequestPath,\n resolveAccessiOpenApiOptions,\n setupOpenApi\n} from \"../openapi/OpenApiConfig\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\nimport { registerAccessiModuleServices } from \"./accessiRuntime\";\nimport { logAccessiStartup } from \"./startupLog\";\nimport { createAccessiValidationPipe } from './security/accessiValidation';\nimport { AccessiHttpExceptionFilter } from './security/AccessiHttpExceptionFilter';\nimport { assertEmailConfigured } from './security/emailConfiguration';\n\n/** Esito del bootstrap Express di Accessi. */\nexport interface AccessiModuleInitializationResult {\n /** Sotto-app Nest che serve `/api/accessi/*` e la documentazione. */\n nestApp: INestApplication;\n /** Documento OpenAPI generato, mergiabile nel documento unico dell'host. */\n document: OpenAPIObject;\n}\n\nfunction describeDatabaseTarget(options: AccessiOptions): string {\n const dbOptions = options.databaseOptions as {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n };\n\n return `${dbOptions.host ?? \"?\"}:${dbOptions.port ?? \"?\"} -> ${dbOptions.database ?? \"?\"} as ${dbOptions.user ?? \"?\"}`;\n}\n\n/**\n * Monta il modulo Accessi in un'applicazione Express gia esistente.\n *\n * Il bootstrap crea un host Nest isolato per le rotte `/api/accessi`, inizializza la\n * documentazione OpenAPI, validazione ed error handler, quindi rende disponibile\n * `authorizeAccessi` al resto dell'app.\n * Attendere questa Promise prima di aprire la porta HTTP: durante il bootstrap il middleware\n * restituisce `ACCESSI_AUTH_INITIALIZING` invece di autorizzare richieste parzialmente inizializzate.\n *\n * @param app Applicazione Express ospitante. Non viene sostituita ne vengono intercettate rotte estranee ad Accessi.\n * @param options Configurazione riservata del modulo; proviene normalmente da variabili d'ambiente o secret manager.\n * @returns Il sotto-app Nest e il documento OpenAPI generato (utile per il merge nell'host).\n */\nexport async function initializeAccessiModule(\n app: Application,\n options: AccessiOptions\n): Promise<AccessiModuleInitializationResult> {\n // Il servizio email e obbligatorio: reset password, 2FA e creazione utente ne dipendono.\n assertEmailConfigured(options);\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n const startedAt = performance.now();\n const resolvedOpenApi = resolveAccessiOpenApiOptions(options.openapi);\n\n try {\n logger.info(\"Inizializzazione modulo accessi avviata.\");\n logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);\n logger.info(\n `Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`\n );\n const nestHostApp = express();\n const isNestRoute = (path: string) =>\n path === \"/api/accessi\" ||\n path.startsWith(\"/api/accessi/\") ||\n isOpenApiRequestPath(path, resolvedOpenApi);\n\n app.use((req: Request, res, next) => {\n if (!isNestRoute(req.path)) {\n return next();\n }\n\n return nestHostApp(req, res, next);\n });\n\n const nestExpressInstance = new ExpressAdapter(nestHostApp);\n\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: options.bufferLogs !== false,\n ...(options.logger ? { logger: options.logger } : {})\n });\n logger.info(\"Applicazione Nest accessi creata.\");\n\n nestApp.enableCors({ exposedHeaders: ['X-Total-Count'] });\n nestApp.useGlobalPipes(createAccessiValidationPipe());\n nestApp.useGlobalFilters(new AccessiHttpExceptionFilter());\n\n nestApp.setGlobalPrefix('api', {\n exclude: buildOpenApiExcludePaths(resolvedOpenApi)\n });\n\n const document = setupOpenApi(nestApp, resolvedOpenApi);\n logger.info(\"Avvio init del modulo accessi.\");\n await nestApp.init();\n logger.info(\"Init del modulo accessi completata.\");\n if (options.legacyPasswordMigrationOnStartup !== false) {\n logger.info(\"Avvio migrazione password legacy accessi.\");\n const passwordMigrationService = nestApp.get(AuthService);\n await passwordMigrationService.migrateLegacyEncryptedPasswords();\n logger.info(\"Migrazione password legacy accessi completata.\");\n }\n\n const accessiServices = registerAccessiModuleServices(app, nestApp);\n app.locals.accessiAuthService = accessiServices.authenticateGenService;\n setAccessiAuthService(accessiServices.authenticateGenService);\n logAccessiStartup(options, resolvedOpenApi);\n const elapsedMs = performance.now() - startedAt;\n logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);\n\n return { nestApp, document };\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\n \"Errore in initialize AccessiModule:\",\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n throw error;\n }\n}\n\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiIntrospectionController } from \"./Controllers/AccessiIntrospectionController\";\nexport type { AccessiTokenIntrospectionResult } from \"./Services/AuthService/AuthService\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from \"./AccessiModule\";\nexport type { PublicRegistrationOptions, FederatedAuthenticationOptions, ServiceTokenOptions } from \"./AccessiModule\";\nexport type { CatalogScriptsOptions, CatalogScriptChecksumPolicy } from \"./AccessiModule\";\nexport {\n AccessiCatalogMigrator,\n applyCatalogScripts,\n listPendingCatalogScripts,\n splitSqlStatements,\n analyzeCatalogScript,\n leadingStatementKeyword,\n computeCatalogScriptChecksum,\n discoverCatalogScripts\n} from \"./database-updates/AccessiCatalogMigrator\";\nexport type { CatalogMigrationReport, CatalogScriptMigration } from \"./database-updates/AccessiCatalogMigrator\";\nexport { ServiceTokenService } from './Services/ServiceTokenService/ServiceTokenService';\nexport type {\n ServiceTokenMetadata,\n IssuedServiceToken,\n VerifiedServiceToken,\n IssueServiceTokenInput\n} from './Services/ServiceTokenService/ServiceTokenService';\nexport { SchemaExportService } from './Services/SchemaExportService/SchemaExportService';\nexport type { SchemaDdlResult, SchemaDdlSection, SchemaEntitiesResult } from './Services/SchemaExportService/SchemaExportService';\nexport { AdminBootstrapService } from './Services/AdminBootstrapService/AdminBootstrapService';\nexport type { BootstrapAdminResult } from './Services/AdminBootstrapService/AdminBootstrapService';\nexport {\n getOrCreateAdminBootstrapToken,\n getAdminBootstrapToken,\n clearAdminBootstrapToken,\n isValidAdminBootstrapToken\n} from './security/adminBootstrap';\nexport { ServiceTokenGuard, RequireServiceTokenScopes, getAccessiServiceToken } from './security/serviceTokenGuard';\nexport { assertEmailConfigured, isEmailConfigured, AccessiEmailNotConfiguredError, ACCESSI_EMAIL_NOT_CONFIGURED } from './security/emailConfiguration';\nexport { buildLoginAsUrl, LOGIN_AS_QUERY_PARAM } from './security/loginAs';\nexport { FederatedAuthService } from './federated-auth/FederatedAuthService';\nexport type { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './federated-auth/FederatedAuthTypes';\nexport * from \"./Dtos\";\nexport {\n authorizeAccessi,\n authenticateGen\n} from \"./middleware/authenticateGen\";\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\nexport {\n registerAccessiModuleServices,\n getAccessiModuleServices,\n ACCESSI_MODULE_SERVICES_LOCALS_KEY\n} from \"./accessiRuntime\";\nexport type { AccessiModuleServices } from \"./accessiRuntime\";\nexport type {\n AccessiAuthorizationOptions,\n AccessiRequirementNode,\n AccessiCustomRequirementContext,\n AccessiCustomRequirementHandler\n} from \"./middleware/accessiRequirements\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { Application, Request } from \"express\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport type { INestApplication } from \"@nestjs/common\";\nimport type { OpenAPIObject } from \"@nestjs/swagger\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\nimport { Logger } from \"../Logger\";\nimport { AuthService } from \"./Services/AuthService/AuthService\";\nimport {\n buildOpenApiExcludePaths,\n isOpenApiRequestPath,\n resolveAccessiOpenApiOptions,\n setupOpenApi\n} from \"../openapi/OpenApiConfig\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\nimport { registerAccessiModuleServices } from \"./accessiRuntime\";\nimport { logAccessiStartup } from \"./startupLog\";\nimport { createAccessiValidationPipe } from './security/accessiValidation';\nimport { AccessiHttpExceptionFilter } from './security/AccessiHttpExceptionFilter';\nimport { assertEmailConfigured } from './security/emailConfiguration';\nimport { getAccessiJwksPath, setupAccessiJwks } from './security/jwks';\nimport { createAccessiEdgeRateLimitMiddleware } from './security/edgeRateLimit';\n\n/** Esito del bootstrap Express di Accessi. */\nexport interface AccessiModuleInitializationResult {\n /** Sotto-app Nest che serve `/api/accessi/*` e la documentazione. */\n nestApp: INestApplication;\n /** Documento OpenAPI generato, mergiabile nel documento unico dell'host. */\n document: OpenAPIObject;\n}\n\nfunction describeDatabaseTarget(options: AccessiOptions): string {\n const dbOptions = options.databaseOptions as {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n };\n\n return `${dbOptions.host ?? \"?\"}:${dbOptions.port ?? \"?\"} -> ${dbOptions.database ?? \"?\"} as ${dbOptions.user ?? \"?\"}`;\n}\n\n/**\n * Monta il modulo Accessi in un'applicazione Express gia esistente.\n *\n * Il bootstrap crea un host Nest isolato per le rotte `/api/accessi`, inizializza la\n * documentazione OpenAPI, validazione ed error handler, quindi rende disponibile\n * `authorizeAccessi` al resto dell'app.\n * Attendere questa Promise prima di aprire la porta HTTP: durante il bootstrap il middleware\n * restituisce `ACCESSI_AUTH_INITIALIZING` invece di autorizzare richieste parzialmente inizializzate.\n *\n * @param app Applicazione Express ospitante. Non viene sostituita ne vengono intercettate rotte estranee ad Accessi.\n * @param options Configurazione riservata del modulo; proviene normalmente da variabili d'ambiente o secret manager.\n * @returns Il sotto-app Nest e il documento OpenAPI generato (utile per il merge nell'host).\n */\nexport async function initializeAccessiModule(\n app: Application,\n options: AccessiOptions\n): Promise<AccessiModuleInitializationResult> {\n // Il servizio email e obbligatorio: reset password, 2FA e creazione utente ne dipendono.\n assertEmailConfigured(options);\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n const startedAt = performance.now();\n const resolvedOpenApi = resolveAccessiOpenApiOptions(options.openapi);\n\n try {\n logger.info(\"Inizializzazione modulo accessi avviata.\");\n logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);\n logger.info(\n `Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`\n );\n const nestHostApp = express();\n if (options.http?.trustProxy !== undefined) {\n app.set('trust proxy', options.http.trustProxy);\n nestHostApp.set('trust proxy', options.http.trustProxy);\n }\n const jwksPath = getAccessiJwksPath(options);\n const isAccessiRoute = (path: string) =>\n path === \"/api/accessi\" ||\n path.startsWith(\"/api/accessi/\") ||\n isOpenApiRequestPath(path, resolvedOpenApi) ||\n (jwksPath !== undefined && path === jwksPath);\n const edgeRateLimit = options.edgeRateLimit\n ? createAccessiEdgeRateLimitMiddleware({\n ...options.edgeRateLimit,\n match: options.edgeRateLimit.match ?? ((path) => isAccessiRoute(path)),\n })\n : undefined;\n if (edgeRateLimit) {\n app.use(edgeRateLimit);\n }\n if (options.http?.securityHeaders !== false) {\n app.use((req: Request, res, next) => {\n if (!isAccessiRoute(req.path)) {\n return next();\n }\n res.setHeader('X-Content-Type-Options', 'nosniff');\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\n res.setHeader('Referrer-Policy', 'no-referrer');\n res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');\n return next();\n });\n }\n\n app.use((req: Request, res, next) => {\n if (!isAccessiRoute(req.path)) {\n return next();\n }\n\n return nestHostApp(req, res, next);\n });\n\n setupAccessiJwks(app, options);\n if (jwksPath) {\n logger.info(`JWKS accessi disponibile su: ${jwksPath}`);\n }\n\n const nestExpressInstance = new ExpressAdapter(nestHostApp);\n\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: options.bufferLogs !== false,\n ...(options.logger ? { logger: options.logger } : {})\n });\n logger.info(\"Applicazione Nest accessi creata.\");\n\n if (options.http?.cors !== false) {\n nestApp.enableCors(options.http?.cors ?? { exposedHeaders: ['X-Total-Count'] });\n }\n nestApp.useGlobalPipes(createAccessiValidationPipe());\n nestApp.useGlobalFilters(new AccessiHttpExceptionFilter());\n\n nestApp.setGlobalPrefix('api', {\n exclude: buildOpenApiExcludePaths(resolvedOpenApi)\n });\n\n const document = setupOpenApi(nestApp, resolvedOpenApi);\n logger.info(\"Avvio init del modulo accessi.\");\n await nestApp.init();\n logger.info(\"Init del modulo accessi completata.\");\n if (options.legacyPasswordMigrationOnStartup !== false) {\n logger.info(\"Avvio migrazione password legacy accessi.\");\n const passwordMigrationService = nestApp.get(AuthService);\n await passwordMigrationService.migrateLegacyEncryptedPasswords();\n logger.info(\"Migrazione password legacy accessi completata.\");\n }\n\n const accessiServices = registerAccessiModuleServices(app, nestApp);\n app.locals.accessiAuthService = accessiServices.authenticateGenService;\n setAccessiAuthService(accessiServices.authenticateGenService);\n logAccessiStartup(options, resolvedOpenApi);\n const elapsedMs = performance.now() - startedAt;\n logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);\n\n return { nestApp, document };\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\n \"Errore in initialize AccessiModule:\",\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n throw error;\n }\n}\n\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiIntrospectionController } from \"./Controllers/AccessiIntrospectionController\";\nexport { FederatedAuthExchangeController } from \"./federated-auth/FederatedAuthExchangeController\";\nexport type { AccessiTokenIntrospectionResult } from \"./Services/AuthService/AuthService\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from \"./AccessiModule\";\nexport type { PublicRegistrationOptions, FederatedAuthenticationOptions, ServiceTokenOptions } from \"./AccessiModule\";\nexport type { CatalogScriptsOptions, CatalogScriptChecksumPolicy, ConsoleEntryOptions } from \"./AccessiModule\";\nexport {\n createMemoryConsoleEntryStore,\n createRedisConsoleEntryStore,\n getDefaultConsoleEntryStore\n} from './security/consoleEntry';\nexport type {\n ConsoleEntryRedisClient,\n ConsoleEntryRecord,\n ConsoleEntryStore,\n ConsoleEntryTicket,\n MemoryConsoleEntryStore,\n RedisConsoleEntryStoreOptions\n} from './security/consoleEntry';\nexport {\n createMemoryRateLimitStore,\n createRedisRateLimitStore,\n getDefaultRateLimitStore\n} from './security/rateLimitStore';\nexport type {\n MemoryRateLimitStore,\n RateLimitDecision,\n RateLimitRedisClient,\n RateLimitStore,\n RedisRateLimitStoreOptions\n} from './security/rateLimitStore';\nexport { createAccessiEdgeRateLimitMiddleware } from './security/edgeRateLimit';\nexport type {\n AccessiEdgeRateLimitMiddleware,\n AccessiEdgeRateLimitOptions\n} from './security/edgeRateLimit';\nexport {\n assertValidAccessiOptions,\n validateAccessiOptions\n} from './security/validateOptions';\nexport { auditAccessi } from './security/audit';\nexport {\n createMemorySessionRevocationStore,\n createRedisSessionRevocationStore,\n revokeAccessiUserSessions,\n isAccessiTokenRevoked,\n getSessionRevocationStore\n} from './security/sessionRevocation';\nexport type {\n MemorySessionRevocationStore,\n RedisSessionRevocationStoreOptions,\n SessionRevocationOptions,\n SessionRevocationRedisClient,\n SessionRevocationStore\n} from './security/sessionRevocation';\nexport {\n createMemoryRefreshTokenRotationStore,\n createRedisRefreshTokenRotationStore,\n getRefreshTokenRotationStore\n} from './security/refreshTokenRotation';\nexport type {\n MemoryRefreshTokenRotationStore,\n RedisRefreshTokenRotationStoreOptions,\n RefreshTokenRotationOptions,\n RefreshTokenRotationRedisClient,\n RefreshTokenRotationStore\n} from './security/refreshTokenRotation';\nexport type {\n AccessiOptionsValidationIssue,\n AccessiOptionsValidationResult\n} from './security/validateOptions';\nexport {\n AccessiCatalogMigrator,\n applyCatalogScripts,\n listPendingCatalogScripts,\n splitSqlStatements,\n analyzeCatalogScript,\n leadingStatementKeyword,\n computeCatalogScriptChecksum,\n discoverCatalogScripts\n} from \"./database-updates/AccessiCatalogMigrator\";\nexport type { CatalogMigrationReport, CatalogScriptMigration } from \"./database-updates/AccessiCatalogMigrator\";\nexport { ServiceTokenService } from './Services/ServiceTokenService/ServiceTokenService';\nexport type {\n ServiceTokenMetadata,\n IssuedServiceToken,\n VerifiedServiceToken,\n IssueServiceTokenInput\n} from './Services/ServiceTokenService/ServiceTokenService';\nexport { SchemaExportService } from './Services/SchemaExportService/SchemaExportService';\nexport type { SchemaDdlResult, SchemaDdlSection, SchemaEntitiesResult } from './Services/SchemaExportService/SchemaExportService';\nexport { AdminBootstrapService } from './Services/AdminBootstrapService/AdminBootstrapService';\nexport type { BootstrapAdminResult } from './Services/AdminBootstrapService/AdminBootstrapService';\nexport {\n getOrCreateAdminBootstrapToken,\n getAdminBootstrapToken,\n clearAdminBootstrapToken,\n isValidAdminBootstrapToken\n} from './security/adminBootstrap';\nexport { ServiceTokenGuard, RequireServiceTokenScopes, getAccessiServiceToken } from './security/serviceTokenGuard';\nexport { assertEmailConfigured, isEmailConfigured, AccessiEmailNotConfiguredError, ACCESSI_EMAIL_NOT_CONFIGURED } from './security/emailConfiguration';\nexport { buildLoginAsUrl, LOGIN_AS_QUERY_PARAM } from './security/loginAs';\nexport {\n buildAccessiJwks,\n createAccessiJwksHandler,\n getAccessiJwksPath,\n setupAccessiJwks\n} from './security/jwks';\nexport type { AccessiJwksDocument, AccessiJwksKey } from './security/jwks';\nexport { FederatedAuthService } from './federated-auth/FederatedAuthService';\nexport type { FederatedAuthenticationResult, FederatedIdentity, FederatedProvider, VerifiedFederatedIdentity } from './federated-auth/FederatedAuthTypes';\nexport * from \"./Dtos\";\nexport {\n authorizeAccessi,\n authenticateGen\n} from \"./middleware/authenticateGen\";\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\nexport {\n registerAccessiModuleServices,\n getAccessiModuleServices,\n ACCESSI_MODULE_SERVICES_LOCALS_KEY\n} from \"./accessiRuntime\";\nexport type { AccessiModuleServices } from \"./accessiRuntime\";\nexport type {\n AccessiAuthorizationOptions,\n AccessiRequirementNode,\n AccessiCustomRequirementContext,\n AccessiCustomRequirementHandler\n} from \"./middleware/accessiRequirements\";\n"]}
@@ -60,6 +60,7 @@ const jwt = __importStar(require("jsonwebtoken"));
60
60
  const UserService_1 = require("../Services/UserService/UserService");
61
61
  const authenticatedToken_1 = require("../security/authenticatedToken");
62
62
  const jwtTokenOptions_1 = require("../security/jwtTokenOptions");
63
+ const sessionRevocation_1 = require("../security/sessionRevocation");
63
64
  let JwtSimpleGuard = class JwtSimpleGuard {
64
65
  constructor(accessiOptions, userService) {
65
66
  this.accessiOptions = accessiOptions;
@@ -93,6 +94,9 @@ let JwtSimpleGuard = class JwtSimpleGuard {
93
94
  if (!codiceUtente) {
94
95
  throw new common_1.UnauthorizedException('Token privo di un utente valido.');
95
96
  }
97
+ if (yield (0, sessionRevocation_1.isAccessiTokenRevoked)(this.accessiOptions, payload, codiceUtente)) {
98
+ throw new common_1.UnauthorizedException('Sessione revocata.');
99
+ }
96
100
  const currentUser = yield this.userService.getAuthenticatedUserSnapshot(codiceUtente);
97
101
  if (!(0, authenticatedToken_1.isAuthenticatedUserEnabledForJwt)(currentUser) || !(0, authenticatedToken_1.isAccessiTokenAllowedForUser)(payload, currentUser)) {
98
102
  throw new common_1.UnauthorizedException('Utente non piu autorizzato.');
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/accessi-module/jwt/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,kDAAoC;AAEpC,qEAAkE;AAClE,uEAMwC;AACxC,iEAAsF;AAG/E,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAC8C,cAA8B,EACzD,WAAwB;QADG,mBAAc,GAAd,cAAc,CAAgB;QACzD,gBAAW,GAAX,WAAW,CAAa;IACxC,CAAC;IAEE,WAAW,CAAC,OAAyB;;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG,IAAA,8CAAyB,EAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAEzE,IAAI,CAAC;gBACH,IAAI,YAAwE,CAAC;gBAC7E,IAAI,CAAC;oBACH,YAAY,GAAG,IAAA,yDAAuC,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC9E,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,IAAI,qCAA4B,CAAC,6BAA6B,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,OAAgC,CAAC;gBACrC,IAAI,CAAC;oBACH,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5E,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,YAAY,GAAG,IAAA,wDAAmC,EAAC,OAAO,CAAC,CAAC;gBAClE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,8BAAqB,CAAC,kCAAkC,CAAC,CAAC;gBACtE,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;gBACtF,IAAI,CAAC,IAAA,qDAAgC,EAAC,WAAW,CAAC,IAAI,CAAC,IAAA,iDAA4B,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC1G,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;gBAED,OAAO,CAAC,IAAI,GAAG,IAAA,mDAA8B,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,qCAA4B,IAAI,KAAK,YAAY,8BAAqB,EAAE,CAAC;oBAC5F,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,qCAA4B,CAAC,yCAAyC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AA/CY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;6CACI,yBAAW;GAHhC,cAAc,CA+C1B","sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n InternalServerErrorException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport * as jwt from 'jsonwebtoken';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { UserService } from '../Services/UserService/UserService';\nimport {\n buildAuthenticatedTokenPayload,\n extractAccessiBearerToken,\n isAuthenticatedUserEnabledForJwt,\n isAccessiTokenAllowedForUser,\n resolveCodiceUtenteFromTokenPayload,\n} from '../security/authenticatedToken';\nimport { getAccessiAccessTokenVerificationConfig } from '../security/jwtTokenOptions';\n\n@Injectable()\nexport class JwtSimpleGuard implements CanActivate {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly userService: UserService,\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest();\n\n const authHeader = request.headers['authorization'];\n if (!authHeader) throw new UnauthorizedException('Token mancante.');\n\n const token = extractAccessiBearerToken(authHeader);\n if (!token) throw new UnauthorizedException('Formato token non valido.');\n\n try {\n let verification: ReturnType<typeof getAccessiAccessTokenVerificationConfig>;\n try {\n verification = getAccessiAccessTokenVerificationConfig(this.accessiOptions);\n } catch {\n throw new InternalServerErrorException('Chiave JWT non configurata.');\n }\n let payload: jwt.JwtPayload | string;\n try {\n payload = jwt.verify(token, verification.key, verification.verifyOptions);\n } catch {\n throw new UnauthorizedException('Token non valido o scaduto.');\n }\n const codiceUtente = resolveCodiceUtenteFromTokenPayload(payload);\n if (!codiceUtente) {\n throw new UnauthorizedException('Token privo di un utente valido.');\n }\n\n const currentUser = await this.userService.getAuthenticatedUserSnapshot(codiceUtente);\n if (!isAuthenticatedUserEnabledForJwt(currentUser) || !isAccessiTokenAllowedForUser(payload, currentUser)) {\n throw new UnauthorizedException('Utente non piu autorizzato.');\n }\n\n request.user = buildAuthenticatedTokenPayload(payload, currentUser);\n return true;\n } catch (error) {\n if (error instanceof InternalServerErrorException || error instanceof UnauthorizedException) {\n throw error;\n }\n throw new InternalServerErrorException('Errore durante la verifica dell utente.');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/accessi-module/jwt/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,kDAAoC;AAEpC,qEAAkE;AAClE,uEAMwC;AACxC,iEAAsF;AACtF,qEAAsE;AAG/D,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAC8C,cAA8B,EACzD,WAAwB;QADG,mBAAc,GAAd,cAAc,CAAgB;QACzD,gBAAW,GAAX,WAAW,CAAa;IACxC,CAAC;IAEE,WAAW,CAAC,OAAyB;;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG,IAAA,8CAAyB,EAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAEzE,IAAI,CAAC;gBACH,IAAI,YAAwE,CAAC;gBAC7E,IAAI,CAAC;oBACH,YAAY,GAAG,IAAA,yDAAuC,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC9E,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,IAAI,qCAA4B,CAAC,6BAA6B,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,OAAgC,CAAC;gBACrC,IAAI,CAAC;oBACH,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5E,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,YAAY,GAAG,IAAA,wDAAmC,EAAC,OAAO,CAAC,CAAC;gBAClE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,8BAAqB,CAAC,kCAAkC,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,MAAM,IAAA,yCAAqB,EAAC,IAAI,CAAC,cAAc,EAAE,OAAkC,EAAE,YAAY,CAAC,EAAE,CAAC;oBACvG,MAAM,IAAI,8BAAqB,CAAC,oBAAoB,CAAC,CAAC;gBACxD,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;gBACtF,IAAI,CAAC,IAAA,qDAAgC,EAAC,WAAW,CAAC,IAAI,CAAC,IAAA,iDAA4B,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC1G,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;gBAED,OAAO,CAAC,IAAI,GAAG,IAAA,mDAA8B,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,qCAA4B,IAAI,KAAK,YAAY,8BAAqB,EAAE,CAAC;oBAC5F,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,qCAA4B,CAAC,yCAAyC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AAlDY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;6CACI,yBAAW;GAHhC,cAAc,CAkD1B","sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n InternalServerErrorException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport * as jwt from 'jsonwebtoken';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { UserService } from '../Services/UserService/UserService';\nimport {\n buildAuthenticatedTokenPayload,\n extractAccessiBearerToken,\n isAuthenticatedUserEnabledForJwt,\n isAccessiTokenAllowedForUser,\n resolveCodiceUtenteFromTokenPayload,\n} from '../security/authenticatedToken';\nimport { getAccessiAccessTokenVerificationConfig } from '../security/jwtTokenOptions';\nimport { isAccessiTokenRevoked } from '../security/sessionRevocation';\n\n@Injectable()\nexport class JwtSimpleGuard implements CanActivate {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly userService: UserService,\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest();\n\n const authHeader = request.headers['authorization'];\n if (!authHeader) throw new UnauthorizedException('Token mancante.');\n\n const token = extractAccessiBearerToken(authHeader);\n if (!token) throw new UnauthorizedException('Formato token non valido.');\n\n try {\n let verification: ReturnType<typeof getAccessiAccessTokenVerificationConfig>;\n try {\n verification = getAccessiAccessTokenVerificationConfig(this.accessiOptions);\n } catch {\n throw new InternalServerErrorException('Chiave JWT non configurata.');\n }\n let payload: jwt.JwtPayload | string;\n try {\n payload = jwt.verify(token, verification.key, verification.verifyOptions);\n } catch {\n throw new UnauthorizedException('Token non valido o scaduto.');\n }\n const codiceUtente = resolveCodiceUtenteFromTokenPayload(payload);\n if (!codiceUtente) {\n throw new UnauthorizedException('Token privo di un utente valido.');\n }\n if (await isAccessiTokenRevoked(this.accessiOptions, payload as Record<string, unknown>, codiceUtente)) {\n throw new UnauthorizedException('Sessione revocata.');\n }\n\n const currentUser = await this.userService.getAuthenticatedUserSnapshot(codiceUtente);\n if (!isAuthenticatedUserEnabledForJwt(currentUser) || !isAccessiTokenAllowedForUser(payload, currentUser)) {\n throw new UnauthorizedException('Utente non piu autorizzato.');\n }\n\n request.user = buildAuthenticatedTokenPayload(payload, currentUser);\n return true;\n } catch (error) {\n if (error instanceof InternalServerErrorException || error instanceof UnauthorizedException) {\n throw error;\n }\n throw new InternalServerErrorException('Errore durante la verifica dell utente.');\n }\n }\n}\n"]}
@@ -67,6 +67,7 @@ const Logger_1 = require("../../Logger");
67
67
  const accessiRequirements_1 = require("./accessiRequirements");
68
68
  const authenticatedToken_1 = require("../security/authenticatedToken");
69
69
  const jwtTokenOptions_1 = require("../security/jwtTokenOptions");
70
+ const sessionRevocation_1 = require("../security/sessionRevocation");
70
71
  const logger = new Logger_1.Logger("AuthenticateGen");
71
72
  const ACCESSI_AUTH_SERVICE_LOCALS_KEY = "accessiAuthService";
72
73
  const ACCESSI_AUTH_SERVICE_GLOBAL_KEY = Symbol.for("emilsoftware.accessiAuthService");
@@ -160,6 +161,9 @@ function authorizeWithDependencies(req, res, next, options, accessiOptions, perm
160
161
  if (!codiceUtente) {
161
162
  throw authError(401, "AUTH_USER_CODE_MISSING", "codiceUtente not found in token payload");
162
163
  }
164
+ if (yield (0, sessionRevocation_1.isAccessiTokenRevoked)(accessiOptions, decoded, codiceUtente)) {
165
+ throw authError(401, "AUTH_TOKEN_REVOKED", "Session revoked");
166
+ }
163
167
  const currentUser = yield userService.getAuthenticatedUserSnapshot(codiceUtente);
164
168
  if (!(0, authenticatedToken_1.isAuthenticatedUserEnabledForJwt)(currentUser) || !(0, authenticatedToken_1.isAccessiTokenAllowedForUser)(decoded, currentUser)) {
165
169
  throw authError(401, "AUTH_USER_DISABLED", "User is no longer authorized");