@payez/next-mvp 3.9.1 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/package.json +6 -18
  2. package/src/api/auth-handler.ts +550 -549
  3. package/src/api-handlers/account/change-password.ts +5 -8
  4. package/src/api-handlers/admin/analytics.ts +4 -6
  5. package/src/api-handlers/admin/audit.ts +5 -7
  6. package/src/api-handlers/admin/index.ts +1 -2
  7. package/src/api-handlers/admin/redis-sessions.ts +6 -8
  8. package/src/api-handlers/admin/sessions.ts +5 -7
  9. package/src/api-handlers/admin/site-logs.ts +8 -10
  10. package/src/api-handlers/admin/stats.ts +4 -6
  11. package/src/api-handlers/admin/users.ts +5 -7
  12. package/src/api-handlers/admin/vibe-data.ts +10 -12
  13. package/src/api-handlers/auth/refresh.ts +5 -7
  14. package/src/api-handlers/auth/signout.ts +5 -6
  15. package/src/api-handlers/auth/status.ts +4 -7
  16. package/src/api-handlers/auth/update-session.ts +123 -125
  17. package/src/api-handlers/auth/verify-code.ts +9 -13
  18. package/src/api-handlers/session/viability.ts +10 -47
  19. package/src/api-handlers/test/force-expire.ts +4 -11
  20. package/src/auth/auth-decision.ts +1 -1
  21. package/src/auth/better-auth.ts +138 -141
  22. package/src/auth/route-config.ts +219 -219
  23. package/src/auth/utils/token-utils.ts +0 -1
  24. package/src/client/AuthContext.tsx +6 -2
  25. package/src/client/fetch-with-auth.ts +47 -47
  26. package/src/components/SessionSync.tsx +6 -5
  27. package/src/components/account/MobileNavDrawer.tsx +3 -3
  28. package/src/components/account/UserAvatarMenu.tsx +6 -3
  29. package/src/components/admin/VibeAdminLayout.tsx +4 -2
  30. package/src/config/logger.ts +1 -1
  31. package/src/hooks/useAuth.ts +117 -115
  32. package/src/hooks/useAuthSettings.ts +2 -2
  33. package/src/hooks/useAvailableProviders.ts +9 -5
  34. package/src/hooks/useSessionExpiration.ts +101 -102
  35. package/src/hooks/useViabilitySession.ts +336 -335
  36. package/src/index.ts +60 -63
  37. package/src/lib/api-handler.ts +0 -1
  38. package/src/lib/app-slug.ts +6 -6
  39. package/src/lib/standardized-client-api.ts +901 -895
  40. package/src/lib/startup-init.ts +243 -247
  41. package/src/lib/test-aware-get-token.ts +22 -12
  42. package/src/lib/token-lifecycle.ts +12 -53
  43. package/src/pages/admin-login/page.tsx +9 -17
  44. package/src/pages/client-admin/ClientSiteAdminPage.tsx +4 -2
  45. package/src/pages/login/page.tsx +21 -28
  46. package/src/pages/showcase/ShowcasePage.tsx +4 -2
  47. package/src/pages/test-env/EmergencyLogoutPage.tsx +7 -6
  48. package/src/pages/test-env/JwtInspectPage.tsx +5 -3
  49. package/src/pages/test-env/RefreshTokenPage.tsx +157 -155
  50. package/src/pages/test-env/TestEnvPage.tsx +4 -2
  51. package/src/pages/verify-code/page.tsx +10 -6
  52. package/src/routes/auth/logout.ts +7 -25
  53. package/src/routes/auth/nextauth.ts +45 -71
  54. package/src/routes/auth/session.ts +25 -50
  55. package/src/routes/auth/viability.ts +7 -19
  56. package/src/server/auth.ts +60 -0
  57. package/src/stores/authStore.ts +1899 -1904
  58. package/src/utils/logout.ts +30 -30
  59. package/dist/api/auth-handler.d.ts +0 -67
  60. package/dist/api/auth-handler.js +0 -397
  61. package/dist/api/index.d.ts +0 -10
  62. package/dist/api/index.js +0 -19
  63. package/dist/api-handlers/account/change-password.d.ts +0 -9
  64. package/dist/api-handlers/account/change-password.js +0 -112
  65. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  66. package/dist/api-handlers/account/masked-info.js +0 -41
  67. package/dist/api-handlers/account/profile.d.ts +0 -3
  68. package/dist/api-handlers/account/profile.js +0 -63
  69. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  70. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  71. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  72. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  73. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  74. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  75. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  76. package/dist/api-handlers/account/reset-password.js +0 -26
  77. package/dist/api-handlers/account/send-code.d.ts +0 -24
  78. package/dist/api-handlers/account/send-code.js +0 -60
  79. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  80. package/dist/api-handlers/account/update-phone.js +0 -64
  81. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  82. package/dist/api-handlers/account/validate-password.js +0 -81
  83. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  84. package/dist/api-handlers/account/verify-email.js +0 -106
  85. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  86. package/dist/api-handlers/account/verify-sms.js +0 -106
  87. package/dist/api-handlers/admin/analytics.d.ts +0 -20
  88. package/dist/api-handlers/admin/analytics.js +0 -379
  89. package/dist/api-handlers/admin/audit.d.ts +0 -20
  90. package/dist/api-handlers/admin/audit.js +0 -214
  91. package/dist/api-handlers/admin/index.d.ts +0 -22
  92. package/dist/api-handlers/admin/index.js +0 -43
  93. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -36
  94. package/dist/api-handlers/admin/redis-sessions.js +0 -204
  95. package/dist/api-handlers/admin/sessions.d.ts +0 -21
  96. package/dist/api-handlers/admin/sessions.js +0 -284
  97. package/dist/api-handlers/admin/site-logs.d.ts +0 -46
  98. package/dist/api-handlers/admin/site-logs.js +0 -318
  99. package/dist/api-handlers/admin/stats.d.ts +0 -21
  100. package/dist/api-handlers/admin/stats.js +0 -240
  101. package/dist/api-handlers/admin/users.d.ts +0 -20
  102. package/dist/api-handlers/admin/users.js +0 -222
  103. package/dist/api-handlers/admin/vibe-data.d.ts +0 -80
  104. package/dist/api-handlers/admin/vibe-data.js +0 -268
  105. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  106. package/dist/api-handlers/anon/preferences.js +0 -96
  107. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  108. package/dist/api-handlers/auth/jwks.js +0 -24
  109. package/dist/api-handlers/auth/login.d.ts +0 -42
  110. package/dist/api-handlers/auth/login.js +0 -178
  111. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  112. package/dist/api-handlers/auth/refresh.js +0 -635
  113. package/dist/api-handlers/auth/signout.d.ts +0 -37
  114. package/dist/api-handlers/auth/signout.js +0 -187
  115. package/dist/api-handlers/auth/status.d.ts +0 -8
  116. package/dist/api-handlers/auth/status.js +0 -26
  117. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  118. package/dist/api-handlers/auth/update-session.js +0 -95
  119. package/dist/api-handlers/auth/validate.d.ts +0 -6
  120. package/dist/api-handlers/auth/validate.js +0 -43
  121. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  122. package/dist/api-handlers/auth/verify-code.js +0 -94
  123. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  124. package/dist/api-handlers/session/refresh-viability.js +0 -39
  125. package/dist/api-handlers/session/viability.d.ts +0 -13
  126. package/dist/api-handlers/session/viability.js +0 -146
  127. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  128. package/dist/api-handlers/test/force-expire.js +0 -65
  129. package/dist/auth/auth-decision.d.ts +0 -39
  130. package/dist/auth/auth-decision.js +0 -182
  131. package/dist/auth/auth-options.d.ts +0 -57
  132. package/dist/auth/auth-options.js +0 -213
  133. package/dist/auth/better-auth.d.ts +0 -82
  134. package/dist/auth/better-auth.js +0 -122
  135. package/dist/auth/callbacks/index.d.ts +0 -6
  136. package/dist/auth/callbacks/index.js +0 -12
  137. package/dist/auth/callbacks/jwt.d.ts +0 -45
  138. package/dist/auth/callbacks/jwt.js +0 -305
  139. package/dist/auth/callbacks/session.d.ts +0 -60
  140. package/dist/auth/callbacks/session.js +0 -170
  141. package/dist/auth/callbacks/signin.d.ts +0 -23
  142. package/dist/auth/callbacks/signin.js +0 -44
  143. package/dist/auth/events/index.d.ts +0 -4
  144. package/dist/auth/events/index.js +0 -8
  145. package/dist/auth/events/signout.d.ts +0 -17
  146. package/dist/auth/events/signout.js +0 -32
  147. package/dist/auth/providers/credentials.d.ts +0 -32
  148. package/dist/auth/providers/credentials.js +0 -223
  149. package/dist/auth/providers/index.d.ts +0 -5
  150. package/dist/auth/providers/index.js +0 -21
  151. package/dist/auth/providers/oauth.d.ts +0 -26
  152. package/dist/auth/providers/oauth.js +0 -105
  153. package/dist/auth/route-config.d.ts +0 -66
  154. package/dist/auth/route-config.js +0 -190
  155. package/dist/auth/types/auth-types.d.ts +0 -417
  156. package/dist/auth/types/auth-types.js +0 -53
  157. package/dist/auth/types/index.d.ts +0 -6
  158. package/dist/auth/types/index.js +0 -22
  159. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  160. package/dist/auth/unauthenticated-routes.js +0 -19
  161. package/dist/auth/utils/idp-client.d.ts +0 -94
  162. package/dist/auth/utils/idp-client.js +0 -384
  163. package/dist/auth/utils/index.d.ts +0 -5
  164. package/dist/auth/utils/index.js +0 -21
  165. package/dist/auth/utils/token-utils.d.ts +0 -84
  166. package/dist/auth/utils/token-utils.js +0 -219
  167. package/dist/client/AuthContext.d.ts +0 -19
  168. package/dist/client/AuthContext.js +0 -112
  169. package/dist/client/better-auth-client.d.ts +0 -1020
  170. package/dist/client/better-auth-client.js +0 -68
  171. package/dist/client/fetch-with-auth.d.ts +0 -11
  172. package/dist/client/fetch-with-auth.js +0 -44
  173. package/dist/client/fetchWithSession.d.ts +0 -3
  174. package/dist/client/fetchWithSession.js +0 -24
  175. package/dist/client/index.d.ts +0 -9
  176. package/dist/client/index.js +0 -20
  177. package/dist/client/useAnonSession.d.ts +0 -36
  178. package/dist/client/useAnonSession.js +0 -99
  179. package/dist/components/SessionSync.d.ts +0 -13
  180. package/dist/components/SessionSync.js +0 -119
  181. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  182. package/dist/components/SignalRHealthCheck.js +0 -97
  183. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  184. package/dist/components/account/MobileNavDrawer.js +0 -81
  185. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  186. package/dist/components/account/UserAvatarMenu.js +0 -88
  187. package/dist/components/account/index.d.ts +0 -9
  188. package/dist/components/account/index.js +0 -13
  189. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  190. package/dist/components/admin/AlertSettingsTab.js +0 -351
  191. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  192. package/dist/components/admin/AnalyticsTab.js +0 -167
  193. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  194. package/dist/components/admin/DataBrowserTab.js +0 -252
  195. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  196. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  197. package/dist/components/admin/SessionsTab.d.ts +0 -37
  198. package/dist/components/admin/SessionsTab.js +0 -165
  199. package/dist/components/admin/StatsTab.d.ts +0 -53
  200. package/dist/components/admin/StatsTab.js +0 -161
  201. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  202. package/dist/components/admin/VibeAdminContext.js +0 -38
  203. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  204. package/dist/components/admin/VibeAdminLayout.js +0 -69
  205. package/dist/components/admin/index.d.ts +0 -29
  206. package/dist/components/admin/index.js +0 -44
  207. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  208. package/dist/components/auth/FederatedAuthSection.js +0 -45
  209. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  210. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  211. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  212. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  213. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  214. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  215. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  216. package/dist/components/recovery/CompleteStep.js +0 -8
  217. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  218. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  219. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  220. package/dist/components/recovery/SelectMethodStep.js +0 -8
  221. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  222. package/dist/components/recovery/SetPasswordStep.js +0 -20
  223. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  224. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  225. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  226. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  227. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  228. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  229. package/dist/components/ui/BetaBadge.d.ts +0 -29
  230. package/dist/components/ui/BetaBadge.js +0 -38
  231. package/dist/components/ui/Footer.d.ts +0 -37
  232. package/dist/components/ui/Footer.js +0 -41
  233. package/dist/config/env.d.ts +0 -66
  234. package/dist/config/env.js +0 -57
  235. package/dist/config/logger.d.ts +0 -57
  236. package/dist/config/logger.js +0 -73
  237. package/dist/config/logging-config.d.ts +0 -30
  238. package/dist/config/logging-config.js +0 -122
  239. package/dist/config/unauthenticated-routes.d.ts +0 -17
  240. package/dist/config/unauthenticated-routes.js +0 -24
  241. package/dist/config/vibe-log-transport.d.ts +0 -81
  242. package/dist/config/vibe-log-transport.js +0 -212
  243. package/dist/edge/internal-api-url.d.ts +0 -53
  244. package/dist/edge/internal-api-url.js +0 -63
  245. package/dist/edge/middleware.d.ts +0 -14
  246. package/dist/edge/middleware.js +0 -32
  247. package/dist/hooks/useAuth.d.ts +0 -23
  248. package/dist/hooks/useAuth.js +0 -81
  249. package/dist/hooks/useAuthSettings.d.ts +0 -59
  250. package/dist/hooks/useAuthSettings.js +0 -93
  251. package/dist/hooks/useAvailableProviders.d.ts +0 -45
  252. package/dist/hooks/useAvailableProviders.js +0 -108
  253. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  254. package/dist/hooks/usePasswordValidation.js +0 -102
  255. package/dist/hooks/useProfile.d.ts +0 -15
  256. package/dist/hooks/useProfile.js +0 -59
  257. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  258. package/dist/hooks/usePublicAuthSettings.js +0 -131
  259. package/dist/hooks/useSessionExpiration.d.ts +0 -57
  260. package/dist/hooks/useSessionExpiration.js +0 -72
  261. package/dist/hooks/useViabilitySession.d.ts +0 -75
  262. package/dist/hooks/useViabilitySession.js +0 -268
  263. package/dist/index.d.ts +0 -12
  264. package/dist/index.js +0 -55
  265. package/dist/lib/anon-session.d.ts +0 -74
  266. package/dist/lib/anon-session.js +0 -169
  267. package/dist/lib/api-handler.d.ts +0 -123
  268. package/dist/lib/api-handler.js +0 -478
  269. package/dist/lib/app-slug.d.ts +0 -95
  270. package/dist/lib/app-slug.js +0 -172
  271. package/dist/lib/demo-mode.d.ts +0 -6
  272. package/dist/lib/demo-mode.js +0 -16
  273. package/dist/lib/geolocation.d.ts +0 -64
  274. package/dist/lib/geolocation.js +0 -235
  275. package/dist/lib/idp-client-config.d.ts +0 -75
  276. package/dist/lib/idp-client-config.js +0 -425
  277. package/dist/lib/idp-fetch.d.ts +0 -14
  278. package/dist/lib/idp-fetch.js +0 -91
  279. package/dist/lib/internal-api.d.ts +0 -87
  280. package/dist/lib/internal-api.js +0 -122
  281. package/dist/lib/jwt-decode-client.d.ts +0 -10
  282. package/dist/lib/jwt-decode-client.js +0 -46
  283. package/dist/lib/jwt-decode.d.ts +0 -48
  284. package/dist/lib/jwt-decode.js +0 -57
  285. package/dist/lib/nextauth-secret.d.ts +0 -10
  286. package/dist/lib/nextauth-secret.js +0 -100
  287. package/dist/lib/rate-limit-service.d.ts +0 -23
  288. package/dist/lib/rate-limit-service.js +0 -6
  289. package/dist/lib/redis.d.ts +0 -5
  290. package/dist/lib/redis.js +0 -28
  291. package/dist/lib/refresh-token-validator.d.ts +0 -13
  292. package/dist/lib/refresh-token-validator.js +0 -117
  293. package/dist/lib/roles.d.ts +0 -145
  294. package/dist/lib/roles.js +0 -168
  295. package/dist/lib/secret-validation.d.ts +0 -4
  296. package/dist/lib/secret-validation.js +0 -14
  297. package/dist/lib/session-store.d.ts +0 -170
  298. package/dist/lib/session-store.js +0 -545
  299. package/dist/lib/session.d.ts +0 -21
  300. package/dist/lib/session.js +0 -26
  301. package/dist/lib/site-logger.d.ts +0 -214
  302. package/dist/lib/site-logger.js +0 -210
  303. package/dist/lib/standardized-client-api.d.ts +0 -161
  304. package/dist/lib/standardized-client-api.js +0 -786
  305. package/dist/lib/startup-init.d.ts +0 -40
  306. package/dist/lib/startup-init.js +0 -261
  307. package/dist/lib/test-aware-get-token.d.ts +0 -2
  308. package/dist/lib/test-aware-get-token.js +0 -81
  309. package/dist/lib/token-expiry.d.ts +0 -14
  310. package/dist/lib/token-expiry.js +0 -39
  311. package/dist/lib/token-lifecycle.d.ts +0 -52
  312. package/dist/lib/token-lifecycle.js +0 -398
  313. package/dist/lib/types/api-responses.d.ts +0 -128
  314. package/dist/lib/types/api-responses.js +0 -171
  315. package/dist/lib/user-agent-parser.d.ts +0 -50
  316. package/dist/lib/user-agent-parser.js +0 -220
  317. package/dist/logging/api/admin-analytics.d.ts +0 -3
  318. package/dist/logging/api/admin-analytics.js +0 -45
  319. package/dist/logging/api/audit-log.d.ts +0 -3
  320. package/dist/logging/api/audit-log.js +0 -52
  321. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  322. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  323. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  324. package/dist/logging/components/AuditLogViewer.js +0 -51
  325. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  326. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  327. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  328. package/dist/logging/components/HealthMetricsCard.js +0 -19
  329. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  330. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  331. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  332. package/dist/logging/hooks/useAuditLog.js +0 -25
  333. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  334. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  335. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  336. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  337. package/dist/logging/index.d.ts +0 -11
  338. package/dist/logging/index.js +0 -40
  339. package/dist/logging/types/analytics.d.ts +0 -68
  340. package/dist/logging/types/analytics.js +0 -3
  341. package/dist/logging/types/audit.d.ts +0 -29
  342. package/dist/logging/types/audit.js +0 -2
  343. package/dist/logging/types/index.d.ts +0 -2
  344. package/dist/logging/types/index.js +0 -19
  345. package/dist/middleware/auth-decision.d.ts +0 -33
  346. package/dist/middleware/auth-decision.js +0 -65
  347. package/dist/middleware/create-middleware.d.ts +0 -102
  348. package/dist/middleware/create-middleware.js +0 -469
  349. package/dist/middleware/rbac-check.d.ts +0 -51
  350. package/dist/middleware/rbac-check.js +0 -219
  351. package/dist/middleware/twofa-presets.d.ts +0 -134
  352. package/dist/middleware/twofa-presets.js +0 -175
  353. package/dist/models/DecodedAccessToken.d.ts +0 -17
  354. package/dist/models/DecodedAccessToken.js +0 -2
  355. package/dist/models/SessionModel.d.ts +0 -122
  356. package/dist/models/SessionModel.js +0 -136
  357. package/dist/pages/admin-login/page.d.ts +0 -31
  358. package/dist/pages/admin-login/page.js +0 -83
  359. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  360. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  361. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  362. package/dist/pages/admin-page-permissions/index.js +0 -13
  363. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  364. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  365. package/dist/pages/admin-roles/index.d.ts +0 -8
  366. package/dist/pages/admin-roles/index.js +0 -15
  367. package/dist/pages/admin-roles/modals.d.ts +0 -72
  368. package/dist/pages/admin-roles/modals.js +0 -154
  369. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  370. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -177
  371. package/dist/pages/client-admin/index.d.ts +0 -32
  372. package/dist/pages/client-admin/index.js +0 -37
  373. package/dist/pages/coming-soon/page.d.ts +0 -8
  374. package/dist/pages/coming-soon/page.js +0 -28
  375. package/dist/pages/login/page.d.ts +0 -22
  376. package/dist/pages/login/page.js +0 -239
  377. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  378. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  379. package/dist/pages/profile/index.d.ts +0 -8
  380. package/dist/pages/profile/index.js +0 -16
  381. package/dist/pages/profile/page.d.ts +0 -19
  382. package/dist/pages/profile/page.js +0 -47
  383. package/dist/pages/profile/profile-patch.d.ts +0 -1
  384. package/dist/pages/profile/profile-patch.js +0 -281
  385. package/dist/pages/recovery/page.d.ts +0 -1
  386. package/dist/pages/recovery/page.js +0 -142
  387. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  388. package/dist/pages/roles/MyRolesPage.js +0 -71
  389. package/dist/pages/roles/components.d.ts +0 -63
  390. package/dist/pages/roles/components.js +0 -108
  391. package/dist/pages/roles/index.d.ts +0 -8
  392. package/dist/pages/roles/index.js +0 -19
  393. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  394. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  395. package/dist/pages/security/index.d.ts +0 -8
  396. package/dist/pages/security/index.js +0 -16
  397. package/dist/pages/security/page.d.ts +0 -21
  398. package/dist/pages/security/page.js +0 -212
  399. package/dist/pages/security/security-patch.d.ts +0 -1
  400. package/dist/pages/security/security-patch.js +0 -302
  401. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  402. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  403. package/dist/pages/settings/index.d.ts +0 -8
  404. package/dist/pages/settings/index.js +0 -16
  405. package/dist/pages/settings/page.d.ts +0 -7
  406. package/dist/pages/settings/page.js +0 -26
  407. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  408. package/dist/pages/showcase/ShowcasePage.js +0 -140
  409. package/dist/pages/showcase/index.d.ts +0 -12
  410. package/dist/pages/showcase/index.js +0 -17
  411. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  412. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -98
  413. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  414. package/dist/pages/test-env/JwtInspectPage.js +0 -114
  415. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  416. package/dist/pages/test-env/RefreshTokenPage.js +0 -91
  417. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  418. package/dist/pages/test-env/TestEnvPage.js +0 -49
  419. package/dist/pages/test-env/index.d.ts +0 -24
  420. package/dist/pages/test-env/index.js +0 -32
  421. package/dist/pages/verify-code/page.d.ts +0 -30
  422. package/dist/pages/verify-code/page.js +0 -408
  423. package/dist/routes/account/index.d.ts +0 -28
  424. package/dist/routes/account/index.js +0 -71
  425. package/dist/routes/account/masked-info.d.ts +0 -33
  426. package/dist/routes/account/masked-info.js +0 -39
  427. package/dist/routes/account/send-code.d.ts +0 -37
  428. package/dist/routes/account/send-code.js +0 -42
  429. package/dist/routes/account/update-phone.d.ts +0 -13
  430. package/dist/routes/account/update-phone.js +0 -17
  431. package/dist/routes/account/verify-email.d.ts +0 -38
  432. package/dist/routes/account/verify-email.js +0 -43
  433. package/dist/routes/account/verify-sms.d.ts +0 -38
  434. package/dist/routes/account/verify-sms.js +0 -43
  435. package/dist/routes/auth/index.d.ts +0 -19
  436. package/dist/routes/auth/index.js +0 -64
  437. package/dist/routes/auth/logout.d.ts +0 -31
  438. package/dist/routes/auth/logout.js +0 -113
  439. package/dist/routes/auth/nextauth.d.ts +0 -19
  440. package/dist/routes/auth/nextauth.js +0 -72
  441. package/dist/routes/auth/refresh.d.ts +0 -30
  442. package/dist/routes/auth/refresh.js +0 -51
  443. package/dist/routes/auth/session.d.ts +0 -43
  444. package/dist/routes/auth/session.js +0 -179
  445. package/dist/routes/auth/settings.d.ts +0 -25
  446. package/dist/routes/auth/settings.js +0 -55
  447. package/dist/routes/auth/viability.d.ts +0 -52
  448. package/dist/routes/auth/viability.js +0 -201
  449. package/dist/routes/index.d.ts +0 -12
  450. package/dist/routes/index.js +0 -54
  451. package/dist/routes/session/index.d.ts +0 -6
  452. package/dist/routes/session/index.js +0 -10
  453. package/dist/routes/session/refresh-viability.d.ts +0 -16
  454. package/dist/routes/session/refresh-viability.js +0 -20
  455. package/dist/server/auth-guard.d.ts +0 -46
  456. package/dist/server/auth-guard.js +0 -128
  457. package/dist/server/decode-session.d.ts +0 -30
  458. package/dist/server/decode-session.js +0 -78
  459. package/dist/server/slim-middleware.d.ts +0 -23
  460. package/dist/server/slim-middleware.js +0 -89
  461. package/dist/server/with-auth.d.ts +0 -33
  462. package/dist/server/with-auth.js +0 -59
  463. package/dist/services/signalrActivityService.d.ts +0 -44
  464. package/dist/services/signalrActivityService.js +0 -257
  465. package/dist/stores/authStore.d.ts +0 -154
  466. package/dist/stores/authStore.js +0 -1531
  467. package/dist/theme/ThemeProvider.d.ts +0 -14
  468. package/dist/theme/ThemeProvider.js +0 -28
  469. package/dist/theme/default.d.ts +0 -8
  470. package/dist/theme/default.js +0 -33
  471. package/dist/theme/index.d.ts +0 -15
  472. package/dist/theme/index.js +0 -25
  473. package/dist/theme/types.d.ts +0 -56
  474. package/dist/theme/types.js +0 -8
  475. package/dist/theme/useTheme.d.ts +0 -60
  476. package/dist/theme/useTheme.js +0 -63
  477. package/dist/theme/utils.d.ts +0 -13
  478. package/dist/theme/utils.js +0 -39
  479. package/dist/types/api.d.ts +0 -134
  480. package/dist/types/api.js +0 -44
  481. package/dist/types/auth.d.ts +0 -19
  482. package/dist/types/auth.js +0 -2
  483. package/dist/types/logging.d.ts +0 -42
  484. package/dist/types/logging.js +0 -2
  485. package/dist/types/recovery.d.ts +0 -48
  486. package/dist/types/recovery.js +0 -2
  487. package/dist/types/security.d.ts +0 -1
  488. package/dist/types/security.js +0 -2
  489. package/dist/utils/api.d.ts +0 -85
  490. package/dist/utils/api.js +0 -287
  491. package/dist/utils/circuitBreaker.d.ts +0 -43
  492. package/dist/utils/circuitBreaker.js +0 -91
  493. package/dist/utils/error-message.d.ts +0 -1
  494. package/dist/utils/error-message.js +0 -103
  495. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  496. package/dist/utils/layout/reservedSpace.js +0 -102
  497. package/dist/utils/logout.d.ts +0 -14
  498. package/dist/utils/logout.js +0 -32
  499. package/dist/vibe/client.d.ts +0 -261
  500. package/dist/vibe/client.js +0 -445
  501. package/dist/vibe/enterprise-auth.d.ts +0 -106
  502. package/dist/vibe/enterprise-auth.js +0 -173
  503. package/dist/vibe/errors.d.ts +0 -83
  504. package/dist/vibe/errors.js +0 -146
  505. package/dist/vibe/generic.d.ts +0 -234
  506. package/dist/vibe/generic.js +0 -369
  507. package/dist/vibe/hooks/index.d.ts +0 -169
  508. package/dist/vibe/hooks/index.js +0 -252
  509. package/dist/vibe/index.d.ts +0 -25
  510. package/dist/vibe/index.js +0 -72
  511. package/dist/vibe/sessions.d.ts +0 -161
  512. package/dist/vibe/sessions.js +0 -391
  513. package/dist/vibe/types.d.ts +0 -353
  514. package/dist/vibe/types.js +0 -315
  515. package/src/auth/auth-options.ts +0 -237
  516. package/src/auth/callbacks/index.ts +0 -7
  517. package/src/auth/callbacks/jwt.ts +0 -382
  518. package/src/auth/callbacks/session.ts +0 -243
  519. package/src/auth/callbacks/signin.ts +0 -56
  520. package/src/auth/events/index.ts +0 -5
  521. package/src/auth/events/signout.ts +0 -33
  522. package/src/auth/providers/credentials.ts +0 -256
  523. package/src/auth/providers/index.ts +0 -6
  524. package/src/auth/providers/oauth.ts +0 -114
  525. package/src/lib/nextauth-secret.ts +0 -121
  526. package/src/types/next-auth.d.ts +0 -15
