@payez/next-mvp 4.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/auth-handler.d.ts +66 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +110 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +19 -0
- package/dist/api-handlers/admin/analytics.js +378 -0
- package/dist/api-handlers/admin/audit.d.ts +19 -0
- package/dist/api-handlers/admin/audit.js +213 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +42 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +35 -0
- package/dist/api-handlers/admin/redis-sessions.js +203 -0
- package/dist/api-handlers/admin/sessions.d.ts +20 -0
- package/dist/api-handlers/admin/sessions.js +283 -0
- package/dist/api-handlers/admin/site-logs.d.ts +45 -0
- package/dist/api-handlers/admin/site-logs.js +317 -0
- package/dist/api-handlers/admin/stats.d.ts +20 -0
- package/dist/api-handlers/admin/stats.js +239 -0
- package/dist/api-handlers/admin/users.d.ts +19 -0
- package/dist/api-handlers/admin/users.js +221 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +79 -0
- package/dist/api-handlers/admin/vibe-data.js +267 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +633 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +186 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +23 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +93 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +90 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +114 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +59 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/better-auth.d.ts +79 -0
- package/dist/auth/better-auth.js +119 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +384 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +83 -0
- package/dist/auth/utils/token-utils.js +218 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +115 -0
- package/dist/client/better-auth-client.d.ts +1020 -0
- package/dist/client/better-auth-client.js +68 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +121 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/MobileNavDrawer.d.ts +32 -0
- package/dist/components/account/MobileNavDrawer.js +81 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +91 -0
- package/dist/components/account/index.d.ts +9 -0
- package/dist/components/account/index.js +13 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +71 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +81 -0
- package/dist/config/vibe-log-transport.js +212 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +83 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +43 -0
- package/dist/hooks/useAvailableProviders.js +112 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +56 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +269 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +53 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +425 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +170 -0
- package/dist/lib/session-store.js +545 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +791 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +257 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +86 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +78 -0
- package/dist/lib/token-lifecycle.js +360 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +102 -0
- package/dist/middleware/create-middleware.js +469 -0
- package/dist/middleware/rbac-check.d.ts +51 -0
- package/dist/middleware/rbac-check.js +219 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +73 -0
- package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +18 -0
- package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +276 -0
- package/dist/pages/admin-page-permissions/index.d.ts +6 -0
- package/dist/pages/admin-page-permissions/index.js +13 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +16 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +261 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +179 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/coming-soon/page.d.ts +8 -0
- package/dist/pages/coming-soon/page.js +28 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +230 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +142 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +99 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +116 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +93 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +51 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +412 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +98 -0
- package/dist/routes/auth/nextauth.d.ts +22 -0
- package/dist/routes/auth/nextauth.js +40 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +43 -0
- package/dist/routes/auth/session.js +157 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +190 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/server/auth-guard.d.ts +46 -0
- package/dist/server/auth-guard.js +128 -0
- package/dist/server/auth.d.ts +50 -0
- package/dist/server/auth.js +62 -0
- package/dist/server/decode-session.d.ts +30 -0
- package/dist/server/decode-session.js +78 -0
- package/dist/server/slim-middleware.d.ts +23 -0
- package/dist/server/slim-middleware.js +89 -0
- package/dist/server/with-auth.d.ts +33 -0
- package/dist/server/with-auth.js +59 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1527 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/enterprise-auth.d.ts +106 -0
- package/dist/vibe/enterprise-auth.js +173 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +25 -0
- package/dist/vibe/index.js +72 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +1 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page RBAC Check Module
|
|
4
|
+
*
|
|
5
|
+
* Checks page-level permissions via Vibe API through the IDP Proxy.
|
|
6
|
+
* Uses in-memory cache to reduce API calls.
|
|
7
|
+
* Fails closed (DENY) on errors or timeout.
|
|
8
|
+
*
|
|
9
|
+
* All requests route through the IDP Vibe Proxy ({IDP_URL}/api/vibe/proxy)
|
|
10
|
+
* which injects proper HMAC credentials for the Vibe API.
|
|
11
|
+
*
|
|
12
|
+
* @version 2.0.0
|
|
13
|
+
* @since page-rbac-2026-01
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.clearRBACCache = clearRBACCache;
|
|
17
|
+
exports.checkPagePermission = checkPagePermission;
|
|
18
|
+
exports.isRBACEnabled = isRBACEnabled;
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// WEB CRYPTO HELPERS (Edge Runtime compatible)
|
|
21
|
+
// ============================================================================
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
async function sha256Hex(input) {
|
|
24
|
+
const data = encoder.encode(input);
|
|
25
|
+
const hash = await crypto.subtle.digest('SHA-256', data);
|
|
26
|
+
return Array.from(new Uint8Array(hash))
|
|
27
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
28
|
+
.join('');
|
|
29
|
+
}
|
|
30
|
+
async function hmacSha256Base64(key, message) {
|
|
31
|
+
const cryptoKey = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
32
|
+
const signature = await crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(message));
|
|
33
|
+
return btoa(String.fromCharCode(...new Uint8Array(signature)));
|
|
34
|
+
}
|
|
35
|
+
function base64ToUint8Array(base64) {
|
|
36
|
+
const binary = atob(base64);
|
|
37
|
+
const bytes = new Uint8Array(binary.length);
|
|
38
|
+
for (let i = 0; i < binary.length; i++) {
|
|
39
|
+
bytes[i] = binary.charCodeAt(i);
|
|
40
|
+
}
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// CACHE
|
|
45
|
+
// ============================================================================
|
|
46
|
+
const rbacCache = new Map();
|
|
47
|
+
const DEFAULT_CACHE_TTL = 60; // 60 seconds
|
|
48
|
+
const MAX_CACHE_TTL = 300; // 5 minutes max - prevents cache poisoning
|
|
49
|
+
const MAX_CACHE_SIZE = 1000;
|
|
50
|
+
/**
|
|
51
|
+
* Generate cache key for RBAC result.
|
|
52
|
+
* Uses SHA-256 hash to avoid key collisions and limit key size.
|
|
53
|
+
*/
|
|
54
|
+
async function getCacheKey(clientId, path, roles) {
|
|
55
|
+
const sortedRoles = [...roles].sort().join(',');
|
|
56
|
+
const input = JSON.stringify({ clientId, path, roles: sortedRoles });
|
|
57
|
+
const hash = await sha256Hex(input);
|
|
58
|
+
return hash.substring(0, 32);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get cached RBAC result if valid.
|
|
62
|
+
*/
|
|
63
|
+
function getCachedResult(key) {
|
|
64
|
+
const cached = rbacCache.get(key);
|
|
65
|
+
if (cached && cached.expires > Date.now()) {
|
|
66
|
+
return cached.result;
|
|
67
|
+
}
|
|
68
|
+
// Clean up expired entry
|
|
69
|
+
if (cached) {
|
|
70
|
+
rbacCache.delete(key);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Cache an RBAC result.
|
|
76
|
+
*/
|
|
77
|
+
function setCachedResult(key, result) {
|
|
78
|
+
// Prevent unbounded cache growth
|
|
79
|
+
if (rbacCache.size >= MAX_CACHE_SIZE) {
|
|
80
|
+
// Remove oldest entries (first 100)
|
|
81
|
+
const keysToDelete = Array.from(rbacCache.keys()).slice(0, 100);
|
|
82
|
+
keysToDelete.forEach(k => rbacCache.delete(k));
|
|
83
|
+
}
|
|
84
|
+
// SECURITY: Clamp TTL to prevent cache poisoning attacks
|
|
85
|
+
const ttl = Math.min(result.cache_ttl ?? DEFAULT_CACHE_TTL, MAX_CACHE_TTL);
|
|
86
|
+
rbacCache.set(key, {
|
|
87
|
+
result,
|
|
88
|
+
expires: Date.now() + (ttl * 1000),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Clear cache (for testing or config changes).
|
|
93
|
+
*/
|
|
94
|
+
function clearRBACCache() {
|
|
95
|
+
rbacCache.clear();
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// RBAC CHECK (via IDP Proxy)
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* Check if user has permission to access a page.
|
|
102
|
+
*
|
|
103
|
+
* Routes through IDP Vibe Proxy ({IDP_URL}/api/vibe/proxy) which injects
|
|
104
|
+
* proper HMAC credentials. The Vibe RBAC endpoint requires client context
|
|
105
|
+
* that only the proxy can provide.
|
|
106
|
+
*
|
|
107
|
+
* FAIL CLOSED: If proxy is unreachable or times out, access is DENIED.
|
|
108
|
+
*
|
|
109
|
+
* @param path - The route path to check
|
|
110
|
+
* @param userRoles - User's roles from session
|
|
111
|
+
* @param clientId - Client slug for multi-tenancy
|
|
112
|
+
* @param userClaims - Optional claims for claim-based authorization
|
|
113
|
+
* @returns RBAC result with allowed/denied status
|
|
114
|
+
*/
|
|
115
|
+
async function checkPagePermission(path, userRoles, clientId, userClaims) {
|
|
116
|
+
// Check cache first
|
|
117
|
+
const cacheKey = await getCacheKey(clientId, path, userRoles);
|
|
118
|
+
const cached = getCachedResult(cacheKey);
|
|
119
|
+
if (cached) {
|
|
120
|
+
return cached;
|
|
121
|
+
}
|
|
122
|
+
const idpUrl = process.env.NEXT_PUBLIC_IDP_URL || process.env.IDP_URL;
|
|
123
|
+
const vibeClientId = process.env.VIBE_CLIENT_ID;
|
|
124
|
+
const hmacKey = process.env.VIBE_HMAC_KEY || process.env.IDP_SIGNING_KEY;
|
|
125
|
+
if (!idpUrl) {
|
|
126
|
+
console.error('[RBAC] IDP_URL not configured');
|
|
127
|
+
return {
|
|
128
|
+
allowed: false,
|
|
129
|
+
reason: 'rbac_not_configured',
|
|
130
|
+
redirect: '/error?code=rbac_not_configured',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Build RBAC endpoint with query params
|
|
134
|
+
// Vibe route is /v1/rbac/check (no /api/ prefix)
|
|
135
|
+
const params = new URLSearchParams();
|
|
136
|
+
params.set('path', path);
|
|
137
|
+
params.set('roles', userRoles.join(','));
|
|
138
|
+
if (userClaims && Object.keys(userClaims).length > 0) {
|
|
139
|
+
const claimsParam = Object.entries(userClaims)
|
|
140
|
+
.map(([type, value]) => `${type}:${value}`)
|
|
141
|
+
.join(',');
|
|
142
|
+
params.set('claims', claimsParam);
|
|
143
|
+
}
|
|
144
|
+
const rbacEndpoint = `/v1/rbac/check?${params.toString()}`;
|
|
145
|
+
// Build proxy request
|
|
146
|
+
const proxyUrl = `${idpUrl}/api/vibe/proxy`;
|
|
147
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
148
|
+
const headers = {
|
|
149
|
+
'Content-Type': 'application/json',
|
|
150
|
+
'Accept': 'application/json',
|
|
151
|
+
};
|
|
152
|
+
if (vibeClientId) {
|
|
153
|
+
headers['X-Vibe-Client-Id'] = vibeClientId;
|
|
154
|
+
}
|
|
155
|
+
// Sign with HMAC (same format as vibe-client: timestamp|method|endpoint)
|
|
156
|
+
if (hmacKey && vibeClientId) {
|
|
157
|
+
const stringToSign = `${timestamp}|GET|${rbacEndpoint}`;
|
|
158
|
+
const keyBuffer = base64ToUint8Array(hmacKey);
|
|
159
|
+
const signature = await hmacSha256Base64(keyBuffer, stringToSign);
|
|
160
|
+
headers['X-Vibe-Timestamp'] = String(timestamp);
|
|
161
|
+
headers['X-Vibe-Signature'] = signature;
|
|
162
|
+
}
|
|
163
|
+
// Proxy body format: { endpoint, method, data }
|
|
164
|
+
const proxyBody = {
|
|
165
|
+
endpoint: rbacEndpoint,
|
|
166
|
+
method: 'GET',
|
|
167
|
+
data: null,
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
// 2 second timeout - fail closed
|
|
171
|
+
const controller = new AbortController();
|
|
172
|
+
const timeoutId = setTimeout(() => controller.abort(), 2000);
|
|
173
|
+
const response = await fetch(proxyUrl, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers,
|
|
176
|
+
body: JSON.stringify(proxyBody),
|
|
177
|
+
signal: controller.signal,
|
|
178
|
+
});
|
|
179
|
+
clearTimeout(timeoutId);
|
|
180
|
+
if (!response.ok) {
|
|
181
|
+
console.error('[RBAC] Proxy error:', response.status, response.statusText);
|
|
182
|
+
return {
|
|
183
|
+
allowed: false,
|
|
184
|
+
reason: 'rbac_api_error',
|
|
185
|
+
redirect: '/error?code=rbac_error',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const body = await response.json();
|
|
189
|
+
// Vibe API wraps responses: { success: true, data: { allowed, reason, ... } }
|
|
190
|
+
// Unwrap the .data property if present, otherwise use body directly
|
|
191
|
+
const result = body?.data ?? body;
|
|
192
|
+
// Cache the result
|
|
193
|
+
setCachedResult(cacheKey, result);
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
// Fail closed on any error
|
|
198
|
+
if (error.name === 'AbortError') {
|
|
199
|
+
console.error('[RBAC] Proxy timeout (2s exceeded)');
|
|
200
|
+
return {
|
|
201
|
+
allowed: false,
|
|
202
|
+
reason: 'rbac_timeout',
|
|
203
|
+
redirect: '/error?code=rbac_timeout',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
console.error('[RBAC] Proxy error:', error);
|
|
207
|
+
return {
|
|
208
|
+
allowed: false,
|
|
209
|
+
reason: 'rbac_service_unavailable',
|
|
210
|
+
redirect: '/error?code=rbac_unavailable',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check if RBAC is enabled for this deployment.
|
|
216
|
+
*/
|
|
217
|
+
function isRBACEnabled() {
|
|
218
|
+
return process.env.VIBE_RBAC_ENABLED === 'true';
|
|
219
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two-Factor Authentication Presets for MVP Middleware
|
|
3
|
+
*
|
|
4
|
+
* Provides granular control over 2FA requirements per route.
|
|
5
|
+
* Allows routes to require authentication but NOT require 2FA completion,
|
|
6
|
+
* which is essential for 2FA onboarding flows.
|
|
7
|
+
*
|
|
8
|
+
* Ported from website-membership's TwoFactorPresets pattern.
|
|
9
|
+
*
|
|
10
|
+
* @version 2.6.29
|
|
11
|
+
* @since auth-ready-v2
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Two-Factor Authentication Requirements
|
|
15
|
+
*/
|
|
16
|
+
export interface TwoFactorRequirements {
|
|
17
|
+
/** Whether 2FA is required for this route */
|
|
18
|
+
requires2FA: boolean;
|
|
19
|
+
/** Minimum Authentication Context Class Reference level (optional) */
|
|
20
|
+
minACR?: string;
|
|
21
|
+
/** Required Authentication Method References - ALL must be present (optional) */
|
|
22
|
+
requiredAMR?: string[];
|
|
23
|
+
/** Allowed Authentication Method References - at least ONE must be present (optional) */
|
|
24
|
+
allowedAMR?: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Route configuration with 2FA requirements
|
|
28
|
+
*/
|
|
29
|
+
export interface RouteConfig {
|
|
30
|
+
/** Whether authentication is required */
|
|
31
|
+
requiresAuth: boolean;
|
|
32
|
+
/** 2FA requirements for this route */
|
|
33
|
+
twoFactorRequirements?: TwoFactorRequirements;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Common 2FA requirement presets
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* // Configure routes with different 2FA requirements
|
|
41
|
+
* configureRoutes({
|
|
42
|
+
* '/api/account/send-code': { requiresAuth: true, twoFactorRequirements: TwoFactorPresets.NONE },
|
|
43
|
+
* '/api/admin/users': { requiresAuth: true, twoFactorRequirements: TwoFactorPresets.HIGH_SECURITY },
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare const TwoFactorPresets: {
|
|
48
|
+
/**
|
|
49
|
+
* No 2FA required - route is accessible with just authentication
|
|
50
|
+
* Use for: 2FA onboarding routes, profile viewing, non-sensitive operations
|
|
51
|
+
*/
|
|
52
|
+
readonly NONE: TwoFactorRequirements;
|
|
53
|
+
/**
|
|
54
|
+
* Basic 2FA - any authentication method acceptable
|
|
55
|
+
* Use for: Standard protected routes
|
|
56
|
+
*/
|
|
57
|
+
readonly BASIC: TwoFactorRequirements;
|
|
58
|
+
/**
|
|
59
|
+
* Standard 2FA - password + additional factor
|
|
60
|
+
* Use for: Most application features
|
|
61
|
+
*/
|
|
62
|
+
readonly STANDARD: TwoFactorRequirements;
|
|
63
|
+
/**
|
|
64
|
+
* High security - password + MFA required
|
|
65
|
+
* Use for: Admin operations, settings changes
|
|
66
|
+
*/
|
|
67
|
+
readonly HIGH_SECURITY: TwoFactorRequirements;
|
|
68
|
+
/**
|
|
69
|
+
* Admin operations - strict requirements
|
|
70
|
+
* Use for: User management, system configuration
|
|
71
|
+
*/
|
|
72
|
+
readonly ADMIN: TwoFactorRequirements;
|
|
73
|
+
/**
|
|
74
|
+
* Financial operations - maximum security
|
|
75
|
+
* Use for: Payment processing, fund transfers
|
|
76
|
+
*/
|
|
77
|
+
readonly FINANCIAL: TwoFactorRequirements;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* AMR (Authentication Methods Reference) values
|
|
81
|
+
*/
|
|
82
|
+
export declare const AMRValues: {
|
|
83
|
+
/** Password authentication */
|
|
84
|
+
readonly PASSWORD: "pwd";
|
|
85
|
+
/** Multi-factor authentication completed */
|
|
86
|
+
readonly MFA: "mfa";
|
|
87
|
+
/** SMS verification */
|
|
88
|
+
readonly SMS: "sms";
|
|
89
|
+
/** Time-based one-time password (authenticator app) */
|
|
90
|
+
readonly TOTP: "totp";
|
|
91
|
+
/** One-time password (generic) */
|
|
92
|
+
readonly OTP: "otp";
|
|
93
|
+
/** Email verification */
|
|
94
|
+
readonly EMAIL: "email";
|
|
95
|
+
/** Hardware key */
|
|
96
|
+
readonly HARDWARE_KEY: "hwk";
|
|
97
|
+
/** Biometric */
|
|
98
|
+
readonly BIOMETRIC: "bio";
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* ACR (Authentication Context Class Reference) levels
|
|
102
|
+
*/
|
|
103
|
+
export declare const ACRLevels: {
|
|
104
|
+
/** No authentication */
|
|
105
|
+
readonly NONE: "0";
|
|
106
|
+
/** Single factor (password only) */
|
|
107
|
+
readonly SINGLE_FACTOR: "1";
|
|
108
|
+
/** Multi-factor authentication */
|
|
109
|
+
readonly MULTI_FACTOR: "2";
|
|
110
|
+
/** Hardware-backed MFA */
|
|
111
|
+
readonly HARDWARE_MFA: "3";
|
|
112
|
+
/** Maximum assurance (hardware + biometric) */
|
|
113
|
+
readonly MAXIMUM: "4";
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Validate AMR claims against requirements
|
|
117
|
+
*/
|
|
118
|
+
export declare function validateAMR(actualAMR: string[], requirements: TwoFactorRequirements): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Validate ACR level against requirements
|
|
121
|
+
*/
|
|
122
|
+
export declare function validateACR(actualACR: string, minACR?: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Check if 2FA requirements are met
|
|
125
|
+
*/
|
|
126
|
+
export declare function checkTwoFactorRequirements(requirements: TwoFactorRequirements, sessionStatus: {
|
|
127
|
+
twoFactorComplete?: boolean;
|
|
128
|
+
authenticationMethods?: string[];
|
|
129
|
+
authenticationLevel?: string;
|
|
130
|
+
}): {
|
|
131
|
+
satisfied: boolean;
|
|
132
|
+
reason?: string;
|
|
133
|
+
};
|
|
134
|
+
export default TwoFactorPresets;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Two-Factor Authentication Presets for MVP Middleware
|
|
4
|
+
*
|
|
5
|
+
* Provides granular control over 2FA requirements per route.
|
|
6
|
+
* Allows routes to require authentication but NOT require 2FA completion,
|
|
7
|
+
* which is essential for 2FA onboarding flows.
|
|
8
|
+
*
|
|
9
|
+
* Ported from website-membership's TwoFactorPresets pattern.
|
|
10
|
+
*
|
|
11
|
+
* @version 2.6.29
|
|
12
|
+
* @since auth-ready-v2
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ACRLevels = exports.AMRValues = exports.TwoFactorPresets = void 0;
|
|
16
|
+
exports.validateAMR = validateAMR;
|
|
17
|
+
exports.validateACR = validateACR;
|
|
18
|
+
exports.checkTwoFactorRequirements = checkTwoFactorRequirements;
|
|
19
|
+
/**
|
|
20
|
+
* Common 2FA requirement presets
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Configure routes with different 2FA requirements
|
|
25
|
+
* configureRoutes({
|
|
26
|
+
* '/api/account/send-code': { requiresAuth: true, twoFactorRequirements: TwoFactorPresets.NONE },
|
|
27
|
+
* '/api/admin/users': { requiresAuth: true, twoFactorRequirements: TwoFactorPresets.HIGH_SECURITY },
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
exports.TwoFactorPresets = {
|
|
32
|
+
/**
|
|
33
|
+
* No 2FA required - route is accessible with just authentication
|
|
34
|
+
* Use for: 2FA onboarding routes, profile viewing, non-sensitive operations
|
|
35
|
+
*/
|
|
36
|
+
NONE: {
|
|
37
|
+
requires2FA: false
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Basic 2FA - any authentication method acceptable
|
|
41
|
+
* Use for: Standard protected routes
|
|
42
|
+
*/
|
|
43
|
+
BASIC: {
|
|
44
|
+
requires2FA: true,
|
|
45
|
+
minACR: '1',
|
|
46
|
+
allowedAMR: ['pwd', 'mfa', 'sms', 'totp', 'otp']
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* Standard 2FA - password + additional factor
|
|
50
|
+
* Use for: Most application features
|
|
51
|
+
*/
|
|
52
|
+
STANDARD: {
|
|
53
|
+
requires2FA: true,
|
|
54
|
+
minACR: '2',
|
|
55
|
+
requiredAMR: ['pwd'],
|
|
56
|
+
allowedAMR: ['pwd', 'mfa', 'sms', 'totp', 'otp']
|
|
57
|
+
},
|
|
58
|
+
/**
|
|
59
|
+
* High security - password + MFA required
|
|
60
|
+
* Use for: Admin operations, settings changes
|
|
61
|
+
*/
|
|
62
|
+
HIGH_SECURITY: {
|
|
63
|
+
requires2FA: true,
|
|
64
|
+
minACR: '2',
|
|
65
|
+
requiredAMR: ['pwd', 'mfa']
|
|
66
|
+
},
|
|
67
|
+
/**
|
|
68
|
+
* Admin operations - strict requirements
|
|
69
|
+
* Use for: User management, system configuration
|
|
70
|
+
*/
|
|
71
|
+
ADMIN: {
|
|
72
|
+
requires2FA: true,
|
|
73
|
+
minACR: '3',
|
|
74
|
+
requiredAMR: ['pwd', 'mfa']
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Financial operations - maximum security
|
|
78
|
+
* Use for: Payment processing, fund transfers
|
|
79
|
+
*/
|
|
80
|
+
FINANCIAL: {
|
|
81
|
+
requires2FA: true,
|
|
82
|
+
minACR: '4',
|
|
83
|
+
requiredAMR: ['pwd', 'mfa', 'totp']
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* AMR (Authentication Methods Reference) values
|
|
88
|
+
*/
|
|
89
|
+
exports.AMRValues = {
|
|
90
|
+
/** Password authentication */
|
|
91
|
+
PASSWORD: 'pwd',
|
|
92
|
+
/** Multi-factor authentication completed */
|
|
93
|
+
MFA: 'mfa',
|
|
94
|
+
/** SMS verification */
|
|
95
|
+
SMS: 'sms',
|
|
96
|
+
/** Time-based one-time password (authenticator app) */
|
|
97
|
+
TOTP: 'totp',
|
|
98
|
+
/** One-time password (generic) */
|
|
99
|
+
OTP: 'otp',
|
|
100
|
+
/** Email verification */
|
|
101
|
+
EMAIL: 'email',
|
|
102
|
+
/** Hardware key */
|
|
103
|
+
HARDWARE_KEY: 'hwk',
|
|
104
|
+
/** Biometric */
|
|
105
|
+
BIOMETRIC: 'bio'
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* ACR (Authentication Context Class Reference) levels
|
|
109
|
+
*/
|
|
110
|
+
exports.ACRLevels = {
|
|
111
|
+
/** No authentication */
|
|
112
|
+
NONE: '0',
|
|
113
|
+
/** Single factor (password only) */
|
|
114
|
+
SINGLE_FACTOR: '1',
|
|
115
|
+
/** Multi-factor authentication */
|
|
116
|
+
MULTI_FACTOR: '2',
|
|
117
|
+
/** Hardware-backed MFA */
|
|
118
|
+
HARDWARE_MFA: '3',
|
|
119
|
+
/** Maximum assurance (hardware + biometric) */
|
|
120
|
+
MAXIMUM: '4'
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Validate AMR claims against requirements
|
|
124
|
+
*/
|
|
125
|
+
function validateAMR(actualAMR, requirements) {
|
|
126
|
+
// If no AMR requirements, valid
|
|
127
|
+
if (!requirements.requiredAMR?.length && !requirements.allowedAMR?.length) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
// If required methods specified, all must be present
|
|
131
|
+
if (requirements.requiredAMR && requirements.requiredAMR.length > 0) {
|
|
132
|
+
return requirements.requiredAMR.every(method => actualAMR.includes(method));
|
|
133
|
+
}
|
|
134
|
+
// If allowed methods specified, at least one must be present
|
|
135
|
+
if (requirements.allowedAMR && requirements.allowedAMR.length > 0) {
|
|
136
|
+
return actualAMR.some(method => requirements.allowedAMR.includes(method));
|
|
137
|
+
}
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate ACR level against requirements
|
|
142
|
+
*/
|
|
143
|
+
function validateACR(actualACR, minACR) {
|
|
144
|
+
if (!minACR) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
const actualLevel = parseInt(actualACR, 10) || 0;
|
|
148
|
+
const minLevel = parseInt(minACR, 10) || 1;
|
|
149
|
+
return actualLevel >= minLevel;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if 2FA requirements are met
|
|
153
|
+
*/
|
|
154
|
+
function checkTwoFactorRequirements(requirements, sessionStatus) {
|
|
155
|
+
// If 2FA not required, always satisfied
|
|
156
|
+
if (!requirements.requires2FA) {
|
|
157
|
+
return { satisfied: true };
|
|
158
|
+
}
|
|
159
|
+
// Check if 2FA is complete
|
|
160
|
+
if (!sessionStatus.twoFactorComplete) {
|
|
161
|
+
return { satisfied: false, reason: '2FA not completed' };
|
|
162
|
+
}
|
|
163
|
+
// Check AMR if specified
|
|
164
|
+
const amr = sessionStatus.authenticationMethods || [];
|
|
165
|
+
if (!validateAMR(amr, requirements)) {
|
|
166
|
+
return { satisfied: false, reason: 'AMR requirements not met' };
|
|
167
|
+
}
|
|
168
|
+
// Check ACR if specified
|
|
169
|
+
const acr = sessionStatus.authenticationLevel || '0';
|
|
170
|
+
if (!validateACR(acr, requirements.minACR)) {
|
|
171
|
+
return { satisfied: false, reason: 'ACR level insufficient' };
|
|
172
|
+
}
|
|
173
|
+
return { satisfied: true };
|
|
174
|
+
}
|
|
175
|
+
exports.default = exports.TwoFactorPresets;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface DecodedAccessToken {
|
|
2
|
+
iss: string;
|
|
3
|
+
aud: string;
|
|
4
|
+
sub: string;
|
|
5
|
+
jti: string;
|
|
6
|
+
iat: number;
|
|
7
|
+
nbf: number;
|
|
8
|
+
exp: number;
|
|
9
|
+
user_id: string;
|
|
10
|
+
client_id: string;
|
|
11
|
+
token_type: string;
|
|
12
|
+
scope: string;
|
|
13
|
+
roles: string[];
|
|
14
|
+
amr: string[];
|
|
15
|
+
acr: string;
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Model - Redis Session Data Structure
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for session data stored in Redis.
|
|
5
|
+
* The session contains all authentication state - the JWT cookie only
|
|
6
|
+
* stores the session ID (redisSessionId).
|
|
7
|
+
*
|
|
8
|
+
* FIELD NAMING CONVENTIONS:
|
|
9
|
+
* - idp* prefix: Tokens from PayEz IDP (identity provider)
|
|
10
|
+
* - oauth* prefix: Tokens from external OAuth providers (Google, etc.)
|
|
11
|
+
* - mfa* prefix: Multi-factor authentication related fields
|
|
12
|
+
*
|
|
13
|
+
* @version 2.0.0 - Normalized field names
|
|
14
|
+
* @since auth-refactor-2026-01
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Session data stored in Redis.
|
|
18
|
+
*
|
|
19
|
+
* This interface uses normalized field names for clarity.
|
|
20
|
+
* All tokens and user data live here - the browser only gets the session ID.
|
|
21
|
+
*/
|
|
22
|
+
export interface SessionData {
|
|
23
|
+
/** User ID from IDP (sub claim) */
|
|
24
|
+
userId: string;
|
|
25
|
+
/** User's email address */
|
|
26
|
+
email: string;
|
|
27
|
+
/** Display name (from OAuth profile or IDP) */
|
|
28
|
+
name?: string;
|
|
29
|
+
/** User's roles/permissions */
|
|
30
|
+
roles: string[];
|
|
31
|
+
/** IDP access token (JWT) - used for API calls to PayEz services */
|
|
32
|
+
idpAccessToken?: string;
|
|
33
|
+
/** IDP refresh token - used to get new access tokens */
|
|
34
|
+
idpRefreshToken?: string;
|
|
35
|
+
/** When the IDP access token expires (Unix timestamp ms) */
|
|
36
|
+
idpAccessTokenExpires: number;
|
|
37
|
+
/** When the IDP refresh token expires (Unix timestamp ms) */
|
|
38
|
+
idpRefreshTokenExpires?: number;
|
|
39
|
+
/** Decoded IDP access token claims (for quick access without re-decoding) */
|
|
40
|
+
decodedAccessToken?: any;
|
|
41
|
+
/**
|
|
42
|
+
* Bearer Key ID (kid from JWT header).
|
|
43
|
+
* Identifies which IDP signing key was used for this token.
|
|
44
|
+
* CRITICAL: This is from the JWT HEADER, not client_id from payload.
|
|
45
|
+
*/
|
|
46
|
+
bearerKeyId?: string;
|
|
47
|
+
/** Whether MFA has been verified for this session */
|
|
48
|
+
mfaVerified: boolean;
|
|
49
|
+
/** The MFA method used (email, sms, totp) */
|
|
50
|
+
mfaMethod?: 'email' | 'sms' | 'totp';
|
|
51
|
+
/** When MFA was completed (Unix timestamp ms) */
|
|
52
|
+
mfaCompletedAt?: number;
|
|
53
|
+
/** When MFA verification expires (Unix timestamp ms) */
|
|
54
|
+
mfaExpiresAt?: number;
|
|
55
|
+
/** How long MFA is valid in hours */
|
|
56
|
+
mfaValidityHours?: number;
|
|
57
|
+
/** Authentication methods from token (amr claim) */
|
|
58
|
+
authenticationMethods?: string[];
|
|
59
|
+
/** Authentication level from token (acr claim) */
|
|
60
|
+
authenticationLevel?: string;
|
|
61
|
+
/** Which OAuth provider was used (google, apple, microsoft, etc.) */
|
|
62
|
+
oauthProvider?: string;
|
|
63
|
+
/** Access token from OAuth provider */
|
|
64
|
+
oauthProviderToken?: string;
|
|
65
|
+
/** Refresh token from OAuth provider */
|
|
66
|
+
oauthProviderRefreshToken?: string;
|
|
67
|
+
/** IDP client ID this user belongs to */
|
|
68
|
+
idpClientId?: string;
|
|
69
|
+
/** Merchant ID (typically same as client ID) */
|
|
70
|
+
merchantId?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Allow any additional fields for backward compatibility.
|
|
73
|
+
* During migration, old sessions may have legacy field names.
|
|
74
|
+
*/
|
|
75
|
+
[key: string]: any;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Session model class for working with session data.
|
|
79
|
+
*
|
|
80
|
+
* Provides typed access to session fields with normalized names.
|
|
81
|
+
*/
|
|
82
|
+
export declare class SessionModel {
|
|
83
|
+
userId: string;
|
|
84
|
+
email: string;
|
|
85
|
+
name?: string;
|
|
86
|
+
roles: string[];
|
|
87
|
+
idpAccessToken?: string;
|
|
88
|
+
idpRefreshToken?: string;
|
|
89
|
+
idpAccessTokenExpires: number;
|
|
90
|
+
idpRefreshTokenExpires?: number;
|
|
91
|
+
decodedAccessToken?: any;
|
|
92
|
+
bearerKeyId?: string;
|
|
93
|
+
mfaVerified: boolean;
|
|
94
|
+
mfaMethod?: 'email' | 'sms' | 'totp';
|
|
95
|
+
mfaCompletedAt?: number;
|
|
96
|
+
mfaExpiresAt?: number;
|
|
97
|
+
mfaValidityHours?: number;
|
|
98
|
+
authenticationMethods?: string[];
|
|
99
|
+
authenticationLevel?: string;
|
|
100
|
+
oauthProvider?: string;
|
|
101
|
+
oauthProviderToken?: string;
|
|
102
|
+
oauthProviderRefreshToken?: string;
|
|
103
|
+
idpClientId?: string;
|
|
104
|
+
merchantId?: string;
|
|
105
|
+
constructor(data: SessionData);
|
|
106
|
+
/**
|
|
107
|
+
* Check if the IDP access token has expired.
|
|
108
|
+
*/
|
|
109
|
+
isAccessTokenExpired(): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Check if the IDP refresh token has expired.
|
|
112
|
+
*/
|
|
113
|
+
isRefreshTokenExpired(): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Check if MFA has expired.
|
|
116
|
+
*/
|
|
117
|
+
isMfaExpired(): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Convert to plain object for storage.
|
|
120
|
+
*/
|
|
121
|
+
toJSON(): SessionData;
|
|
122
|
+
}
|