@payez/next-mvp 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -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 +112 -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 +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -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 +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -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 +94 -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 +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -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 +383 -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 +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -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 +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -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 +69 -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 +79 -0
- package/dist/config/vibe-log-transport.js +203 -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 +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -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 +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -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 +351 -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/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -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 +166 -0
- package/dist/lib/session-store.js +537 -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 +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -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 +52 -0
- package/dist/lib/token-lifecycle.js +398 -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 +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -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 +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -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 +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -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/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -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/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -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 +140 -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 +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -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 +408 -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 +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -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 +72 -0
- package/dist/routes/auth/session.js +180 -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 +201 -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/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 +1531 -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/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 +23 -0
- package/dist/vibe/index.js +67 -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 +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Masked Info Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured handler for fetching masked contact information
|
|
5
|
+
* during 2FA flow. Can be imported directly into your app's API routes with
|
|
6
|
+
* zero configuration.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // app/api/account/masked-info/route.ts
|
|
11
|
+
* export { POST } from '@payez/next-mvp/routes/account/masked-info';
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @version 2.3.0
|
|
15
|
+
* @since auth-ready-v2
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// Re-export the POST handler from api-handlers
|
|
19
|
+
// Note: IDP uses POST for masked-info endpoint
|
|
20
|
+
export { POST } from '../../api-handlers/account/masked-info';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Pre-configured POST handler for masked contact information
|
|
24
|
+
*
|
|
25
|
+
* This endpoint is typically called during the 2FA flow to display masked
|
|
26
|
+
* email/phone options to the user.
|
|
27
|
+
*
|
|
28
|
+
* Environment variables used:
|
|
29
|
+
* - IDP_URL or NEXT_PUBLIC_IDP_URL (default: http://localhost:32785)
|
|
30
|
+
* - CLIENT_ID or NEXT_PUBLIC_IDP_CLIENT_ID (required)
|
|
31
|
+
* - NEXTAUTH_SECRET (required)
|
|
32
|
+
*
|
|
33
|
+
* Returns:
|
|
34
|
+
* - Masked email addresses
|
|
35
|
+
* - Masked phone numbers
|
|
36
|
+
* - Contact method preferences
|
|
37
|
+
*/
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Send Code Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured handler for sending 2FA verification codes
|
|
5
|
+
* to the user's registered contact methods. Can be imported directly
|
|
6
|
+
* into your app's API routes with zero configuration.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // app/api/account/send-code/route.ts
|
|
11
|
+
* export { POST } from '@payez/next-mvp/routes/account/send-code';
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @version 2.3.0
|
|
15
|
+
* @since auth-ready-v2
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// Re-export the POST handler from api-handlers
|
|
19
|
+
export { POST } from '../../api-handlers/account/send-code';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Pre-configured POST handler for sending verification codes
|
|
23
|
+
*
|
|
24
|
+
* This endpoint triggers the IDP to send a verification code to the
|
|
25
|
+
* user's selected contact method (email or SMS).
|
|
26
|
+
*
|
|
27
|
+
* Request body:
|
|
28
|
+
* - method: 'email' | 'sms' - The contact method to use
|
|
29
|
+
* - contactId: string - ID of the masked contact to send to
|
|
30
|
+
*
|
|
31
|
+
* Environment variables used:
|
|
32
|
+
* - IDP_URL or NEXT_PUBLIC_IDP_URL (default: http://localhost:32785)
|
|
33
|
+
* - CLIENT_ID or NEXT_PUBLIC_IDP_CLIENT_ID (required)
|
|
34
|
+
* - NEXTAUTH_SECRET (required)
|
|
35
|
+
*
|
|
36
|
+
* Returns:
|
|
37
|
+
* - Success status
|
|
38
|
+
* - Rate limit information
|
|
39
|
+
* - Cooldown timer if applicable
|
|
40
|
+
*/
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Phone Route
|
|
3
|
+
*
|
|
4
|
+
* Ready-to-use route handler for updating phone number.
|
|
5
|
+
* Used for 2FA setup - users need to add a phone to enable SMS verification.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // app/api/account/update-phone/route.ts
|
|
10
|
+
* export { POST } from '@payez/next-mvp/routes/account/update-phone';
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export { POST } from '../../api-handlers/account/update-phone';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Verify Email Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured handler for verifying email-based 2FA codes.
|
|
5
|
+
* Can be imported directly into your app's API routes with zero configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // app/api/account/verify-email/route.ts
|
|
10
|
+
* export { POST } from '@payez/next-mvp/routes/account/verify-email';
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @version 2.3.0
|
|
14
|
+
* @since auth-ready-v2
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// Re-export the POST handler from api-handlers
|
|
18
|
+
export { POST } from '../../api-handlers/account/verify-email';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Pre-configured POST handler for verifying email 2FA codes
|
|
22
|
+
*
|
|
23
|
+
* This endpoint verifies the code sent to the user's email address
|
|
24
|
+
* and upgrades the provisional session to a full session.
|
|
25
|
+
*
|
|
26
|
+
* Request body:
|
|
27
|
+
* - code: string - The 6-digit verification code
|
|
28
|
+
* - emailId: string - ID of the email address used
|
|
29
|
+
*
|
|
30
|
+
* Environment variables used:
|
|
31
|
+
* - IDP_URL or NEXT_PUBLIC_IDP_URL (default: http://localhost:32785)
|
|
32
|
+
* - CLIENT_ID or NEXT_PUBLIC_IDP_CLIENT_ID (required)
|
|
33
|
+
* - NEXTAUTH_SECRET (required)
|
|
34
|
+
*
|
|
35
|
+
* Returns:
|
|
36
|
+
* - Upgraded access token with MFA claim
|
|
37
|
+
* - New refresh token
|
|
38
|
+
* - Session upgrade status
|
|
39
|
+
* - AMR (Authentication Methods Reference) array
|
|
40
|
+
* - ACR (Authentication Context Class) level
|
|
41
|
+
*/
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Verify SMS Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured handler for verifying SMS-based 2FA codes.
|
|
5
|
+
* Can be imported directly into your app's API routes with zero configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // app/api/account/verify-sms/route.ts
|
|
10
|
+
* export { POST } from '@payez/next-mvp/routes/account/verify-sms';
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @version 2.3.0
|
|
14
|
+
* @since auth-ready-v2
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// Re-export the POST handler from api-handlers
|
|
18
|
+
export { POST } from '../../api-handlers/account/verify-sms';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Pre-configured POST handler for verifying SMS 2FA codes
|
|
22
|
+
*
|
|
23
|
+
* This endpoint verifies the code sent to the user's phone number
|
|
24
|
+
* and upgrades the provisional session to a full session.
|
|
25
|
+
*
|
|
26
|
+
* Request body:
|
|
27
|
+
* - code: string - The 6-digit verification code
|
|
28
|
+
* - phoneId: string - ID of the phone number used
|
|
29
|
+
*
|
|
30
|
+
* Environment variables used:
|
|
31
|
+
* - IDP_URL or NEXT_PUBLIC_IDP_URL (default: http://localhost:32785)
|
|
32
|
+
* - CLIENT_ID or NEXT_PUBLIC_IDP_CLIENT_ID (required)
|
|
33
|
+
* - NEXTAUTH_SECRET (required)
|
|
34
|
+
*
|
|
35
|
+
* Returns:
|
|
36
|
+
* - Upgraded access token with MFA claim
|
|
37
|
+
* - New refresh token
|
|
38
|
+
* - Session upgrade status
|
|
39
|
+
* - AMR (Authentication Methods Reference) array
|
|
40
|
+
* - ACR (Authentication Context Class) level
|
|
41
|
+
*/
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @payez/next-mvp Ready-to-Use Route Exports
|
|
3
|
+
*
|
|
4
|
+
* Pre-configured route handlers that can be imported directly
|
|
5
|
+
* into your Next.js app with zero configuration.
|
|
6
|
+
*
|
|
7
|
+
* @version 2.0.0
|
|
8
|
+
* @since auth-ready-v2
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// Export individual route handlers
|
|
12
|
+
export { POST as refreshPOST } from './refresh';
|
|
13
|
+
export { GET as sessionGET, POST as sessionPOST } from './session';
|
|
14
|
+
export { POST as logoutPOST } from './logout';
|
|
15
|
+
export { GET as viabilityGET } from './viability';
|
|
16
|
+
export { GET as nextAuthGET, POST as nextAuthPOST } from './nextauth';
|
|
17
|
+
|
|
18
|
+
// Also export as namespaced objects for cleaner imports
|
|
19
|
+
export * as refresh from './refresh';
|
|
20
|
+
export * as session from './session';
|
|
21
|
+
export * as logout from './logout';
|
|
22
|
+
export * as viability from './viability';
|
|
23
|
+
export * as nextauth from './nextauth';
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Logout Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured logout handler that properly cleans up
|
|
5
|
+
* sessions and revokes tokens.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // app/api/auth/logout/route.ts
|
|
10
|
+
* export { POST } from '@payez/next-mvp/routes/auth/logout';
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @version 2.0.0
|
|
14
|
+
* @since auth-ready-v2
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
18
|
+
import { getToken } from 'next-auth/jwt';
|
|
19
|
+
import { deleteSession } from '../../lib/session-store';
|
|
20
|
+
import {
|
|
21
|
+
getSessionCookieName,
|
|
22
|
+
getSecureSessionCookieName,
|
|
23
|
+
getCsrfCookieName,
|
|
24
|
+
getSecureCsrfCookieName,
|
|
25
|
+
getCallbackUrlCookieName,
|
|
26
|
+
getJwtCookieName
|
|
27
|
+
} from '../../lib/app-slug';
|
|
28
|
+
import { getIDPClientConfig } from '../../lib/idp-client-config';
|
|
29
|
+
import { siteEvents, getClientIp } from '../../lib/site-logger';
|
|
30
|
+
|
|
31
|
+
async function getConfig() {
|
|
32
|
+
const idpConfig = await getIDPClientConfig();
|
|
33
|
+
const idpBaseUrl = process.env.IDP_URL;
|
|
34
|
+
if (!idpBaseUrl) {
|
|
35
|
+
throw new Error('[IDP_URL] FATAL: IDP_URL environment variable is REQUIRED.');
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
nextAuthSecret: idpConfig.nextAuthSecret || '',
|
|
39
|
+
idpBaseUrl,
|
|
40
|
+
clientId: process.env.CLIENT_ID || process.env.NEXT_PUBLIC_IDP_CLIENT_ID || '',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* POST /api/auth/logout - Sign out and clean up session
|
|
46
|
+
*
|
|
47
|
+
* Performs complete logout:
|
|
48
|
+
* 1. Revokes tokens at IDP (if refresh token available)
|
|
49
|
+
* 2. Deletes session from store
|
|
50
|
+
* 3. Clears NextAuth session cookie
|
|
51
|
+
*/
|
|
52
|
+
export async function POST(req: NextRequest) {
|
|
53
|
+
const { nextAuthSecret, idpBaseUrl, clientId } = await getConfig();
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const token = await getToken({ req, secret: nextAuthSecret, cookieName: getJwtCookieName() });
|
|
57
|
+
|
|
58
|
+
if (!token) {
|
|
59
|
+
// Already logged out
|
|
60
|
+
return NextResponse.json({
|
|
61
|
+
success: true,
|
|
62
|
+
message: 'No active session'
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
|
|
67
|
+
const sessionId = (token as any).sessionToken || (token as any).redisSessionId;
|
|
68
|
+
|
|
69
|
+
// Delete session from store (this also removes the refresh token)
|
|
70
|
+
if (sessionId) {
|
|
71
|
+
try {
|
|
72
|
+
await deleteSession(sessionId);
|
|
73
|
+
console.info('[LOGOUT_ROUTE] Session deleted from store');
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.warn('[LOGOUT_ROUTE] Failed to delete session:', error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Log logout event (fire-and-forget)
|
|
80
|
+
const userId = (token as any).sub || (token as any).idpUserId;
|
|
81
|
+
if (userId) {
|
|
82
|
+
siteEvents.logout({
|
|
83
|
+
user_id: userId,
|
|
84
|
+
session_id: sessionId,
|
|
85
|
+
trigger: 'user',
|
|
86
|
+
url: '/api/auth/logout',
|
|
87
|
+
user_agent: req.headers.get('user-agent') || undefined,
|
|
88
|
+
ip_address: getClientIp(req.headers) || undefined,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Build response that clears NextAuth cookies
|
|
93
|
+
const response = NextResponse.json({
|
|
94
|
+
success: true,
|
|
95
|
+
message: 'Logged out successfully'
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Clear NextAuth session cookies (using app-slug prefixed names)
|
|
99
|
+
const cookieNames = [
|
|
100
|
+
getSessionCookieName(),
|
|
101
|
+
getSecureSessionCookieName(),
|
|
102
|
+
getCsrfCookieName(),
|
|
103
|
+
getSecureCsrfCookieName(),
|
|
104
|
+
getCallbackUrlCookieName(),
|
|
105
|
+
`__Secure-${getCallbackUrlCookieName()}`,
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
// Clear each cookie by setting it with maxAge 0
|
|
109
|
+
cookieNames.forEach(name => {
|
|
110
|
+
response.cookies.set(name, '', {
|
|
111
|
+
maxAge: 0,
|
|
112
|
+
path: '/',
|
|
113
|
+
httpOnly: true,
|
|
114
|
+
secure: process.env.NODE_ENV === 'production',
|
|
115
|
+
sameSite: 'lax'
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return response;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error('[LOGOUT_ROUTE] Error during logout:', error);
|
|
122
|
+
return NextResponse.json({
|
|
123
|
+
error: 'Failed to logout',
|
|
124
|
+
details: error instanceof Error ? error.message : 'Unknown error'
|
|
125
|
+
}, { status: 500 });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use NextAuth Route Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured NextAuth handler that uses dynamic OAuth providers
|
|
5
|
+
* loaded from IDP at startup via getAuthOptions().
|
|
6
|
+
*
|
|
7
|
+
* @version 2.2.0 - Dynamic provider loading from IDP
|
|
8
|
+
* @since auth-ready-v2-hotfix
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import NextAuth from 'next-auth';
|
|
12
|
+
import { authOptions, getAuthOptions } from '../../auth/auth-options';
|
|
13
|
+
|
|
14
|
+
// Cached handler - built once with dynamic providers
|
|
15
|
+
let cachedHandler: ReturnType<typeof NextAuth> | null = null;
|
|
16
|
+
let handlerPromise: Promise<ReturnType<typeof NextAuth>> | null = null;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get or build the NextAuth handler with dynamic providers.
|
|
20
|
+
* Uses caching to avoid rebuilding on every request.
|
|
21
|
+
*/
|
|
22
|
+
async function getHandler(): Promise<ReturnType<typeof NextAuth>> {
|
|
23
|
+
// Return cached if available
|
|
24
|
+
if (cachedHandler) {
|
|
25
|
+
return cachedHandler;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Prevent concurrent builds
|
|
29
|
+
if (handlerPromise) {
|
|
30
|
+
return handlerPromise;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
handlerPromise = (async () => {
|
|
34
|
+
try {
|
|
35
|
+
// Try to get dynamic auth options from IDP
|
|
36
|
+
const options = await getAuthOptions();
|
|
37
|
+
console.log('[NEXTAUTH_ROUTE] Built handler with dynamic providers');
|
|
38
|
+
cachedHandler = NextAuth(options);
|
|
39
|
+
return cachedHandler;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
// Fallback to static options if IDP unavailable
|
|
42
|
+
console.warn('[NEXTAUTH_ROUTE] Failed to get dynamic options, using static fallback:', {
|
|
43
|
+
error: error instanceof Error ? error.message : String(error)
|
|
44
|
+
});
|
|
45
|
+
cachedHandler = NextAuth(authOptions);
|
|
46
|
+
return cachedHandler;
|
|
47
|
+
} finally {
|
|
48
|
+
handlerPromise = null;
|
|
49
|
+
}
|
|
50
|
+
})();
|
|
51
|
+
|
|
52
|
+
return handlerPromise;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* GET handler for NextAuth
|
|
57
|
+
* Uses async factory to get dynamic providers from IDP
|
|
58
|
+
*/
|
|
59
|
+
export async function GET(request: Request, context: any) {
|
|
60
|
+
const handler = await getHandler();
|
|
61
|
+
return handler(request, context);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* POST handler for NextAuth
|
|
66
|
+
* Uses async factory to get dynamic providers from IDP
|
|
67
|
+
*/
|
|
68
|
+
export async function POST(request: Request, context: any) {
|
|
69
|
+
const handler = await getHandler();
|
|
70
|
+
return handler(request, context);
|
|
71
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Refresh Token Route
|
|
3
|
+
*
|
|
4
|
+
* Provides a pre-configured refresh handler that can be imported directly
|
|
5
|
+
* into your app's API routes with zero configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // app/api/auth/refresh/route.ts
|
|
10
|
+
* export { POST } from '@payez/next-mvp/routes/auth/refresh';
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @version 2.0.0
|
|
14
|
+
* @since auth-ready-v2
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createRefreshHandler } from '../../api-handlers/auth/refresh';
|
|
18
|
+
import { getIDPClientConfig } from '../../lib/idp-client-config';
|
|
19
|
+
|
|
20
|
+
// Configuration is read at runtime from IDP config (cached)
|
|
21
|
+
async function getConfig() {
|
|
22
|
+
const idpConfig = await getIDPClientConfig();
|
|
23
|
+
const idpBaseUrl = process.env.IDP_URL;
|
|
24
|
+
if (!idpBaseUrl) {
|
|
25
|
+
throw new Error('[IDP_URL] FATAL: IDP_URL environment variable is REQUIRED.');
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
idpBaseUrl,
|
|
29
|
+
clientId: process.env.CLIENT_ID || process.env.NEXT_PUBLIC_IDP_CLIENT_ID || '',
|
|
30
|
+
nextAuthSecret: idpConfig.nextAuthSecret || '',
|
|
31
|
+
refreshEndpoint: process.env.REFRESH_ENDPOINT || '/api/ExternalAuth/refresh',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Pre-configured POST handler for token refresh
|
|
37
|
+
*
|
|
38
|
+
* Environment variables used:
|
|
39
|
+
* - IDP_URL (REQUIRED)
|
|
40
|
+
* - CLIENT_ID or NEXT_PUBLIC_IDP_CLIENT_ID (required)
|
|
41
|
+
* - NEXTAUTH_SECRET (required)
|
|
42
|
+
* - REFRESH_ENDPOINT (default: /api/ExternalAuth/refresh)
|
|
43
|
+
*/
|
|
44
|
+
let _handler: ReturnType<typeof createRefreshHandler> | null = null;
|
|
45
|
+
|
|
46
|
+
import { NextRequest } from 'next/server';
|
|
47
|
+
|
|
48
|
+
export async function POST(req: NextRequest) {
|
|
49
|
+
if (!_handler) {
|
|
50
|
+
const config = await getConfig();
|
|
51
|
+
_handler = createRefreshHandler(config);
|
|
52
|
+
}
|
|
53
|
+
return _handler(req);
|
|
54
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ready-to-Use Session Management Route
|
|
3
|
+
*
|
|
4
|
+
* Provides pre-configured session handlers for checking and updating session state.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/auth/session/route.ts
|
|
9
|
+
* export { GET, POST } from '@payez/next-mvp/routes/auth/session';
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* @version 2.0.0
|
|
13
|
+
* @since auth-ready-v2
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
17
|
+
import { getToken } from 'next-auth/jwt';
|
|
18
|
+
import { getSession, updateSession } from '../../lib/session-store';
|
|
19
|
+
import { getJwtCookieName } from '../../lib/app-slug';
|
|
20
|
+
import { getIDPClientConfig } from '../../lib/idp-client-config';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get NextAuth secret from IDP config (cached).
|
|
24
|
+
* NEVER use process.env.NEXTAUTH_SECRET - it's always loaded from IDP.
|
|
25
|
+
*/
|
|
26
|
+
async function getNextAuthSecret(): Promise<string> {
|
|
27
|
+
const config = await getIDPClientConfig();
|
|
28
|
+
return config.nextAuthSecret || '';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* GET /api/auth/session - Check current session status
|
|
33
|
+
*
|
|
34
|
+
* Returns the current session information including:
|
|
35
|
+
* - User details
|
|
36
|
+
* - Token expiry status
|
|
37
|
+
* - Session validity
|
|
38
|
+
*/
|
|
39
|
+
export async function GET(req: NextRequest) {
|
|
40
|
+
try {
|
|
41
|
+
const secret = await getNextAuthSecret();
|
|
42
|
+
const cookieName = getJwtCookieName();
|
|
43
|
+
|
|
44
|
+
// Debug logging
|
|
45
|
+
const cookieValue = req.cookies.get(cookieName)?.value;
|
|
46
|
+
console.log('[SESSION_ROUTE] GET called:', {
|
|
47
|
+
cookieName,
|
|
48
|
+
hasCookie: !!cookieValue,
|
|
49
|
+
cookieLength: cookieValue?.length || 0,
|
|
50
|
+
secretLength: secret?.length || 0,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const token = await getToken({ req, secret, cookieName });
|
|
54
|
+
|
|
55
|
+
if (!token) {
|
|
56
|
+
console.warn('[SESSION_ROUTE] getToken returned null');
|
|
57
|
+
return NextResponse.json({
|
|
58
|
+
authenticated: false,
|
|
59
|
+
message: 'No session found'
|
|
60
|
+
}, { status: 200 });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
|
|
64
|
+
const redisSessionId = (token as any).sessionToken || (token as any).redisSessionId;
|
|
65
|
+
|
|
66
|
+
console.log('[SESSION_ROUTE] Token found:', {
|
|
67
|
+
sub: token.sub,
|
|
68
|
+
email: token.email,
|
|
69
|
+
name: token.name,
|
|
70
|
+
hasExp: !!token.exp,
|
|
71
|
+
redisSessionId: redisSessionId ? redisSessionId.substring(0, 8) + '...' : 'MISSING',
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Fetch full session data from Redis
|
|
75
|
+
const session = redisSessionId ? await getSession(redisSessionId) : null;
|
|
76
|
+
|
|
77
|
+
console.log('[SESSION_ROUTE] Redis session:', {
|
|
78
|
+
found: !!session,
|
|
79
|
+
userId: session?.userId,
|
|
80
|
+
roles: session?.roles,
|
|
81
|
+
hasAccessToken: !!session?.idpAccessToken,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Return NextAuth-compatible session format with Redis data
|
|
85
|
+
// useSession() expects: { user: {...}, expires: "..." }
|
|
86
|
+
// We enrich with all session data from Redis
|
|
87
|
+
return NextResponse.json({
|
|
88
|
+
user: {
|
|
89
|
+
id: session?.userId || token.sub,
|
|
90
|
+
email: session?.email || token.email,
|
|
91
|
+
name: session?.name || token.name,
|
|
92
|
+
image: (token as any).picture || null,
|
|
93
|
+
// Redis session data
|
|
94
|
+
roles: session?.roles || [],
|
|
95
|
+
twoFactorSessionVerified: session?.mfaVerified || false,
|
|
96
|
+
requiresTwoFactor: !session?.mfaVerified,
|
|
97
|
+
authenticationMethods: session?.authenticationMethods,
|
|
98
|
+
authenticationLevel: session?.authenticationLevel,
|
|
99
|
+
mfaCompletedAt: session?.mfaCompletedAt,
|
|
100
|
+
mfaExpiresAt: session?.mfaExpiresAt,
|
|
101
|
+
mfaValidityHours: session?.mfaValidityHours,
|
|
102
|
+
oauthProvider: session?.oauthProvider,
|
|
103
|
+
idpClientId: session?.idpClientId,
|
|
104
|
+
merchantId: session?.merchantId,
|
|
105
|
+
},
|
|
106
|
+
// Session tokens
|
|
107
|
+
sessionToken: redisSessionId,
|
|
108
|
+
accessToken: session?.idpAccessToken,
|
|
109
|
+
refreshToken: session?.idpRefreshToken,
|
|
110
|
+
accessTokenExpires: session?.idpAccessTokenExpires,
|
|
111
|
+
expires: token.exp ? new Date((token.exp as number) * 1000).toISOString() : new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
|
|
112
|
+
});
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error('[SESSION_ROUTE] Error checking session:', error);
|
|
115
|
+
return NextResponse.json({
|
|
116
|
+
error: 'Failed to check session',
|
|
117
|
+
details: error instanceof Error ? error.message : 'Unknown error'
|
|
118
|
+
}, { status: 500 });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* POST /api/auth/session - Update session data
|
|
124
|
+
*
|
|
125
|
+
* Allows updating session metadata (not tokens).
|
|
126
|
+
* Token refresh should use the /api/auth/refresh endpoint.
|
|
127
|
+
*
|
|
128
|
+
* Body:
|
|
129
|
+
* - metadata: object - Custom metadata to store in session
|
|
130
|
+
*/
|
|
131
|
+
export async function POST(req: NextRequest) {
|
|
132
|
+
try {
|
|
133
|
+
const secret = await getNextAuthSecret();
|
|
134
|
+
const token = await getToken({ req, secret, cookieName: getJwtCookieName() });
|
|
135
|
+
|
|
136
|
+
if (!token) {
|
|
137
|
+
return NextResponse.json({
|
|
138
|
+
error: 'No session found',
|
|
139
|
+
code: 'UNAUTHORIZED'
|
|
140
|
+
}, { status: 401 });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
|
|
144
|
+
const sessionToken = (token as any).sessionToken || (token as any).redisSessionId;
|
|
145
|
+
if (!sessionToken) {
|
|
146
|
+
return NextResponse.json({
|
|
147
|
+
error: 'Invalid session',
|
|
148
|
+
code: 'INVALID_SESSION'
|
|
149
|
+
}, { status: 400 });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const body = await req.json();
|
|
153
|
+
const { metadata, access_token, refresh_token, twoFactorComplete, twoFactorMethod } = body;
|
|
154
|
+
|
|
155
|
+
// Get current session
|
|
156
|
+
const session = await getSession(sessionToken);
|
|
157
|
+
if (!session) {
|
|
158
|
+
return NextResponse.json({
|
|
159
|
+
error: 'Session not found',
|
|
160
|
+
code: 'SESSION_NOT_FOUND'
|
|
161
|
+
}, { status: 404 });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Update session with new data
|
|
165
|
+
const updatedSession = {
|
|
166
|
+
...session,
|
|
167
|
+
...(access_token ? { accessToken: access_token } : {}),
|
|
168
|
+
...(refresh_token ? { refreshToken: refresh_token } : {}),
|
|
169
|
+
...(typeof twoFactorComplete === 'boolean' ? { twoFactorComplete } : {}),
|
|
170
|
+
...(twoFactorMethod ? { twoFactorMethod } : {}),
|
|
171
|
+
...(metadata ? {
|
|
172
|
+
metadata: {
|
|
173
|
+
...(session.metadata || {}),
|
|
174
|
+
...metadata,
|
|
175
|
+
updatedAt: new Date().toISOString()
|
|
176
|
+
}
|
|
177
|
+
} : {})
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
await updateSession(sessionToken, updatedSession);
|
|
181
|
+
|
|
182
|
+
return NextResponse.json({
|
|
183
|
+
success: true,
|
|
184
|
+
message: 'Session updated successfully'
|
|
185
|
+
});
|
|
186
|
+
} catch (error) {
|
|
187
|
+
console.error('[SESSION_ROUTE] Error updating session:', error);
|
|
188
|
+
return NextResponse.json({
|
|
189
|
+
error: 'Failed to update session',
|
|
190
|
+
details: error instanceof Error ? error.message : 'Unknown error'
|
|
191
|
+
}, { status: 500 });
|
|
192
|
+
}
|
|
193
|
+
}
|