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
@@ -0,0 +1,190 @@
1
+ {
2
+ "paths": [
3
+ "DELETE /api/accessi/federated-auth/identities/{identityKey} disableFederatedIdentity",
4
+ "DELETE /api/accessi/federated-auth/providers/{provider} deleteFederatedProvider",
5
+ "DELETE /api/accessi/federated-auth/users/{codiceUtente}/identities/{identityKey} deleteFederatedIdentityPermanently",
6
+ "DELETE /api/accessi/filtri/tipi/{tipFil} deleteTipoFiltro",
7
+ "DELETE /api/accessi/permission/delete-role/{codiceRuolo} deleteRole",
8
+ "DELETE /api/accessi/permission/menu-groups/{codiceGruppo} deleteMenuGroup",
9
+ "DELETE /api/accessi/permission/menu-types/{codiceTipo} deleteMenuType",
10
+ "DELETE /api/accessi/permission/menus/{codiceMenu} deleteMenu",
11
+ "DELETE /api/accessi/permission/scopes/{codiceScope} deleteScope",
12
+ "DELETE /api/accessi/service-token/{tokenId} revokeServiceToken",
13
+ "DELETE /api/accessi/user/delete-user-permanent/{codiceUtente} deleteUserPermanently",
14
+ "DELETE /api/accessi/user/delete-user/{codiceUtente} deleteUser",
15
+ "GET /api/accessi/auth/bootstrap-admin/status getAdminBootstrapStatus",
16
+ "GET /api/accessi/email/reset-password-page/{token} serveResetPasswordPage",
17
+ "GET /api/accessi/federated-auth/providers getFederatedProviders",
18
+ "GET /api/accessi/federated-auth/users/{codiceUtente}/identities getFederatedIdentities",
19
+ "GET /api/accessi/filtri/tipi getTipiFiltro",
20
+ "GET /api/accessi/filtri/utente getFiltriUtente",
21
+ "GET /api/accessi/permission/grants/{codiceUtente} getUserRolesAndGrants",
22
+ "GET /api/accessi/permission/groups-with-menus getGroupsWithMenus",
23
+ "GET /api/accessi/permission/menu-types getMenuTypes",
24
+ "GET /api/accessi/permission/menus getMenus",
25
+ "GET /api/accessi/permission/menus/{codiceMenu}/scopes getMenuScopes",
26
+ "GET /api/accessi/permission/roles getRoles",
27
+ "GET /api/accessi/permission/scopes getScopes",
28
+ "GET /api/accessi/schema getSchema",
29
+ "GET /api/accessi/service-token getServiceTokens",
30
+ "GET /api/accessi/user/get-users getUsers",
31
+ "GET /api/accessi/user/reset-password/{token} serveResetPasswordPageUser",
32
+ "PATCH /api/accessi/configurator/groups/{codiceGruppo}/enabled setGroupEnabled",
33
+ "PATCH /api/accessi/configurator/menus/{codiceMenu}/enabled setMenuEnabled",
34
+ "PATCH /api/accessi/federated-auth/identities/{identityKey} updateFederatedIdentity",
35
+ "PATCH /api/accessi/federated-auth/providers/{provider} updateFederatedProvider",
36
+ "PATCH /api/accessi/federated-auth/users/{codiceUtente}/password-login setPasswordLoginPolicy",
37
+ "PATCH /api/accessi/user/set-gdpr/{codiceUtente} setGdpr",
38
+ "POST /api/accessi/auth/bootstrap-admin bootstrapAdmin",
39
+ "POST /api/accessi/auth/confirm-reset-password/{token} resetPassword",
40
+ "POST /api/accessi/auth/get-user-by-token getUserByToken",
41
+ "POST /api/accessi/auth/introspect introspectAccessiToken",
42
+ "POST /api/accessi/auth/login login",
43
+ "POST /api/accessi/auth/refresh refreshAccessToken",
44
+ "POST /api/accessi/auth/revoke-sessions revokeSessions",
45
+ "POST /api/accessi/auth/two-factor/resend resendTwoFactor",
46
+ "POST /api/accessi/auth/two-factor/verify verifyTwoFactor",
47
+ "POST /api/accessi/console/entry createConsoleEntryTicket",
48
+ "POST /api/accessi/console/entry/exchange exchangeConsoleEntryTicket",
49
+ "POST /api/accessi/email/send-reset-password-email sendPasswordResetEmail",
50
+ "POST /api/accessi/federated-auth/exchange exchangeFederatedIdentity",
51
+ "POST /api/accessi/federated-auth/providers createFederatedProvider",
52
+ "POST /api/accessi/federated-auth/users createFederatedUser",
53
+ "POST /api/accessi/federated-auth/users/{codiceUtente}/identities linkFederatedIdentity",
54
+ "POST /api/accessi/filtri/tipi createTipoFiltro",
55
+ "POST /api/accessi/filtri/utente saveFiltriUtente",
56
+ "POST /api/accessi/permission/assign-permissions/{codiceUtente} assignPermissionsToUser",
57
+ "POST /api/accessi/permission/assign-roles/{codiceUtente} assignRolesToUser",
58
+ "POST /api/accessi/permission/create-role createRole",
59
+ "POST /api/accessi/permission/menu-groups createMenuGroup",
60
+ "POST /api/accessi/permission/menu-types createMenuType",
61
+ "POST /api/accessi/permission/menus createMenu",
62
+ "POST /api/accessi/permission/scopes createScope",
63
+ "POST /api/accessi/service-token createServiceToken",
64
+ "POST /api/accessi/service-token/{tokenId}/rotate rotateServiceToken",
65
+ "POST /api/accessi/user/create-managed-user createManagedUser",
66
+ "POST /api/accessi/user/force-password-reset-legacy forcePasswordResetLegacy",
67
+ "POST /api/accessi/user/force-password-reset/{codiceUtente} forcePasswordReset",
68
+ "POST /api/accessi/user/login-as/{codiceUtente} createLoginAsUrl",
69
+ "POST /api/accessi/user/register register",
70
+ "POST /api/accessi/user/set-password/{codiceUtente} setUserPassword",
71
+ "POST /api/accessi/user/set-stato setStatoRegistrazione",
72
+ "PUT /api/accessi/filtri/tipi/{tipFil} updateTipoFiltro",
73
+ "PUT /api/accessi/permission/menu-groups/{codiceGruppo} updateMenuGroup",
74
+ "PUT /api/accessi/permission/menu-types/{codiceTipo} updateMenuType",
75
+ "PUT /api/accessi/permission/menus/{codiceMenu} updateMenu",
76
+ "PUT /api/accessi/permission/menus/{codiceMenu}/scopes setMenuScopes",
77
+ "PUT /api/accessi/permission/scopes/{codiceScope} updateScope",
78
+ "PUT /api/accessi/permission/scopes/{codiceScope}/menus setScopeMenus",
79
+ "PUT /api/accessi/permission/update-role/{codiceRuolo} updateRole",
80
+ "PUT /api/accessi/user/update-user/{codiceUtente} updateUtente"
81
+ ],
82
+ "schemas": [
83
+ "AbilitazioneMenu",
84
+ "AccessiIntrospectionResultDto",
85
+ "ActionResponse",
86
+ "AdminBootstrapStatusResponse",
87
+ "AdminBootstrapStatusResult",
88
+ "AssignPermissionsToUserRequest",
89
+ "AssignRolesToUserRequest",
90
+ "AuthenticatedTokenPayloadDto",
91
+ "AuthenticatedUserPayloadDto",
92
+ "BootstrapAdminRequest",
93
+ "BootstrapAdminResponse",
94
+ "BootstrapAdminResultDto",
95
+ "ConfirmResetPasswordRequest",
96
+ "ConsoleEntryExchangeRequest",
97
+ "ConsoleEntrySessionResponse",
98
+ "ConsoleEntrySessionResult",
99
+ "ConsoleEntryTicketResponse",
100
+ "ConsoleEntryTicketResult",
101
+ "ConsoleEntryTokenResult",
102
+ "CreateFederatedIdentityRequest",
103
+ "CreateFederatedProviderRequest",
104
+ "CreateFederatedUserRequest",
105
+ "CreateFilterTypeRequest",
106
+ "CreateMenuGroupRequest",
107
+ "CreateMenuRequest",
108
+ "CreateMenuTypeRequest",
109
+ "CreateScopeRequest",
110
+ "CreateServiceTokenRequest",
111
+ "CreateServiceTokenResponse",
112
+ "ErrorResponse",
113
+ "ExchangeFederatedIdentityRequest",
114
+ "FederatedAuthenticationResultDto",
115
+ "FederatedExchangeResponse",
116
+ "FederatedIdentityListResponse",
117
+ "FederatedIdentityResponse",
118
+ "FederatedIdentityResponseDto",
119
+ "FederatedProviderListResponse",
120
+ "FederatedProviderResponse",
121
+ "FederatedProviderResponseDto",
122
+ "FiltriUtente",
123
+ "GetFiltriResponse",
124
+ "GetFiltriUtenteResponse",
125
+ "GetGroupsWithMenusResponse",
126
+ "GetMenuScopesResponse",
127
+ "GetMenuTypesResponse",
128
+ "GetMenusResponse",
129
+ "GetRolesResponse",
130
+ "GetSchemaResponse",
131
+ "GetScopesResponse",
132
+ "GetServiceTokensResponse",
133
+ "GetUserByTokenRequest",
134
+ "GetUserByTokenResponse",
135
+ "GetUsersResponse",
136
+ "GetUsersResult",
137
+ "GroupWithMenusEntity",
138
+ "IntrospectAccessiTokenRequest",
139
+ "IntrospectAccessiTokenResponse",
140
+ "IssuedServiceTokenDto",
141
+ "LoginAsRequest",
142
+ "LoginAsResponse",
143
+ "LoginAsResult",
144
+ "LoginRequest",
145
+ "LoginResponse",
146
+ "LoginResult",
147
+ "MenuEntity",
148
+ "MenuTypeEntity",
149
+ "PasswordExpiredResponse",
150
+ "Permission",
151
+ "PublicRegisterRequest",
152
+ "RefreshTokenRequest",
153
+ "RefreshTokenResponse",
154
+ "RefreshTokenResult",
155
+ "RegisterRequest",
156
+ "RegisterResponse",
157
+ "ResendTwoFactorRequest",
158
+ "Role",
159
+ "RuoliMenu",
160
+ "SchemaDdlResult",
161
+ "SchemaDdlSection",
162
+ "ScopeEntity",
163
+ "SendResetPasswordEmailRequest",
164
+ "ServiceTokenDto",
165
+ "SetMenuScopesRequest",
166
+ "SetPasswordLoginPolicyRequest",
167
+ "SetScopeMenusRequest",
168
+ "SetStatoRegistrazioneDto",
169
+ "SetUserPasswordRequest",
170
+ "Status",
171
+ "TipoFiltro",
172
+ "TokenResult",
173
+ "TwoFactorChallengeDto",
174
+ "UpdateEnabledStatusRequest",
175
+ "UpdateFederatedIdentityRequest",
176
+ "UpdateFederatedProviderRequest",
177
+ "UpdateFilterTypeRequest",
178
+ "UpdateMenuGroupRequest",
179
+ "UpdateMenuRequest",
180
+ "UpdateMenuTypeRequest",
181
+ "UpdateScopeRequest",
182
+ "UserDto",
183
+ "UserGrantsDto",
184
+ "UserGrantsResponse",
185
+ "VerifyTwoFactorRequest"
186
+ ],
187
+ "securitySchemes": [
188
+ "bearer"
189
+ ]
190
+ }
@@ -0,0 +1,98 @@
1
+ # Gateway rate limit per Accessi Service
2
+
3
+ Il rate limit applicativo di Accessi protegge login, 2FA, reset password, console entry e service token. Il gateway/API gateway resta utile per una protezione per IP, connessioni e bot prima che la richiesta raggiunga Node.
4
+
5
+ Regole consigliate:
6
+
7
+ - `/api/accessi/auth/*`: soglia bassa, burst contenuto
8
+ - `/api/accessi/console/entry/exchange`: soglia bassa
9
+ - `/api/accessi/*`: soglia media
10
+ - `/accessi/openapi*` e `/accessi/.well-known/jwks.json`: soglia alta o cache CDN
11
+
12
+ ## Nginx
13
+
14
+ ```nginx
15
+ limit_req_zone $binary_remote_addr zone=accessi_auth:10m rate=2r/s;
16
+ limit_req_zone $binary_remote_addr zone=accessi_api:10m rate=10r/s;
17
+ limit_conn_zone $binary_remote_addr zone=accessi_conn:10m;
18
+
19
+ server {
20
+ # Se Accessi e dietro un proxy/load balancer, configura real_ip
21
+ # prima di usare $binary_remote_addr.
22
+
23
+ location /api/accessi/auth/ {
24
+ limit_req zone=accessi_auth burst=10 nodelay;
25
+ limit_conn accessi_conn 20;
26
+ proxy_pass http://accessi_service;
27
+ }
28
+
29
+ location /api/accessi/ {
30
+ limit_req zone=accessi_api burst=50 nodelay;
31
+ limit_conn accessi_conn 20;
32
+ proxy_pass http://accessi_service;
33
+ }
34
+
35
+ location /accessi/ {
36
+ limit_req zone=accessi_api burst=50 nodelay;
37
+ proxy_pass http://accessi_service;
38
+ }
39
+ }
40
+ ```
41
+
42
+ ## Traefik
43
+
44
+ ```yaml
45
+ http:
46
+ middlewares:
47
+ accessi-auth-ratelimit:
48
+ rateLimit:
49
+ average: 2
50
+ burst: 10
51
+ period: 1s
52
+ accessi-api-ratelimit:
53
+ rateLimit:
54
+ average: 10
55
+ burst: 50
56
+ period: 1s
57
+ routers:
58
+ accessi-auth:
59
+ rule: PathPrefix(`/api/accessi/auth/`)
60
+ middlewares: [accessi-auth-ratelimit]
61
+ service: accessi
62
+ accessi-api:
63
+ rule: PathPrefix(`/api/accessi/`) || PathPrefix(`/accessi/`)
64
+ middlewares: [accessi-api-ratelimit]
65
+ service: accessi
66
+ ```
67
+
68
+ ## Cloudflare
69
+
70
+ Regole di rate limiting:
71
+
72
+ - path `/api/accessi/auth/*`: 10 richieste/minuto per IP, azione `managed challenge`
73
+ - path `/api/accessi/console/entry/exchange`: 30 richieste/5 minuti per IP
74
+ - path `/api/accessi/*`: 300 richieste/minuto per IP, azione `block`
75
+ - path `/accessi/.well-known/jwks.json`: cache CDN, limite alto
76
+
77
+ Aggiungere bot fight mode/WAF secondo il piano disponibile.
78
+
79
+ ## AWS WAF / API Gateway
80
+
81
+ - rate-based rule: 300 richieste/5 minuti per IP
82
+ - scope-down statement: `URI starts with /api/accessi`
83
+ - regola più severa su `/api/accessi/auth/*`
84
+ - AWS Shield/WAF Bot Control se disponibile
85
+
86
+ ## Rapporto con `edgeRateLimit` della libreria
87
+
88
+ `edgeRateLimit` e un ultimo livello applicativo:
89
+
90
+ - usa lo stesso `RateLimitStore` Redis dei rate limit per account;
91
+ - copre Accessi anche se il gateway non ha regole specifiche;
92
+ - non sostituisce WAF, bot protection, limiti di connessione o protezione DDoS.
93
+
94
+ In produzione usare entrambi:
95
+
96
+ ```text
97
+ Client -> CDN/WAF -> API gateway -> edgeRateLimit Accessi -> rate limit per account
98
+ ```
@@ -0,0 +1,176 @@
1
+ # Accessi Service standalone
2
+
3
+ Accessi puo girare come servizio autonomo, senza un backend ospitante.
4
+
5
+ ## Avvio da codice
6
+
7
+ ```ts
8
+ import { startAccessiService } from "emilsoftware-utilities/accessi/server";
9
+
10
+ await startAccessiService({
11
+ port: Number(process.env.PORT ?? 3000),
12
+ healthPath: "/health",
13
+ metrics: true,
14
+ });
15
+ ```
16
+
17
+ `startAccessiService`:
18
+
19
+ - valida `AccessiOptions` con `assertValidAccessiOptions`
20
+ - crea l'app Express
21
+ - monta `/health/live`, `/health/ready`, `/health/metrics`
22
+ - inizializza Accessi
23
+ - avvia il server
24
+ - registra `SIGTERM`/`SIGINT` per lo shutdown graceful
25
+ - chiude Nest e i pool Firebird
26
+
27
+ Per un controllo manuale usare `createAccessiService`, che restituisce `start()` e `stop()`.
28
+
29
+ ## Avvio da CLI
30
+
31
+ ```bash
32
+ npm run accessi:serve
33
+ npm run accessi:serve:dist
34
+ ```
35
+
36
+ La configurazione viene letta da `createAccessiOptionsFromEnv()`.
37
+
38
+ ## Health
39
+
40
+ ```text
41
+ GET /health/live -> 200 se il processo e vivo
42
+ GET /health/ready -> 200 se DB e store configurati sono pronti
43
+ GET /health/metrics -> metriche Prometheus testuali
44
+ ```
45
+
46
+ `/health/ready` controlla:
47
+
48
+ - bootstrap completato
49
+ - database Accessi raggiungibile e schema inizializzato
50
+ - `healthCheck()` degli store Redis configurati
51
+ - `readinessChecks` aggiuntivi passati dal chiamante
52
+
53
+ ## Esecuzione come processo
54
+
55
+ In produzione il servizio viene eseguito come processo Node gestito da systemd, PM2 o dal supervisor del cliente:
56
+
57
+ ```bash
58
+ npm run accessi:serve:dist
59
+ # oppure
60
+ node dist/scripts/startAccessiService.js
61
+ ```
62
+
63
+ Esempio systemd minimale:
64
+
65
+ ```ini
66
+ [Unit]
67
+ Description=Accessi Service
68
+ After=network.target
69
+
70
+ [Service]
71
+ WorkingDirectory=/opt/accessi-service
72
+ EnvironmentFile=/etc/accessi/accessi.env
73
+ ExecStart=/usr/bin/node dist/scripts/startAccessiService.js
74
+ Restart=on-failure
75
+ RestartSec=5
76
+ KillSignal=SIGTERM
77
+ TimeoutStopSec=15
78
+
79
+ [Install]
80
+ WantedBy=multi-user.target
81
+ ```
82
+
83
+ Il readiness endpoint `/health/ready` va usato dal load balancer o dal supervisore per decidere quando inviare traffico.
84
+
85
+ ## Configurazione consigliata
86
+
87
+ - `ACCESSI_DB_*`
88
+ - `ACCESSI_ENCRYPTION_KEY`
89
+ - `ACCESSI_JWT_SECRET`
90
+ - `ACCESSI_JWT_ISSUER`
91
+ - `ACCESSI_JWT_AUDIENCE`
92
+ - `ACCESSI_JWT_ALGORITHM`, `ACCESSI_JWT_PRIVATE_KEY`, `ACCESSI_JWT_PUBLIC_KEY`, `ACCESSI_JWT_KEY_ID` per RS/ES
93
+ - `ACCESSI_JWKS_PATH`
94
+ - SMTP
95
+ - `PORT`
96
+
97
+ Per Redis, passare gli store nel bootstrap applicativo:
98
+
99
+ ```ts
100
+ import { createRedisRateLimitStore, createRedisConsoleEntryStore } from "emilsoftware-utilities/accessi/server";
101
+ ```
102
+
103
+ ## Generazione chiavi JWT
104
+
105
+ ```bash
106
+ npm run accessi:generate-jwt-keys -- --algorithm RS256 --out ./keys
107
+ ```
108
+
109
+ Genera:
110
+
111
+ - `jwt-private.pem`
112
+ - `jwt-public.pem`
113
+ - `jwks.json`
114
+ - `jwt-keys.json` con `algorithm` e `keyId`
115
+
116
+ Configurare poi:
117
+
118
+ ```env
119
+ ACCESSI_JWT_ALGORITHM=RS256
120
+ ACCESSI_JWT_PRIVATE_KEY=<contenuto jwt-private.pem>
121
+ ACCESSI_JWT_PUBLIC_KEY=<contenuto jwt-public.pem>
122
+ ACCESSI_JWT_KEY_ID=<keyId>
123
+ ```
124
+
125
+ ## Revoca sessioni
126
+
127
+ ```ts
128
+ import { createRedisSessionRevocationStore } from "emilsoftware-utilities/accessi/server";
129
+
130
+ sessionRevocation: {
131
+ store: createRedisSessionRevocationStore({
132
+ client: redis,
133
+ ttlMs: 30 * 24 * 60 * 60 * 1000, // maggiore della durata massima dei token
134
+ }),
135
+ }
136
+ ```
137
+
138
+ Endpoint utente:
139
+
140
+ ```http
141
+ POST /api/accessi/auth/revoke-sessions
142
+ Authorization: Bearer <access-token>
143
+ ```
144
+
145
+ I resource server fratelli devono ricevere lo stesso store in `revocation.store`.
146
+
147
+ ## Console su dominio separato
148
+
149
+ Se la console è servita da un dominio diverso dall’API:
150
+
151
+ ```ts
152
+ accessiOptions: {
153
+ ...options,
154
+ consoleApiBaseUrl: "https://accessi.example.com",
155
+ }
156
+ ```
157
+
158
+ Accessi inietta `window.__ACCESSI_API_BASE_URL__` nella pagina della console.
159
+
160
+ ## CORS e proxy
161
+
162
+ ```ts
163
+ accessiOptions: {
164
+ ...options,
165
+ http: {
166
+ cors: {
167
+ origin: ["https://app.example.com"],
168
+ credentials: false,
169
+ },
170
+ trustProxy: 1, // load balancer/reverse proxy
171
+ securityHeaders: true,
172
+ },
173
+ }
174
+ ```
175
+
176
+ Con Bearer token non serve CSRF. Se in futuro si passasse a cookie httpOnly, aggiungere CSRF e configurazione cookie same-site.