@@ -1,243 +0,0 @@
1
- /**
2
- * Session Callback
3
- *
4
- * Builds the NextAuth session from Redis session data.
5
- * The JWT only contains redisSessionId - all user data comes from Redis.
6
- *
7
- * FLOW:
8
- * 1. Extract redisSessionId from JWT token
9
- * 2. Fetch session data from Redis
10
- * 3. Build NextAuth session with user info
11
- *
12
- * @version 1.0.0
13
- * @since auth-refactor-2026-01
14
- */
15
-
16
- import type { Session } from 'next-auth';
17
- import type { JWT } from 'next-auth/jwt';
18
- import { getSession } from '../../lib/session-store';
19
- // NOTE: Using SessionData from models until Phase 3 normalizes names
20
- import type { SessionData } from '../../models/SessionModel';
21
-
22
- // ============================================================================
23
- // TYPES
24
- // ============================================================================
25
-
26
- interface SessionCallbackParams {
27
- session: Session;
28
- token: JWT & {
29
- /** Redis session ID - the key to look up session data */
30
- redisSessionId?: string;
31
- error?: string;
32
- };
33
- }
34
-
35
- interface AppSessionUser {
36
- id: string;
37
- email: string;
38
- name?: string;
39
- roles: string[];
40
- // MFA status
41
- twoFactorSessionVerified: boolean;
42
- requiresTwoFactor: boolean;
43
- // MFA claims from IDP token
44
- authenticationMethods?: string[];
45
- authenticationLevel?: string;
46
- mfaCompletedAt?: number;
47
- mfaExpiresAt?: number;
48
- mfaValidityHours?: number;
49
- // OAuth provider info
50
- oauthProvider?: string;
51
- // Multi-tenant IDP info
52
- idpClientId?: string;
53
- merchantId?: string;
54
- // JWT signing key (from header, NOT client_id from payload)
55
- bearerKeyId?: string;
56
- }
57
-
58
- interface AppSession extends Omit<Session, 'user'> {
59
- user: AppSessionUser;
60
- sessionToken?: string;
61
- accessToken?: string;
62
- refreshToken?: string;
63
- accessTokenExpires?: number;
64
- error?: string;
65
- }
66
-
67
- // ============================================================================
68
- // SESSION CALLBACK
69
- // ============================================================================
70
-
71
- /**
72
- * Session callback - builds NextAuth session from Redis.
73
- *
74
- * This callback is called whenever getSession() or useSession() is used.
75
- * It fetches the full session from Redis and exposes it to the client.
76
- *
77
- * @param params - Session callback parameters from NextAuth
78
- * @returns AppSession with user data from Redis
79
- */
80
- export async function sessionCallback({
81
- session,
82
- token,
83
- }: SessionCallbackParams): Promise<AppSession> {
84
- // Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
85
- const redisSessionId = (token as any)?.sessionToken || token?.redisSessionId;
86
-
87
- console.log('[SESSION_CALLBACK] Entry:', {
88
- hasToken: !!token,
89
- redisSessionId: redisSessionId || 'MISSING',
90
- tokenError: token?.error || 'none',
91
- tokenKeys: token ? Object.keys(token) : [],
92
- });
93
-
94
- // -------------------------------------------------------------------------
95
- // Handle Token Errors
96
- // -------------------------------------------------------------------------
97
-
98
- if (token.error) {
99
- console.log('[SESSION_CALLBACK] Token has error:', token.error);
100
- // Special case: MFA expired - return partial session for step-up flow
101
- if (token.error === 'MfaExpired' && redisSessionId) {
102
- const sessionData = await safeGetSession(redisSessionId as string);
103
- if (sessionData) {
104
- return {
105
- ...session,
106
- user: {
107
- id: sessionData.userId,
108
- email: sessionData.email,
109
- name: sessionData.name,
110
- roles: sessionData.roles || [],
111
- twoFactorSessionVerified: false,
112
- requiresTwoFactor: true,
113
- authenticationMethods: sessionData.authenticationMethods,
114
- authenticationLevel: sessionData.authenticationLevel,
115
- mfaExpiresAt: sessionData.mfaExpiresAt,
116
- },
117
- sessionToken: redisSessionId as string,
118
- accessToken: sessionData.idpAccessToken,
119
- refreshToken: sessionData.idpRefreshToken,
120
- error: 'MfaExpired',
121
- };
122
- }
123
- }
124
-
125
- // For other errors, try to recover session data if possible
126
- if (redisSessionId) {
127
- const sessionData = await safeGetSession(redisSessionId as string);
128
- if (sessionData) {
129
- return buildSessionFromRedis(session, redisSessionId as string, sessionData);
130
- }
131
- }
132
-
133
- // No recovery possible - return error session
134
- return buildErrorSession(session, token.error);
135
- }
136
-
137
- // -------------------------------------------------------------------------
138
- // Validate Session Token
139
- // -------------------------------------------------------------------------
140
-
141
- if (!redisSessionId) {
142
- console.log('[SESSION_CALLBACK] No redisSessionId - returning error session');
143
- return buildErrorSession(session, 'NoSessionToken');
144
- }
145
-
146
- // -------------------------------------------------------------------------
147
- // Fetch Session from Redis
148
- // -------------------------------------------------------------------------
149
-
150
- const sessionData = await safeGetSession(redisSessionId as string);
151
-
152
- if (!sessionData) {
153
- console.log('[SESSION_CALLBACK] Redis session not found for:', redisSessionId);
154
- return buildErrorSession(session, 'SessionNotFound');
155
- }
156
-
157
- console.log('[SESSION_CALLBACK] Redis session found:', {
158
- userId: sessionData.userId,
159
- email: sessionData.email,
160
- roles: sessionData.roles,
161
- hasAccessToken: !!sessionData.idpAccessToken,
162
- });
163
-
164
- const result = buildSessionFromRedis(session, redisSessionId as string, sessionData);
165
- console.log('[SESSION_CALLBACK] Returning:', {
166
- userId: result.user.id,
167
- roles: result.user.roles,
168
- hasAccessToken: !!result.accessToken,
169
- });
170
- return result;
171
- }
172
-
173
- // ============================================================================
174
- // HELPER FUNCTIONS
175
- // ============================================================================
176
-
177
- /**
178
- * Safely fetch session from Redis, returning null on error.
179
- */
180
- async function safeGetSession(
181
- sessionId: string
182
- ): Promise<SessionData | null> {
183
- try {
184
- return await getSession(sessionId);
185
- } catch {
186
- return null;
187
- }
188
- }
189
-
190
- /**
191
- * Build complete session from Redis data.
192
- * Uses normalized field names from SessionData.
193
- */
194
- function buildSessionFromRedis(
195
- session: Session,
196
- sessionId: string,
197
- data: SessionData
198
- ): AppSession {
199
- return {
200
- ...session,
201
- user: {
202
- id: data.userId,
203
- email: data.email,
204
- name: data.name,
205
- roles: data.roles || [],
206
- // MFA state (normalized field name)
207
- twoFactorSessionVerified: data.mfaVerified,
208
- requiresTwoFactor: !data.mfaVerified,
209
- authenticationMethods: data.authenticationMethods,
210
- authenticationLevel: data.authenticationLevel,
211
- mfaCompletedAt: data.mfaCompletedAt,
212
- mfaExpiresAt: data.mfaExpiresAt,
213
- mfaValidityHours: data.mfaValidityHours,
214
- oauthProvider: data.oauthProvider,
215
- idpClientId: data.idpClientId,
216
- merchantId: data.merchantId,
217
- // Bearer key ID from JWT header (may be undefined for old sessions)
218
- bearerKeyId: data.bearerKeyId,
219
- },
220
- sessionToken: sessionId,
221
- // IDP tokens (normalized field names)
222
- accessToken: data.idpAccessToken,
223
- refreshToken: data.idpRefreshToken,
224
- accessTokenExpires: data.idpAccessTokenExpires,
225
- };
226
- }
227
-
228
- /**
229
- * Build error session with empty user.
230
- */
231
- function buildErrorSession(session: Session, error: string): AppSession {
232
- return {
233
- ...session,
234
- user: {
235
- id: '',
236
- email: '',
237
- roles: [],
238
- twoFactorSessionVerified: false,
239
- requiresTwoFactor: false,
240
- },
241
- error,
242
- };
243
- }
@@ -1,56 +0,0 @@
1
- /**
2
- * SignIn Callback
3
- *
4
- * Handles post-authentication actions like 2FA redirect.
5
- * Called after credentials or OAuth authentication succeeds.
6
- *
7
- * @version 1.0.0
8
- * @since auth-refactor-2026-01
9
- */
10
-
11
- import type { User, Account } from 'next-auth';
12
-
13
- // ============================================================================
14
- // SIGNIN CALLBACK
15
- // ============================================================================
16
-
17
- /**
18
- * SignIn callback - handle 2FA redirect for OAuth users.
19
- *
20
- * When require2FA is true for the client, OAuth users need to be
21
- * redirected to the verify-code page immediately after OAuth login.
22
- *
23
- * @param params - SignIn callback parameters from NextAuth
24
- * @returns true to allow sign-in, or a URL string to redirect
25
- */
26
- export async function signInCallback({
27
- user,
28
- account,
29
- }: {
30
- user: User | any;
31
- account: Account | null;
32
- }): Promise<boolean | string> {
33
- // Only handle OAuth providers (credentials flow handles 2FA separately)
34
- if (!account?.provider || account.provider === 'credentials') {
35
- return true;
36
- }
37
-
38
- // Check if OAuth user needs 2FA redirect
39
- const token = user as any;
40
- if (token?.requiresTwoFactorRedirect) {
41
- // Preserve the original callback URL through 2FA flow
42
- const originalCallbackUrl = (account as any)?.callbackUrl || '/';
43
-
44
- // Don't redirect back to auth pages after 2FA
45
- const safeCallbackUrl = originalCallbackUrl.startsWith('/account-auth/')
46
- ? '/'
47
- : originalCallbackUrl;
48
-
49
- const encodedCallback = encodeURIComponent(safeCallbackUrl);
50
-
51
- // Return redirect URL - NextAuth will redirect here instead of completing sign-in
52
- return `/account-auth/verify-code?callbackUrl=${encodedCallback}`;
53
- }
54
-
55
- return true;
56
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Auth Events - Public Exports
3
- */
4
-
5
- export { handleSignOut } from './signout';
@@ -1,33 +0,0 @@
1
- /**
2
- * SignOut Event Handler
3
- *
4
- * Cleans up Redis session when user signs out.
5
- *
6
- * @version 1.0.0
7
- * @since auth-refactor-2026-01
8
- */
9
-
10
- import type { JWT } from 'next-auth/jwt';
11
- import { deleteSession } from '../../lib/session-store';
12
-
13
- // ============================================================================
14
- // SIGNOUT EVENT
15
- // ============================================================================
16
-
17
- /**
18
- * Handle user sign out by deleting Redis session.
19
- *
20
- * @param token - The JWT token containing the session ID
21
- */
22
- export async function handleSignOut({ token }: { token: JWT | null }): Promise<void> {
23
- // Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
24
- const redisSessionId = (token as any)?.sessionToken || (token as any)?.redisSessionId;
25
-
26
- if (redisSessionId) {
27
- try {
28
- await deleteSession(redisSessionId);
29
- } catch (error) {
30
- console.error('[SIGNOUT_EVENT] Failed to delete session:', error);
31
- }
32
- }
33
- }
@@ -1,256 +0,0 @@
1
- /**
2
- * Credentials Provider
3
- *
4
- * Handles email/password authentication via PayEz IDP.
5
- * Creates Redis session and returns minimal user object to NextAuth.
6
- *
7
- * FLOW:
8
- * 1. User submits email/password
9
- * 2. We call IDP /api/ExternalAuth/login
10
- * 3. IDP returns tokens if credentials valid
11
- * 4. We create Redis session with tokens
12
- * 5. Return user object with redisSessionId to NextAuth
13
- *
14
- * @version 1.0.0
15
- * @since auth-refactor-2026-01
16
- */
17
-
18
- import CredentialsProvider from 'next-auth/providers/credentials';
19
- import { createSession } from '../../lib/session-store';
20
- import { idpLogin } from '../utils/idp-client';
21
- import {
22
- decodeIdpAccessToken,
23
- extractEmailFromToken,
24
- extractRolesFromToken,
25
- extractAmrFromToken,
26
- expClaimToMs,
27
- extractKidFromToken,
28
- } from '../utils/token-utils';
29
- import type { AuthorizeResult, LoginCredentials } from '../types/auth-types';
30
- import { toRedisSessionId } from '../types/auth-types';
31
- // NOTE: Using any for sessionData until Phase 3 normalizes types
32
-
33
- // ============================================================================
34
- // CREDENTIALS PROVIDER
35
- // ============================================================================
36
-
37
- /**
38
- * Create the CredentialsProvider for NextAuth.
39
- *
40
- * This provider handles email/password login. The authorize function
41
- * is called when a user submits the login form.
42
- */
43
- export function createCredentialsProvider() {
44
- return CredentialsProvider({
45
- id: 'credentials',
46
- name: 'Credentials',
47
- credentials: {
48
- email: { label: 'Email', type: 'email' },
49
- password: { label: 'Password', type: 'password' },
50
- },
51
- authorize: authorizeCredentials,
52
- });
53
- }
54
-
55
- /**
56
- * Authorize user with email/password.
57
- *
58
- * This is the core authentication function. It:
59
- * 1. Validates credentials with IDP
60
- * 2. Decodes the returned tokens
61
- * 3. Creates a Redis session
62
- * 4. Returns user info for NextAuth JWT
63
- *
64
- * @param credentials - Email and password from login form
65
- * @param req - The incoming request (for IP/UA forwarding)
66
- * @returns User object for NextAuth, or null/throws on failure
67
- */
68
- async function authorizeCredentials(
69
- credentials: Record<'email' | 'password', string> | undefined,
70
- req: any
71
- ): Promise<AuthorizeResult | null> {
72
- // -------------------------------------------------------------------------
73
- // Validate Input
74
- // -------------------------------------------------------------------------
75
-
76
- if (!credentials?.email || !credentials?.password) {
77
- throw new Error('Email and password required');
78
- }
79
-
80
- const loginCredentials: LoginCredentials = {
81
- email: credentials.email,
82
- password: credentials.password,
83
- };
84
-
85
- // Extract client info for audit logging
86
- const clientHeaders = extractClientHeaders(req);
87
-
88
- // -------------------------------------------------------------------------
89
- // Call IDP
90
- // -------------------------------------------------------------------------
91
-
92
- const loginResult = await idpLogin(loginCredentials, clientHeaders);
93
-
94
- if (!loginResult.success || !loginResult.result) {
95
- // Build structured error for frontend
96
- const errorResponse = buildAuthError(loginResult.error);
97
- throw new Error(JSON.stringify(errorResponse));
98
- }
99
-
100
- const { access_token, refresh_token, user: idpUser } = loginResult.result;
101
-
102
- // -------------------------------------------------------------------------
103
- // Decode Token
104
- // -------------------------------------------------------------------------
105
-
106
- const decoded = decodeIdpAccessToken(access_token);
107
- if (!decoded) {
108
- throw new Error('Failed to decode token');
109
- }
110
-
111
- // Extract kid from JWT header (CRITICAL: this is different from client_id in payload)
112
- const bearerKeyId = extractKidFromToken(access_token);
113
- if (bearerKeyId) {
114
- console.log('[CREDENTIALS] Extracted bearerKeyId (kid) from JWT header:', bearerKeyId);
115
- } else {
116
- console.warn('[CREDENTIALS] No kid found in JWT header - token may be unsigned or malformed');
117
- }
118
-
119
- // Extract claims from token
120
- const email = extractEmailFromToken(decoded);
121
- const roles = extractRolesFromToken(decoded);
122
- const amrClaims = extractAmrFromToken(decoded);
123
- const acrLevel = decoded.acr || '1';
124
- const userId = decoded.sub;
125
-
126
- // Check if 2FA is complete based on ACR level
127
- // ACR=1: Provisional token (requires 2FA)
128
- // ACR=2: Full authentication (2FA complete)
129
- const mfaVerified = acrLevel === '2';
130
-
131
- // Decode refresh token expiry if available
132
- let refreshTokenExpires: number | undefined;
133
- try {
134
- const refreshDecoded = decodeIdpAccessToken(refresh_token);
135
- if (refreshDecoded?.exp) {
136
- refreshTokenExpires = expClaimToMs(refreshDecoded.exp);
137
- }
138
- } catch {
139
- // Ignore - will use default expiry
140
- }
141
-
142
- // -------------------------------------------------------------------------
143
- // Create Redis Session
144
- // -------------------------------------------------------------------------
145
-
146
- // Using normalized field names (session-store handles backward compatibility)
147
- const sessionData: any = {
148
- userId,
149
- email,
150
- roles,
151
- // IDP tokens (normalized names)
152
- idpAccessToken: access_token,
153
- idpRefreshToken: refresh_token,
154
- idpAccessTokenExpires: expClaimToMs(decoded.exp),
155
- idpRefreshTokenExpires: refreshTokenExpires,
156
- decodedAccessToken: decoded,
157
- // Bearer key ID from JWT header (NOT client_id from payload)
158
- bearerKeyId,
159
- // MFA state (normalized names)
160
- mfaVerified,
161
- authenticationMethods: amrClaims,
162
- authenticationLevel: acrLevel,
163
- // MFA timing info from token
164
- mfaCompletedAt: decoded.mfa_time ? expClaimToMs(decoded.mfa_time) : undefined,
165
- mfaExpiresAt: decoded.mfa_expires ? expClaimToMs(decoded.mfa_expires) : undefined,
166
- mfaValidityHours: decoded.mfa_validity_hours,
167
- };
168
-
169
- // Determine MFA method from IDP user info
170
- let mfaMethod: 'email' | 'sms' | 'totp' | undefined;
171
- if (idpUser?.isEmailConfirmed) {
172
- mfaMethod = 'email';
173
- } else if (idpUser?.isSmsConfirmed) {
174
- mfaMethod = 'sms';
175
- }
176
-
177
- if (mfaMethod) {
178
- sessionData.mfaMethod = mfaMethod;
179
- }
180
-
181
- // Create the Redis session
182
- const redisSessionId = await createSession(sessionData);
183
-
184
- // -------------------------------------------------------------------------
185
- // Return User Object for NextAuth
186
- // -------------------------------------------------------------------------
187
-
188
- // NextAuth requires 'id' field - we use userId from IDP
189
- // The redisSessionId is passed through to the JWT callback
190
- return {
191
- id: userId,
192
- email,
193
- roles,
194
- redisSessionId: toRedisSessionId(redisSessionId),
195
- mfaRequired: !mfaVerified,
196
- mfaMethod,
197
- };
198
- }
199
-
200
- // ============================================================================
201
- // HELPER FUNCTIONS
202
- // ============================================================================
203
-
204
- /**
205
- * Extract client headers from request for audit logging.
206
- */
207
- function extractClientHeaders(req: any): { ip?: string; userAgent?: string } {
208
- const headers: { ip?: string; userAgent?: string } = {};
209
-
210
- // Extract client IP
211
- const forwardedFor = req?.headers?.['x-forwarded-for'];
212
- const realIp = req?.headers?.['x-real-ip'];
213
-
214
- if (forwardedFor) {
215
- const ip = Array.isArray(forwardedFor) ? forwardedFor[0] : forwardedFor.split(',')[0].trim();
216
- headers.ip = ip;
217
- } else if (realIp) {
218
- headers.ip = Array.isArray(realIp) ? realIp[0] : realIp;
219
- }
220
-
221
- // Extract User-Agent
222
- const userAgent = req?.headers?.['user-agent'];
223
- if (userAgent) {
224
- headers.userAgent = Array.isArray(userAgent) ? userAgent[0] : userAgent;
225
- }
226
-
227
- return headers;
228
- }
229
-
230
- /**
231
- * Build structured error response for frontend.
232
- *
233
- * The frontend expects a specific error structure to display
234
- * appropriate messages and handle things like lockout.
235
- */
236
- function buildAuthError(error?: { code: string; message: string; details?: any }): object {
237
- if (!error) {
238
- return {
239
- success: false,
240
- error: {
241
- code: 'AUTH_ERROR',
242
- message: 'Authentication failed',
243
- details: {},
244
- },
245
- };
246
- }
247
-
248
- return {
249
- success: false,
250
- error: {
251
- code: error.code || 'AUTH_ERROR',
252
- message: error.message || 'Authentication failed',
253
- details: error.details || {},
254
- },
255
- };
256
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Auth Providers - Public Exports
3
- */
4
-
5
- export * from './credentials';
6
- export * from './oauth';