@nauth-toolkit/core 0.1.14 → 0.1.17

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 (623) hide show
  1. package/dist/adapters/database-columns.d.ts +70 -0
  2. package/dist/adapters/database-columns.d.ts.map +1 -1
  3. package/dist/adapters/database-columns.js +76 -2
  4. package/dist/adapters/database-columns.js.map +1 -1
  5. package/dist/adapters/express.adapter.d.ts +66 -0
  6. package/dist/adapters/express.adapter.d.ts.map +1 -1
  7. package/dist/adapters/express.adapter.js +80 -0
  8. package/dist/adapters/express.adapter.js.map +1 -1
  9. package/dist/adapters/fastify.adapter.d.ts +42 -0
  10. package/dist/adapters/fastify.adapter.d.ts.map +1 -1
  11. package/dist/adapters/fastify.adapter.js +86 -0
  12. package/dist/adapters/fastify.adapter.js.map +1 -1
  13. package/dist/adapters/index.d.ts +5 -0
  14. package/dist/adapters/index.d.ts.map +1 -1
  15. package/dist/adapters/index.js +9 -0
  16. package/dist/adapters/index.js.map +1 -1
  17. package/dist/adapters/storage.factory.d.ts +107 -0
  18. package/dist/adapters/storage.factory.d.ts.map +1 -1
  19. package/dist/adapters/storage.factory.js +114 -0
  20. package/dist/adapters/storage.factory.js.map +1 -1
  21. package/dist/adapters.d.ts +8 -0
  22. package/dist/adapters.d.ts.map +1 -1
  23. package/dist/adapters.js +8 -0
  24. package/dist/adapters.js.map +1 -1
  25. package/dist/bootstrap.d.ts +82 -0
  26. package/dist/bootstrap.d.ts.map +1 -1
  27. package/dist/bootstrap.js +106 -0
  28. package/dist/bootstrap.js.map +1 -1
  29. package/dist/dto/admin-set-password.dto.d.ts +90 -0
  30. package/dist/dto/admin-set-password.dto.d.ts.map +1 -1
  31. package/dist/dto/admin-set-password.dto.js +91 -0
  32. package/dist/dto/admin-set-password.dto.js.map +1 -1
  33. package/dist/dto/auth-challenge.dto.d.ts +170 -0
  34. package/dist/dto/auth-challenge.dto.d.ts.map +1 -1
  35. package/dist/dto/auth-challenge.dto.js +170 -0
  36. package/dist/dto/auth-challenge.dto.js.map +1 -1
  37. package/dist/dto/auth-response.dto.d.ts +196 -0
  38. package/dist/dto/auth-response.dto.d.ts.map +1 -1
  39. package/dist/dto/auth-response.dto.js +149 -0
  40. package/dist/dto/auth-response.dto.js.map +1 -1
  41. package/dist/dto/challenge-response.dto.d.ts +155 -0
  42. package/dist/dto/challenge-response.dto.d.ts.map +1 -1
  43. package/dist/dto/challenge-response.dto.js +8 -0
  44. package/dist/dto/challenge-response.dto.js.map +1 -1
  45. package/dist/dto/change-password-request.dto.d.ts +35 -0
  46. package/dist/dto/change-password-request.dto.d.ts.map +1 -1
  47. package/dist/dto/change-password-request.dto.js +35 -0
  48. package/dist/dto/change-password-request.dto.js.map +1 -1
  49. package/dist/dto/change-password-response.dto.d.ts +25 -0
  50. package/dist/dto/change-password-response.dto.d.ts.map +1 -1
  51. package/dist/dto/change-password-response.dto.js +25 -0
  52. package/dist/dto/change-password-response.dto.js.map +1 -1
  53. package/dist/dto/change-password.dto.d.ts +45 -0
  54. package/dist/dto/change-password.dto.d.ts.map +1 -1
  55. package/dist/dto/change-password.dto.js +45 -0
  56. package/dist/dto/change-password.dto.js.map +1 -1
  57. package/dist/dto/confirm-forgot-password.dto.d.ts +59 -0
  58. package/dist/dto/confirm-forgot-password.dto.d.ts.map +1 -1
  59. package/dist/dto/confirm-forgot-password.dto.js +59 -0
  60. package/dist/dto/confirm-forgot-password.dto.js.map +1 -1
  61. package/dist/dto/error-response.dto.d.ts +103 -0
  62. package/dist/dto/error-response.dto.d.ts.map +1 -1
  63. package/dist/dto/error-response.dto.js +103 -0
  64. package/dist/dto/error-response.dto.js.map +1 -1
  65. package/dist/dto/forgot-password.dto.d.ts +58 -0
  66. package/dist/dto/forgot-password.dto.d.ts.map +1 -1
  67. package/dist/dto/forgot-password.dto.js +58 -0
  68. package/dist/dto/forgot-password.dto.js.map +1 -1
  69. package/dist/dto/get-available-methods.dto.d.ts +37 -0
  70. package/dist/dto/get-available-methods.dto.d.ts.map +1 -1
  71. package/dist/dto/get-available-methods.dto.js +37 -0
  72. package/dist/dto/get-available-methods.dto.js.map +1 -1
  73. package/dist/dto/get-challenge-data-response.dto.d.ts +24 -0
  74. package/dist/dto/get-challenge-data-response.dto.d.ts.map +1 -1
  75. package/dist/dto/get-challenge-data-response.dto.js +24 -0
  76. package/dist/dto/get-challenge-data-response.dto.js.map +1 -1
  77. package/dist/dto/get-challenge-data.dto.d.ts +46 -0
  78. package/dist/dto/get-challenge-data.dto.d.ts.map +1 -1
  79. package/dist/dto/get-challenge-data.dto.js +46 -0
  80. package/dist/dto/get-challenge-data.dto.js.map +1 -1
  81. package/dist/dto/get-client-info.dto.d.ts +74 -0
  82. package/dist/dto/get-client-info.dto.d.ts.map +1 -1
  83. package/dist/dto/get-client-info.dto.js +74 -0
  84. package/dist/dto/get-client-info.dto.js.map +1 -1
  85. package/dist/dto/get-device-token-response.dto.d.ts +21 -0
  86. package/dist/dto/get-device-token-response.dto.d.ts.map +1 -1
  87. package/dist/dto/get-device-token-response.dto.js +21 -0
  88. package/dist/dto/get-device-token-response.dto.js.map +1 -1
  89. package/dist/dto/get-events-by-type.dto.d.ts +50 -0
  90. package/dist/dto/get-events-by-type.dto.d.ts.map +1 -1
  91. package/dist/dto/get-events-by-type.dto.js +50 -0
  92. package/dist/dto/get-events-by-type.dto.js.map +1 -1
  93. package/dist/dto/get-ip-address-response.dto.d.ts +20 -0
  94. package/dist/dto/get-ip-address-response.dto.d.ts.map +1 -1
  95. package/dist/dto/get-ip-address-response.dto.js +20 -0
  96. package/dist/dto/get-ip-address-response.dto.js.map +1 -1
  97. package/dist/dto/get-mfa-status.dto.d.ts +59 -0
  98. package/dist/dto/get-mfa-status.dto.d.ts.map +1 -1
  99. package/dist/dto/get-mfa-status.dto.js +59 -0
  100. package/dist/dto/get-mfa-status.dto.js.map +1 -1
  101. package/dist/dto/get-risk-assessment-history.dto.d.ts +28 -0
  102. package/dist/dto/get-risk-assessment-history.dto.d.ts.map +1 -1
  103. package/dist/dto/get-risk-assessment-history.dto.js +28 -0
  104. package/dist/dto/get-risk-assessment-history.dto.js.map +1 -1
  105. package/dist/dto/get-session-id-response.dto.d.ts +21 -0
  106. package/dist/dto/get-session-id-response.dto.d.ts.map +1 -1
  107. package/dist/dto/get-session-id-response.dto.js +21 -0
  108. package/dist/dto/get-session-id-response.dto.js.map +1 -1
  109. package/dist/dto/get-setup-data-response.dto.d.ts +27 -0
  110. package/dist/dto/get-setup-data-response.dto.d.ts.map +1 -1
  111. package/dist/dto/get-setup-data-response.dto.js +27 -0
  112. package/dist/dto/get-setup-data-response.dto.js.map +1 -1
  113. package/dist/dto/get-setup-data.dto.d.ts +51 -0
  114. package/dist/dto/get-setup-data.dto.d.ts.map +1 -1
  115. package/dist/dto/get-setup-data.dto.js +51 -0
  116. package/dist/dto/get-setup-data.dto.js.map +1 -1
  117. package/dist/dto/get-suspicious-activity.dto.d.ts +31 -0
  118. package/dist/dto/get-suspicious-activity.dto.d.ts.map +1 -1
  119. package/dist/dto/get-suspicious-activity.dto.js +31 -0
  120. package/dist/dto/get-suspicious-activity.dto.js.map +1 -1
  121. package/dist/dto/get-user-agent-response.dto.d.ts +19 -0
  122. package/dist/dto/get-user-agent-response.dto.d.ts.map +1 -1
  123. package/dist/dto/get-user-agent-response.dto.js +19 -0
  124. package/dist/dto/get-user-agent-response.dto.js.map +1 -1
  125. package/dist/dto/get-user-auth-history.dto.d.ts +64 -0
  126. package/dist/dto/get-user-auth-history.dto.d.ts.map +1 -1
  127. package/dist/dto/get-user-auth-history.dto.js +64 -0
  128. package/dist/dto/get-user-auth-history.dto.js.map +1 -1
  129. package/dist/dto/get-user-by-email.dto.d.ts +42 -0
  130. package/dist/dto/get-user-by-email.dto.d.ts.map +1 -1
  131. package/dist/dto/get-user-by-email.dto.js +42 -0
  132. package/dist/dto/get-user-by-email.dto.js.map +1 -1
  133. package/dist/dto/get-user-by-id.dto.d.ts +32 -0
  134. package/dist/dto/get-user-by-id.dto.d.ts.map +1 -1
  135. package/dist/dto/get-user-by-id.dto.js +32 -0
  136. package/dist/dto/get-user-by-id.dto.js.map +1 -1
  137. package/dist/dto/get-user-devices.dto.d.ts +34 -0
  138. package/dist/dto/get-user-devices.dto.d.ts.map +1 -1
  139. package/dist/dto/get-user-devices.dto.js +34 -0
  140. package/dist/dto/get-user-devices.dto.js.map +1 -1
  141. package/dist/dto/get-user-response.dto.d.ts +14 -0
  142. package/dist/dto/get-user-response.dto.d.ts.map +1 -1
  143. package/dist/dto/get-user-response.dto.js +15 -0
  144. package/dist/dto/get-user-response.dto.js.map +1 -1
  145. package/dist/dto/has-provider.dto.d.ts +33 -0
  146. package/dist/dto/has-provider.dto.d.ts.map +1 -1
  147. package/dist/dto/has-provider.dto.js +33 -0
  148. package/dist/dto/has-provider.dto.js.map +1 -1
  149. package/dist/dto/index.js +5 -0
  150. package/dist/dto/index.js.map +1 -1
  151. package/dist/dto/is-trusted-device-response.dto.d.ts +28 -0
  152. package/dist/dto/is-trusted-device-response.dto.d.ts.map +1 -1
  153. package/dist/dto/is-trusted-device-response.dto.js +28 -0
  154. package/dist/dto/is-trusted-device-response.dto.js.map +1 -1
  155. package/dist/dto/list-providers-response.dto.d.ts +19 -0
  156. package/dist/dto/list-providers-response.dto.d.ts.map +1 -1
  157. package/dist/dto/list-providers-response.dto.js +19 -0
  158. package/dist/dto/list-providers-response.dto.js.map +1 -1
  159. package/dist/dto/login.dto.d.ts +48 -0
  160. package/dist/dto/login.dto.d.ts.map +1 -1
  161. package/dist/dto/login.dto.js +50 -1
  162. package/dist/dto/login.dto.js.map +1 -1
  163. package/dist/dto/logout-all-response.dto.d.ts +20 -0
  164. package/dist/dto/logout-all-response.dto.d.ts.map +1 -1
  165. package/dist/dto/logout-all-response.dto.js +20 -0
  166. package/dist/dto/logout-all-response.dto.js.map +1 -1
  167. package/dist/dto/logout-all.dto.d.ts +42 -0
  168. package/dist/dto/logout-all.dto.d.ts.map +1 -1
  169. package/dist/dto/logout-all.dto.js +42 -0
  170. package/dist/dto/logout-all.dto.js.map +1 -1
  171. package/dist/dto/logout-response.dto.d.ts +21 -0
  172. package/dist/dto/logout-response.dto.d.ts.map +1 -1
  173. package/dist/dto/logout-response.dto.js +21 -0
  174. package/dist/dto/logout-response.dto.js.map +1 -1
  175. package/dist/dto/logout.dto.d.ts +45 -0
  176. package/dist/dto/logout.dto.d.ts.map +1 -1
  177. package/dist/dto/logout.dto.js +45 -0
  178. package/dist/dto/logout.dto.js.map +1 -1
  179. package/dist/dto/refresh-token.dto.d.ts +28 -0
  180. package/dist/dto/refresh-token.dto.d.ts.map +1 -1
  181. package/dist/dto/refresh-token.dto.js +28 -0
  182. package/dist/dto/refresh-token.dto.js.map +1 -1
  183. package/dist/dto/remove-devices.dto.d.ts +51 -0
  184. package/dist/dto/remove-devices.dto.d.ts.map +1 -1
  185. package/dist/dto/remove-devices.dto.js +51 -0
  186. package/dist/dto/remove-devices.dto.js.map +1 -1
  187. package/dist/dto/resend-code-response.dto.d.ts +28 -0
  188. package/dist/dto/resend-code-response.dto.d.ts.map +1 -1
  189. package/dist/dto/resend-code-response.dto.js +28 -0
  190. package/dist/dto/resend-code-response.dto.js.map +1 -1
  191. package/dist/dto/resend-code.dto.d.ts +37 -0
  192. package/dist/dto/resend-code.dto.d.ts.map +1 -1
  193. package/dist/dto/resend-code.dto.js +37 -0
  194. package/dist/dto/resend-code.dto.js.map +1 -1
  195. package/dist/dto/reset-password.dto.d.ts +74 -0
  196. package/dist/dto/reset-password.dto.d.ts.map +1 -1
  197. package/dist/dto/reset-password.dto.js +76 -1
  198. package/dist/dto/reset-password.dto.js.map +1 -1
  199. package/dist/dto/respond-challenge.dto.d.ts +147 -0
  200. package/dist/dto/respond-challenge.dto.d.ts.map +1 -1
  201. package/dist/dto/respond-challenge.dto.js +162 -0
  202. package/dist/dto/respond-challenge.dto.js.map +1 -1
  203. package/dist/dto/set-mfa-exemption.dto.d.ts +65 -0
  204. package/dist/dto/set-mfa-exemption.dto.d.ts.map +1 -1
  205. package/dist/dto/set-mfa-exemption.dto.js +65 -0
  206. package/dist/dto/set-mfa-exemption.dto.js.map +1 -1
  207. package/dist/dto/set-must-change-password-response.dto.d.ts +23 -0
  208. package/dist/dto/set-must-change-password-response.dto.d.ts.map +1 -1
  209. package/dist/dto/set-must-change-password-response.dto.js +23 -0
  210. package/dist/dto/set-must-change-password-response.dto.js.map +1 -1
  211. package/dist/dto/set-must-change-password.dto.d.ts +32 -0
  212. package/dist/dto/set-must-change-password.dto.d.ts.map +1 -1
  213. package/dist/dto/set-must-change-password.dto.js +32 -0
  214. package/dist/dto/set-must-change-password.dto.js.map +1 -1
  215. package/dist/dto/set-preferred-method.dto.d.ts +48 -0
  216. package/dist/dto/set-preferred-method.dto.d.ts.map +1 -1
  217. package/dist/dto/set-preferred-method.dto.js +48 -0
  218. package/dist/dto/set-preferred-method.dto.js.map +1 -1
  219. package/dist/dto/setup-mfa.dto.d.ts +62 -0
  220. package/dist/dto/setup-mfa.dto.d.ts.map +1 -1
  221. package/dist/dto/setup-mfa.dto.js +62 -0
  222. package/dist/dto/setup-mfa.dto.js.map +1 -1
  223. package/dist/dto/signup.dto.d.ts +92 -0
  224. package/dist/dto/signup.dto.d.ts.map +1 -1
  225. package/dist/dto/signup.dto.js +93 -0
  226. package/dist/dto/signup.dto.js.map +1 -1
  227. package/dist/dto/social-auth.dto.d.ts +234 -0
  228. package/dist/dto/social-auth.dto.d.ts.map +1 -1
  229. package/dist/dto/social-auth.dto.js +234 -0
  230. package/dist/dto/social-auth.dto.js.map +1 -1
  231. package/dist/dto/trust-device-response.dto.d.ts +26 -0
  232. package/dist/dto/trust-device-response.dto.d.ts.map +1 -1
  233. package/dist/dto/trust-device-response.dto.js +26 -0
  234. package/dist/dto/trust-device-response.dto.js.map +1 -1
  235. package/dist/dto/trust-device.dto.d.ts +9 -0
  236. package/dist/dto/trust-device.dto.d.ts.map +1 -1
  237. package/dist/dto/trust-device.dto.js +9 -0
  238. package/dist/dto/trust-device.dto.js.map +1 -1
  239. package/dist/dto/update-user-attributes-request.dto.d.ts +36 -0
  240. package/dist/dto/update-user-attributes-request.dto.d.ts.map +1 -1
  241. package/dist/dto/update-user-attributes-request.dto.js +36 -0
  242. package/dist/dto/update-user-attributes-request.dto.js.map +1 -1
  243. package/dist/dto/user-response.dto.d.ts +81 -0
  244. package/dist/dto/user-response.dto.d.ts.map +1 -1
  245. package/dist/dto/user-response.dto.js +84 -2
  246. package/dist/dto/user-response.dto.js.map +1 -1
  247. package/dist/dto/user-update.dto.d.ts +132 -0
  248. package/dist/dto/user-update.dto.d.ts.map +1 -1
  249. package/dist/dto/user-update.dto.js +133 -0
  250. package/dist/dto/user-update.dto.js.map +1 -1
  251. package/dist/dto/verify-email.dto.d.ts +171 -0
  252. package/dist/dto/verify-email.dto.d.ts.map +1 -1
  253. package/dist/dto/verify-email.dto.js +173 -1
  254. package/dist/dto/verify-email.dto.js.map +1 -1
  255. package/dist/dto/verify-mfa-code.dto.d.ts +65 -0
  256. package/dist/dto/verify-mfa-code.dto.d.ts.map +1 -1
  257. package/dist/dto/verify-mfa-code.dto.js +65 -0
  258. package/dist/dto/verify-mfa-code.dto.js.map +1 -1
  259. package/dist/dto/verify-phone-by-sub.dto.d.ts +49 -0
  260. package/dist/dto/verify-phone-by-sub.dto.d.ts.map +1 -1
  261. package/dist/dto/verify-phone-by-sub.dto.js +49 -0
  262. package/dist/dto/verify-phone-by-sub.dto.js.map +1 -1
  263. package/dist/dto/verify-phone.dto.d.ts +139 -0
  264. package/dist/dto/verify-phone.dto.d.ts.map +1 -1
  265. package/dist/dto/verify-phone.dto.js +142 -1
  266. package/dist/dto/verify-phone.dto.js.map +1 -1
  267. package/dist/dto.d.ts +10 -0
  268. package/dist/dto.d.ts.map +1 -1
  269. package/dist/dto.js +10 -0
  270. package/dist/dto.js.map +1 -1
  271. package/dist/entities/auth-audit.entity.d.ts +159 -0
  272. package/dist/entities/auth-audit.entity.d.ts.map +1 -1
  273. package/dist/entities/auth-audit.entity.js +166 -0
  274. package/dist/entities/auth-audit.entity.js.map +1 -1
  275. package/dist/entities/challenge-session.entity.d.ts +87 -0
  276. package/dist/entities/challenge-session.entity.d.ts.map +1 -1
  277. package/dist/entities/challenge-session.entity.js +87 -0
  278. package/dist/entities/challenge-session.entity.js.map +1 -1
  279. package/dist/entities/index.d.ts +18 -0
  280. package/dist/entities/index.d.ts.map +1 -1
  281. package/dist/entities/index.js +18 -0
  282. package/dist/entities/index.js.map +1 -1
  283. package/dist/entities/login-attempt.entity.d.ts +43 -0
  284. package/dist/entities/login-attempt.entity.d.ts.map +1 -1
  285. package/dist/entities/login-attempt.entity.js +43 -0
  286. package/dist/entities/login-attempt.entity.js.map +1 -1
  287. package/dist/entities/mfa-device.entity.d.ts +112 -0
  288. package/dist/entities/mfa-device.entity.d.ts.map +1 -1
  289. package/dist/entities/mfa-device.entity.js +112 -0
  290. package/dist/entities/mfa-device.entity.js.map +1 -1
  291. package/dist/entities/rate-limit.entity.d.ts +31 -0
  292. package/dist/entities/rate-limit.entity.d.ts.map +1 -1
  293. package/dist/entities/rate-limit.entity.js +31 -0
  294. package/dist/entities/rate-limit.entity.js.map +1 -1
  295. package/dist/entities/session.entity.d.ts +121 -0
  296. package/dist/entities/session.entity.d.ts.map +1 -1
  297. package/dist/entities/session.entity.js +121 -0
  298. package/dist/entities/session.entity.js.map +1 -1
  299. package/dist/entities/social-account.entity.d.ts +75 -0
  300. package/dist/entities/social-account.entity.d.ts.map +1 -1
  301. package/dist/entities/social-account.entity.js +75 -0
  302. package/dist/entities/social-account.entity.js.map +1 -1
  303. package/dist/entities/storage-lock.entity.d.ts +28 -0
  304. package/dist/entities/storage-lock.entity.d.ts.map +1 -1
  305. package/dist/entities/storage-lock.entity.js +28 -0
  306. package/dist/entities/storage-lock.entity.js.map +1 -1
  307. package/dist/entities/trusted-device.entity.d.ts +83 -0
  308. package/dist/entities/trusted-device.entity.d.ts.map +1 -1
  309. package/dist/entities/trusted-device.entity.js +83 -0
  310. package/dist/entities/trusted-device.entity.js.map +1 -1
  311. package/dist/entities/user.entity.d.ts +166 -0
  312. package/dist/entities/user.entity.d.ts.map +1 -1
  313. package/dist/entities/user.entity.js +166 -0
  314. package/dist/entities/user.entity.js.map +1 -1
  315. package/dist/entities/verification-token.entity.d.ts +102 -0
  316. package/dist/entities/verification-token.entity.d.ts.map +1 -1
  317. package/dist/entities/verification-token.entity.js +102 -0
  318. package/dist/entities/verification-token.entity.js.map +1 -1
  319. package/dist/entities.d.ts +8 -0
  320. package/dist/entities.d.ts.map +1 -1
  321. package/dist/entities.js +8 -0
  322. package/dist/entities.js.map +1 -1
  323. package/dist/enums/auth-audit-event-type.enum.d.ts +211 -0
  324. package/dist/enums/auth-audit-event-type.enum.d.ts.map +1 -1
  325. package/dist/enums/auth-audit-event-type.enum.js +244 -0
  326. package/dist/enums/auth-audit-event-type.enum.js.map +1 -1
  327. package/dist/enums/error-codes.enum.d.ts +296 -0
  328. package/dist/enums/error-codes.enum.d.ts.map +1 -1
  329. package/dist/enums/error-codes.enum.js +332 -0
  330. package/dist/enums/error-codes.enum.js.map +1 -1
  331. package/dist/enums/mfa-method.enum.d.ts +74 -0
  332. package/dist/enums/mfa-method.enum.d.ts.map +1 -1
  333. package/dist/enums/mfa-method.enum.js +64 -0
  334. package/dist/enums/mfa-method.enum.js.map +1 -1
  335. package/dist/enums/risk-factor.enum.d.ts +91 -0
  336. package/dist/enums/risk-factor.enum.d.ts.map +1 -1
  337. package/dist/enums/risk-factor.enum.js +97 -0
  338. package/dist/enums/risk-factor.enum.js.map +1 -1
  339. package/dist/exceptions/nauth.exception.d.ts +149 -0
  340. package/dist/exceptions/nauth.exception.d.ts.map +1 -1
  341. package/dist/exceptions/nauth.exception.js +159 -0
  342. package/dist/exceptions/nauth.exception.js.map +1 -1
  343. package/dist/handlers/auth.handler.d.ts +32 -0
  344. package/dist/handlers/auth.handler.d.ts.map +1 -1
  345. package/dist/handlers/auth.handler.js +47 -1
  346. package/dist/handlers/auth.handler.js.map +1 -1
  347. package/dist/handlers/client-info.handler.d.ts +25 -0
  348. package/dist/handlers/client-info.handler.d.ts.map +1 -1
  349. package/dist/handlers/client-info.handler.js +36 -2
  350. package/dist/handlers/client-info.handler.js.map +1 -1
  351. package/dist/handlers/csrf.handler.d.ts +32 -0
  352. package/dist/handlers/csrf.handler.d.ts.map +1 -1
  353. package/dist/handlers/csrf.handler.js +49 -1
  354. package/dist/handlers/csrf.handler.js.map +1 -1
  355. package/dist/handlers/token-delivery.handler.d.ts +16 -0
  356. package/dist/handlers/token-delivery.handler.d.ts.map +1 -1
  357. package/dist/handlers/token-delivery.handler.js +22 -1
  358. package/dist/handlers/token-delivery.handler.js.map +1 -1
  359. package/dist/index.d.ts +34 -0
  360. package/dist/index.d.ts.map +1 -1
  361. package/dist/index.js +67 -0
  362. package/dist/index.js.map +1 -1
  363. package/dist/interfaces/client-info.interface.d.ts +58 -0
  364. package/dist/interfaces/client-info.interface.d.ts.map +1 -1
  365. package/dist/interfaces/config.interface.d.ts +1774 -0
  366. package/dist/interfaces/config.interface.d.ts.map +1 -1
  367. package/dist/interfaces/config.interface.js +16 -0
  368. package/dist/interfaces/config.interface.js.map +1 -1
  369. package/dist/interfaces/entities.interface.d.ts +48 -0
  370. package/dist/interfaces/entities.interface.d.ts.map +1 -1
  371. package/dist/interfaces/entities.interface.js +8 -0
  372. package/dist/interfaces/entities.interface.js.map +1 -1
  373. package/dist/interfaces/index.js +5 -0
  374. package/dist/interfaces/index.js.map +1 -1
  375. package/dist/interfaces/logger.interface.d.ts +213 -0
  376. package/dist/interfaces/logger.interface.d.ts.map +1 -1
  377. package/dist/interfaces/logger.interface.js +35 -0
  378. package/dist/interfaces/logger.interface.js.map +1 -1
  379. package/dist/interfaces/mfa-provider.interface.d.ts +134 -0
  380. package/dist/interfaces/mfa-provider.interface.d.ts.map +1 -1
  381. package/dist/interfaces/oauth.interface.d.ts +110 -0
  382. package/dist/interfaces/oauth.interface.d.ts.map +1 -1
  383. package/dist/interfaces/provider.interface.d.ts +83 -0
  384. package/dist/interfaces/provider.interface.d.ts.map +1 -1
  385. package/dist/interfaces/sms-template.interface.d.ts +246 -0
  386. package/dist/interfaces/sms-template.interface.d.ts.map +1 -1
  387. package/dist/interfaces/sms-template.interface.js +26 -0
  388. package/dist/interfaces/sms-template.interface.js.map +1 -1
  389. package/dist/interfaces/social-auth-provider.interface.d.ts +115 -0
  390. package/dist/interfaces/social-auth-provider.interface.d.ts.map +1 -1
  391. package/dist/interfaces/storage-adapter.interface.d.ts +37 -0
  392. package/dist/interfaces/storage-adapter.interface.d.ts.map +1 -1
  393. package/dist/interfaces/template.interface.d.ts +351 -0
  394. package/dist/interfaces/template.interface.d.ts.map +1 -1
  395. package/dist/interfaces/template.interface.js +13 -0
  396. package/dist/interfaces/template.interface.js.map +1 -1
  397. package/dist/interfaces/token-verifier.interface.d.ts +101 -0
  398. package/dist/interfaces/token-verifier.interface.d.ts.map +1 -1
  399. package/dist/interfaces.d.ts +8 -0
  400. package/dist/interfaces.d.ts.map +1 -1
  401. package/dist/interfaces.js +8 -0
  402. package/dist/interfaces.js.map +1 -1
  403. package/dist/internal.d.ts +120 -0
  404. package/dist/internal.d.ts.map +1 -1
  405. package/dist/internal.js +138 -0
  406. package/dist/internal.js.map +1 -1
  407. package/dist/platform/interfaces.d.ts +187 -0
  408. package/dist/platform/interfaces.d.ts.map +1 -1
  409. package/dist/platform/interfaces.js +11 -0
  410. package/dist/platform/interfaces.js.map +1 -1
  411. package/dist/schemas/auth-config.schema.d.ts +48 -0
  412. package/dist/schemas/auth-config.schema.d.ts.map +1 -1
  413. package/dist/schemas/auth-config.schema.js +188 -9
  414. package/dist/schemas/auth-config.schema.js.map +1 -1
  415. package/dist/services/adaptive-mfa-decision.service.d.ts +144 -0
  416. package/dist/services/adaptive-mfa-decision.service.d.ts.map +1 -1
  417. package/dist/services/adaptive-mfa-decision.service.js +151 -5
  418. package/dist/services/adaptive-mfa-decision.service.js.map +1 -1
  419. package/dist/services/auth-audit.service.d.ts +195 -0
  420. package/dist/services/auth-audit.service.d.ts.map +1 -1
  421. package/dist/services/auth-audit.service.js +228 -1
  422. package/dist/services/auth-audit.service.js.map +1 -1
  423. package/dist/services/auth-challenge-helper.service.d.ts +144 -1
  424. package/dist/services/auth-challenge-helper.service.d.ts.map +1 -1
  425. package/dist/services/auth-challenge-helper.service.js +295 -16
  426. package/dist/services/auth-challenge-helper.service.js.map +1 -1
  427. package/dist/services/auth-flow-context-builder.service.d.ts +120 -1
  428. package/dist/services/auth-flow-context-builder.service.d.ts.map +1 -1
  429. package/dist/services/auth-flow-context-builder.service.js +184 -5
  430. package/dist/services/auth-flow-context-builder.service.js.map +1 -1
  431. package/dist/services/auth-flow-rules.d.ts +136 -0
  432. package/dist/services/auth-flow-rules.d.ts.map +1 -1
  433. package/dist/services/auth-flow-rules.js +137 -0
  434. package/dist/services/auth-flow-rules.js.map +1 -1
  435. package/dist/services/auth-flow-state-definitions.d.ts +40 -0
  436. package/dist/services/auth-flow-state-definitions.d.ts.map +1 -1
  437. package/dist/services/auth-flow-state-definitions.js +98 -0
  438. package/dist/services/auth-flow-state-definitions.js.map +1 -1
  439. package/dist/services/auth-flow-state-machine.service.d.ts +91 -0
  440. package/dist/services/auth-flow-state-machine.service.d.ts.map +1 -1
  441. package/dist/services/auth-flow-state-machine.service.js +102 -0
  442. package/dist/services/auth-flow-state-machine.service.js.map +1 -1
  443. package/dist/services/auth-flow-state-machine.types.d.ts +221 -0
  444. package/dist/services/auth-flow-state-machine.types.d.ts.map +1 -1
  445. package/dist/services/auth-flow-state-machine.types.js +47 -0
  446. package/dist/services/auth-flow-state-machine.types.js.map +1 -1
  447. package/dist/services/auth.service.d.ts +397 -1
  448. package/dist/services/auth.service.d.ts.map +1 -1
  449. package/dist/services/auth.service.js +943 -27
  450. package/dist/services/auth.service.js.map +1 -1
  451. package/dist/services/challenge.service.d.ts +255 -1
  452. package/dist/services/challenge.service.d.ts.map +1 -1
  453. package/dist/services/challenge.service.js +327 -3
  454. package/dist/services/challenge.service.js.map +1 -1
  455. package/dist/services/client-info.service.d.ts +143 -0
  456. package/dist/services/client-info.service.d.ts.map +1 -1
  457. package/dist/services/client-info.service.js +161 -0
  458. package/dist/services/client-info.service.js.map +1 -1
  459. package/dist/services/csrf.service.d.ts +15 -0
  460. package/dist/services/csrf.service.d.ts.map +1 -1
  461. package/dist/services/csrf.service.js +16 -0
  462. package/dist/services/csrf.service.js.map +1 -1
  463. package/dist/services/email-verification.service.d.ts +52 -0
  464. package/dist/services/email-verification.service.d.ts.map +1 -1
  465. package/dist/services/email-verification.service.js +149 -10
  466. package/dist/services/email-verification.service.js.map +1 -1
  467. package/dist/services/geo-location.service.d.ts +105 -0
  468. package/dist/services/geo-location.service.d.ts.map +1 -1
  469. package/dist/services/geo-location.service.js +188 -2
  470. package/dist/services/geo-location.service.js.map +1 -1
  471. package/dist/services/jwt.service.d.ts +257 -0
  472. package/dist/services/jwt.service.d.ts.map +1 -1
  473. package/dist/services/jwt.service.js +284 -1
  474. package/dist/services/jwt.service.js.map +1 -1
  475. package/dist/services/mfa-base.service.d.ts +179 -1
  476. package/dist/services/mfa-base.service.d.ts.map +1 -1
  477. package/dist/services/mfa-base.service.js +256 -2
  478. package/dist/services/mfa-base.service.js.map +1 -1
  479. package/dist/services/mfa.service.d.ts +304 -0
  480. package/dist/services/mfa.service.d.ts.map +1 -1
  481. package/dist/services/mfa.service.js +380 -0
  482. package/dist/services/mfa.service.js.map +1 -1
  483. package/dist/services/password-reset.service.d.ts +46 -0
  484. package/dist/services/password-reset.service.d.ts.map +1 -1
  485. package/dist/services/password-reset.service.js +79 -0
  486. package/dist/services/password-reset.service.js.map +1 -1
  487. package/dist/services/password.service.d.ts +139 -0
  488. package/dist/services/password.service.d.ts.map +1 -1
  489. package/dist/services/password.service.js +167 -9
  490. package/dist/services/password.service.js.map +1 -1
  491. package/dist/services/phone-verification.service.d.ts +75 -0
  492. package/dist/services/phone-verification.service.d.ts.map +1 -1
  493. package/dist/services/phone-verification.service.js +188 -6
  494. package/dist/services/phone-verification.service.js.map +1 -1
  495. package/dist/services/risk-detection.service.d.ts +198 -0
  496. package/dist/services/risk-detection.service.d.ts.map +1 -1
  497. package/dist/services/risk-detection.service.js +358 -11
  498. package/dist/services/risk-detection.service.js.map +1 -1
  499. package/dist/services/risk-scoring.service.d.ts +84 -0
  500. package/dist/services/risk-scoring.service.d.ts.map +1 -1
  501. package/dist/services/risk-scoring.service.js +87 -0
  502. package/dist/services/risk-scoring.service.js.map +1 -1
  503. package/dist/services/session.service.d.ts +204 -0
  504. package/dist/services/session.service.d.ts.map +1 -1
  505. package/dist/services/session.service.js +289 -4
  506. package/dist/services/session.service.js.map +1 -1
  507. package/dist/services/social-auth-base.service.d.ts +123 -1
  508. package/dist/services/social-auth-base.service.d.ts.map +1 -1
  509. package/dist/services/social-auth-base.service.js +155 -2
  510. package/dist/services/social-auth-base.service.js.map +1 -1
  511. package/dist/services/social-auth.service.d.ts +191 -0
  512. package/dist/services/social-auth.service.d.ts.map +1 -1
  513. package/dist/services/social-auth.service.js +215 -2
  514. package/dist/services/social-auth.service.js.map +1 -1
  515. package/dist/services/social-provider-registry.service.d.ts +86 -0
  516. package/dist/services/social-provider-registry.service.d.ts.map +1 -1
  517. package/dist/services/social-provider-registry.service.js +86 -0
  518. package/dist/services/social-provider-registry.service.js.map +1 -1
  519. package/dist/services/trusted-device.service.d.ts +105 -0
  520. package/dist/services/trusted-device.service.d.ts.map +1 -1
  521. package/dist/services/trusted-device.service.js +133 -4
  522. package/dist/services/trusted-device.service.js.map +1 -1
  523. package/dist/storage/account-lockout-storage.service.d.ts +35 -0
  524. package/dist/storage/account-lockout-storage.service.d.ts.map +1 -1
  525. package/dist/storage/account-lockout-storage.service.js +35 -0
  526. package/dist/storage/account-lockout-storage.service.js.map +1 -1
  527. package/dist/storage/memory-storage.adapter.d.ts +148 -0
  528. package/dist/storage/memory-storage.adapter.d.ts.map +1 -1
  529. package/dist/storage/memory-storage.adapter.js +201 -6
  530. package/dist/storage/memory-storage.adapter.js.map +1 -1
  531. package/dist/storage/rate-limit-storage.service.d.ts +3 -0
  532. package/dist/storage/rate-limit-storage.service.d.ts.map +1 -1
  533. package/dist/storage/rate-limit-storage.service.js +4 -0
  534. package/dist/storage/rate-limit-storage.service.js.map +1 -1
  535. package/dist/storage.d.ts +8 -0
  536. package/dist/storage.d.ts.map +1 -1
  537. package/dist/storage.js +8 -0
  538. package/dist/storage.js.map +1 -1
  539. package/dist/templates/html-template.engine.d.ts +110 -0
  540. package/dist/templates/html-template.engine.d.ts.map +1 -1
  541. package/dist/templates/html-template.engine.js +147 -0
  542. package/dist/templates/html-template.engine.js.map +1 -1
  543. package/dist/templates/index.d.ts +5 -0
  544. package/dist/templates/index.d.ts.map +1 -1
  545. package/dist/templates/index.js +5 -0
  546. package/dist/templates/index.js.map +1 -1
  547. package/dist/templates/sms-template.engine.d.ts +151 -0
  548. package/dist/templates/sms-template.engine.d.ts.map +1 -1
  549. package/dist/templates/sms-template.engine.js +171 -0
  550. package/dist/templates/sms-template.engine.js.map +1 -1
  551. package/dist/templates.d.ts +8 -0
  552. package/dist/templates.d.ts.map +1 -1
  553. package/dist/templates.js +8 -0
  554. package/dist/templates.js.map +1 -1
  555. package/dist/utils/common-passwords.d.ts +42 -0
  556. package/dist/utils/common-passwords.d.ts.map +1 -1
  557. package/dist/utils/common-passwords.js +88 -0
  558. package/dist/utils/common-passwords.js.map +1 -1
  559. package/dist/utils/context-storage.d.ts +129 -0
  560. package/dist/utils/context-storage.d.ts.map +1 -1
  561. package/dist/utils/context-storage.js +129 -0
  562. package/dist/utils/context-storage.js.map +1 -1
  563. package/dist/utils/cookie-names.util.d.ts +35 -0
  564. package/dist/utils/cookie-names.util.d.ts.map +1 -1
  565. package/dist/utils/cookie-names.util.js +37 -0
  566. package/dist/utils/cookie-names.util.js.map +1 -1
  567. package/dist/utils/cookies.util.d.ts +19 -0
  568. package/dist/utils/cookies.util.d.ts.map +1 -1
  569. package/dist/utils/cookies.util.js +30 -3
  570. package/dist/utils/cookies.util.js.map +1 -1
  571. package/dist/utils/index.d.ts +3 -0
  572. package/dist/utils/index.d.ts.map +1 -1
  573. package/dist/utils/index.js +4 -0
  574. package/dist/utils/index.js.map +1 -1
  575. package/dist/utils/ip-extractor.d.ts +88 -0
  576. package/dist/utils/ip-extractor.d.ts.map +1 -1
  577. package/dist/utils/ip-extractor.js +109 -16
  578. package/dist/utils/ip-extractor.js.map +1 -1
  579. package/dist/utils/nauth-logger.d.ts +70 -0
  580. package/dist/utils/nauth-logger.d.ts.map +1 -1
  581. package/dist/utils/nauth-logger.js +82 -4
  582. package/dist/utils/nauth-logger.js.map +1 -1
  583. package/dist/utils/pii-redactor.d.ts +70 -0
  584. package/dist/utils/pii-redactor.d.ts.map +1 -1
  585. package/dist/utils/pii-redactor.js +102 -0
  586. package/dist/utils/pii-redactor.js.map +1 -1
  587. package/dist/utils/setup/get-repositories.d.ts +16 -0
  588. package/dist/utils/setup/get-repositories.d.ts.map +1 -1
  589. package/dist/utils/setup/get-repositories.js +21 -0
  590. package/dist/utils/setup/get-repositories.js.map +1 -1
  591. package/dist/utils/setup/init-services.d.ts +40 -1
  592. package/dist/utils/setup/init-services.d.ts.map +1 -1
  593. package/dist/utils/setup/init-services.js +98 -0
  594. package/dist/utils/setup/init-services.js.map +1 -1
  595. package/dist/utils/setup/init-social.d.ts +27 -0
  596. package/dist/utils/setup/init-social.d.ts.map +1 -1
  597. package/dist/utils/setup/init-social.js +49 -0
  598. package/dist/utils/setup/init-social.js.map +1 -1
  599. package/dist/utils/setup/init-storage.d.ts +22 -0
  600. package/dist/utils/setup/init-storage.d.ts.map +1 -1
  601. package/dist/utils/setup/init-storage.js +36 -0
  602. package/dist/utils/setup/init-storage.js.map +1 -1
  603. package/dist/utils/setup/register-mfa.d.ts +22 -0
  604. package/dist/utils/setup/register-mfa.d.ts.map +1 -1
  605. package/dist/utils/setup/register-mfa.js +41 -0
  606. package/dist/utils/setup/register-mfa.js.map +1 -1
  607. package/dist/utils/setup/run-nauth-migrations.d.ts +7 -0
  608. package/dist/utils/setup/run-nauth-migrations.d.ts.map +1 -1
  609. package/dist/utils/setup/run-nauth-migrations.js +8 -0
  610. package/dist/utils/setup/run-nauth-migrations.js.map +1 -1
  611. package/dist/utils/token-delivery-policy.d.ts +17 -0
  612. package/dist/utils/token-delivery-policy.d.ts.map +1 -1
  613. package/dist/utils/token-delivery-policy.js +17 -0
  614. package/dist/utils/token-delivery-policy.js.map +1 -1
  615. package/dist/utils.d.ts +8 -0
  616. package/dist/utils.d.ts.map +1 -1
  617. package/dist/utils.js +8 -0
  618. package/dist/utils.js.map +1 -1
  619. package/dist/validators/template.validator.d.ts +80 -0
  620. package/dist/validators/template.validator.d.ts.map +1 -1
  621. package/dist/validators/template.validator.js +94 -0
  622. package/dist/validators/template.validator.js.map +1 -1
  623. package/package.json +7 -2
@@ -6,6 +6,35 @@ const error_codes_enum_1 = require("../enums/error-codes.enum");
6
6
  const mfa_method_enum_1 = require("../enums/mfa-method.enum");
7
7
  const auth_challenge_dto_1 = require("../dto/auth-challenge.dto");
8
8
  const auth_audit_event_type_enum_1 = require("../enums/auth-audit-event-type.enum");
9
+ /**
10
+ * MFA Service Registry
11
+ *
12
+ * Central registry for managing MFA provider services.
13
+ * Routes requests to the appropriate provider based on method name.
14
+ *
15
+ * Provider services (TOTP, SMS, Passkey) automatically register themselves
16
+ * when their modules are imported via OnModuleInit.
17
+ *
18
+ * **Key Features:**
19
+ * - Provider registration and lookup
20
+ * - Unified interface for MFA operations
21
+ * - Routing verification requests to correct provider
22
+ * - Device management operations
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * @Controller('auth')
27
+ * export class AuthController {
28
+ * constructor(private readonly mfaService: MFAService) {}
29
+ *
30
+ * @Post('mfa/verify')
31
+ * async verifyMFA(@Body() dto: { method: string; code: string }) {
32
+ * const provider = this.mfaService.getProvider(dto.method);
33
+ * return await provider.verify(user, dto.code);
34
+ * }
35
+ * }
36
+ * ```
37
+ */
9
38
  class MFAService {
10
39
  mfaDeviceRepository;
11
40
  userRepository;
@@ -24,6 +53,21 @@ class MFAService {
24
53
  this.auditService = auditService;
25
54
  this.clientInfoService = clientInfoService;
26
55
  }
56
+ /**
57
+ * Register an MFA provider
58
+ *
59
+ * Called automatically by provider modules during initialization.
60
+ * Provider method names must be unique.
61
+ *
62
+ * @param provider - Provider service instance (must have methodName property)
63
+ * @throws {NAuthException} If provider is already registered
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // In provider module's OnModuleInit
68
+ * this.mfaService.registerProvider(this.totpProvider);
69
+ * ```
70
+ */
27
71
  registerProvider(provider) {
28
72
  const name = provider.methodName;
29
73
  if (this.providers.has(name)) {
@@ -31,6 +75,19 @@ class MFAService {
31
75
  }
32
76
  this.providers.set(name, provider);
33
77
  }
78
+ /**
79
+ * Get a provider by method name
80
+ *
81
+ * @param methodName - Method name (e.g., 'totp', 'sms', 'passkey')
82
+ * @returns Provider service instance
83
+ * @throws {NAuthException} If provider is not registered
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const totpProvider = this.mfaService.getProvider('totp');
88
+ * const setupData = await totpProvider.setup(user);
89
+ * ```
90
+ */
34
91
  getProvider(methodName) {
35
92
  const provider = this.providers.get(methodName);
36
93
  if (!provider) {
@@ -38,39 +95,115 @@ class MFAService {
38
95
  }
39
96
  return provider;
40
97
  }
98
+ /**
99
+ * Check if a provider is registered
100
+ *
101
+ * @param dto - Request DTO with method name
102
+ * @returns Response DTO with hasProvider flag
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const result = await this.mfaService.hasProvider({ methodName: 'totp' });
107
+ * if (result.hasProvider) {
108
+ * // TOTP is available
109
+ * }
110
+ * ```
111
+ */
41
112
  hasProvider(dto) {
42
113
  return {
43
114
  hasProvider: this.providers.has(dto.methodName),
44
115
  };
45
116
  }
117
+ /**
118
+ * Get all registered provider method names
119
+ *
120
+ * @returns Response DTO with array of method names
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const result = this.mfaService.listProviders(); // { providers: ['totp', 'sms', 'passkey'] }
125
+ * ```
126
+ */
46
127
  listProviders() {
47
128
  return {
48
129
  providers: Array.from(this.providers.keys()),
49
130
  };
50
131
  }
132
+ /**
133
+ * Get available MFA methods for a user
134
+ *
135
+ * Returns list of methods that are:
136
+ * - Registered as providers
137
+ * - Allowed by configuration
138
+ *
139
+ * This returns ALL methods that can be set up, not just ones the user has configured.
140
+ * Use getUserDevices() to check which methods the user has actually set up.
141
+ *
142
+ * @param dto - Request DTO with user sub
143
+ * @returns Response DTO with array of available method names
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const result = await this.mfaService.getAvailableMethods({ sub: user.sub });
148
+ * // Returns: { availableMethods: ['totp', 'sms', 'passkey'] }
149
+ * ```
150
+ */
51
151
  async getAvailableMethods(dto) {
152
+ // Look up user by sub to validate user exists
52
153
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.sub } });
53
154
  if (!userEntity) {
54
155
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
55
156
  }
56
157
  const available = [];
57
158
  for (const [methodName, provider] of this.providers.entries()) {
159
+ // Check if method is allowed by configuration
58
160
  if (!provider.isMethodAllowed()) {
59
161
  continue;
60
162
  }
163
+ // Return all allowed methods (whether user has set them up or not)
61
164
  available.push(methodName);
62
165
  }
63
166
  return {
64
167
  availableMethods: available,
65
168
  };
66
169
  }
170
+ /**
171
+ * Verify MFA code using appropriate provider
172
+ *
173
+ * Routes the verification request to the correct provider based on method name.
174
+ *
175
+ * @param dto - Request DTO with user sub, method name, code, and optional device ID
176
+ * @returns Response DTO with verification result
177
+ * @throws {NAuthException} If method is not available or verification fails
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * // Verify TOTP code
182
+ * const result = await this.mfaService.verifyCode({
183
+ * sub: user.sub,
184
+ * methodName: 'totp',
185
+ * code: '123456'
186
+ * });
187
+ *
188
+ * // Verify backup code
189
+ * const result = await this.mfaService.verifyCode({
190
+ * sub: user.sub,
191
+ * methodName: 'backup',
192
+ * code: 'ABC12345'
193
+ * });
194
+ * ```
195
+ */
67
196
  async verifyCode(dto) {
197
+ // Look up user by sub
68
198
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.sub } });
69
199
  if (!userEntity) {
70
200
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
71
201
  }
72
202
  const user = userEntity;
203
+ // Handle backup codes specially (not a provider, uses base class helper)
73
204
  if (dto.methodName === mfa_method_enum_1.MFAMethod.BACKUP) {
205
+ // Get any provider to access backup code verification
206
+ // All providers extend BaseMFAProviderService which has verifyBackupCode
74
207
  const firstProvider = Array.from(this.providers.values())[0];
75
208
  if (firstProvider && 'verifyBackupCode' in firstProvider) {
76
209
  const providerWithBackup = firstProvider;
@@ -79,11 +212,28 @@ class MFAService {
79
212
  }
80
213
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, 'Backup code verification not available');
81
214
  }
215
+ // Get provider and verify
82
216
  const provider = this.getProvider(dto.methodName);
83
217
  const isValid = await provider.verify(user, dto.code, dto.deviceId);
84
218
  return { valid: isValid };
85
219
  }
220
+ /**
221
+ * Setup MFA device using appropriate provider
222
+ *
223
+ * @param dto - Request DTO with user sub, method name, and optional setup data
224
+ * @returns Response DTO with provider-specific setup data
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * const result = await this.mfaService.setup({
229
+ * sub: user.sub,
230
+ * methodName: 'totp'
231
+ * });
232
+ * // Returns: { setupData: { secret, qrCode, manualEntryKey } }
233
+ * ```
234
+ */
86
235
  async setup(dto) {
236
+ // Look up user by sub
87
237
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.sub } });
88
238
  if (!userEntity) {
89
239
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
@@ -95,11 +245,25 @@ class MFAService {
95
245
  setupData: setupData,
96
246
  };
97
247
  }
248
+ /**
249
+ * Get user's MFA devices
250
+ *
251
+ * @param dto - Request DTO with user sub
252
+ * @returns Response DTO with array of MFA devices
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * const result = await this.mfaService.getUserDevices({ sub: user.sub });
257
+ * // Returns: { devices: [...] }
258
+ * ```
259
+ */
98
260
  async getUserDevices(dto) {
261
+ // Look up user by sub to get internal ID
99
262
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.sub } });
100
263
  if (!userEntity) {
101
264
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
102
265
  }
266
+ // Only fetch active devices (inactive devices are soft-deleted)
103
267
  const devices = await this.mfaDeviceRepository.find({
104
268
  where: { userId: userEntity.id, isActive: true },
105
269
  order: { createdAt: 'DESC' },
@@ -108,7 +272,33 @@ class MFAService {
108
272
  devices: devices,
109
273
  };
110
274
  }
275
+ /**
276
+ * Get comprehensive MFA status for a user
277
+ *
278
+ * Returns complete MFA configuration status including:
279
+ * - Whether MFA is enabled/required
280
+ * - Configured and available methods
281
+ * - Preferred method
282
+ * - Backup codes status
283
+ * - MFA exemption information
284
+ *
285
+ * This method encapsulates all business logic for MFA status,
286
+ * ensuring consumer apps don't need to query databases or build responses manually.
287
+ *
288
+ * @param dto - Request DTO with user sub
289
+ * @returns Response DTO with complete MFA status
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * @Get('mfa/status')
294
+ * async getMFAStatus(@CurrentUser() user: IUser) {
295
+ * return await this.mfaService.getMFAStatus({ sub: user.sub });
296
+ * }
297
+ * ```
298
+ */
111
299
  async getMFAStatus(dto) {
300
+ // Get user entity with MFA-related fields
301
+ // Note: mfaExemptGrantedBy is intentionally excluded as it's sensitive admin information
112
302
  const userEntity = await this.userRepository.findOne({
113
303
  select: [
114
304
  'id',
@@ -125,18 +315,23 @@ class MFAService {
125
315
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
126
316
  }
127
317
  const enabled = userEntity.mfaEnabled || false;
318
+ // Get available methods (all registered & allowed methods)
128
319
  const availableMethodsResult = await this.getAvailableMethods({ sub: dto.sub });
320
+ // Add 'backup' to available methods if backup codes are enabled in config
129
321
  const finalAvailableMethods = [...availableMethodsResult.availableMethods];
130
322
  if (this.config?.mfa?.backup?.enabled) {
131
323
  if (!finalAvailableMethods.includes(mfa_method_enum_1.MFAMethod.BACKUP)) {
132
324
  finalAvailableMethods.push(mfa_method_enum_1.MFAMethod.BACKUP);
133
325
  }
134
326
  }
327
+ // Get user's configured devices
135
328
  const devicesResult = await this.getUserDevices({ sub: dto.sub });
136
329
  const configuredMethods = [
137
330
  ...new Set(devicesResult.devices.filter((d) => d.isActive).map((d) => d.type)),
138
331
  ];
332
+ // Determine if MFA is required based on config and user state
139
333
  const required = enabled && configuredMethods.length > 0;
334
+ // Check backup codes
140
335
  const hasBackupCodes = !!userEntity.backupCodes && userEntity.backupCodes.length > 0;
141
336
  return {
142
337
  enabled,
@@ -150,12 +345,43 @@ class MFAService {
150
345
  mfaExemptGrantedAt: userEntity.mfaExemptGrantedAt || null,
151
346
  };
152
347
  }
348
+ /**
349
+ * Remove MFA devices by method type
350
+ *
351
+ * Comprehensive method that handles all aspects of MFA device removal:
352
+ * - Looks up user by sub (consumer apps should pass user.sub from @CurrentUser())
353
+ * - Validates method type
354
+ * - Removes all active devices of the specified method type
355
+ * - Updates user's preferred method if the removed method was preferred
356
+ * - Updates device primary flags
357
+ * - Disables MFA if this was the last device
358
+ * - Creates MFA_SETUP_REQUIRED challenge if MFA enforcement requires it
359
+ *
360
+ * This method encapsulates all database operations related to MFA device removal,
361
+ * ensuring the consumer app doesn't need to directly manipulate nauth_* tables.
362
+ *
363
+ * @param dto - Request DTO with user sub and method type
364
+ * @returns Response DTO with deletedCount and whether MFA was disabled
365
+ * @throws {NAuthException} If user not found, invalid method type, or no devices found
366
+ *
367
+ * @example
368
+ * ```typescript
369
+ * // Consumer app controller
370
+ * @Delete('mfa/devices/:method')
371
+ * async removeMFAMethod(@CurrentUser() user: IUser, @Param('method') method: string) {
372
+ * const result = await this.mfaService.removeDevices({ userSub: user.sub, methodType: method });
373
+ * return { message: 'MFA method removed successfully', ...result };
374
+ * }
375
+ * ```
376
+ */
153
377
  async removeDevices(dto) {
378
+ // Validate method type
154
379
  const validMethods = [mfa_method_enum_1.MFAMethod.TOTP, mfa_method_enum_1.MFAMethod.SMS, mfa_method_enum_1.MFAMethod.EMAIL, mfa_method_enum_1.MFAMethod.PASSKEY];
155
380
  const normalizedMethod = dto.methodType.toLowerCase();
156
381
  if (!validMethods.includes(normalizedMethod)) {
157
382
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `Invalid MFA method: ${dto.methodType}. Valid methods are: ${validMethods.join(', ')}`);
158
383
  }
384
+ // Look up user by sub using repository directly (no AuthService dependency needed)
159
385
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.userSub } });
160
386
  if (!userEntity) {
161
387
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User entity not found');
@@ -164,29 +390,38 @@ class MFAService {
164
390
  if (!userId) {
165
391
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.INTERNAL_ERROR, 'User entity missing internal ID');
166
392
  }
393
+ // Cast to IUser for type safety
167
394
  const user = userEntity;
168
395
  const preferredMethod = userEntity.preferredMfaMethod;
169
396
  const isPreferredMethod = preferredMethod === normalizedMethod;
397
+ // Get all active devices for this user
170
398
  const devicesResult = await this.getUserDevices({ sub: dto.userSub });
171
399
  const activeDevices = devicesResult.devices.filter((d) => d.isActive);
400
+ // Get devices of the method type to remove
172
401
  const devicesToRemove = activeDevices.filter((d) => d.type.toLowerCase() === normalizedMethod);
173
402
  if (devicesToRemove.length === 0) {
174
403
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `No active ${normalizedMethod} MFA devices found for this user`);
175
404
  }
405
+ // Delete all devices of this method type
176
406
  let deletedCount = 0;
177
407
  for (const device of devicesToRemove) {
178
408
  const result = await this.mfaDeviceRepository.delete(device.id);
179
409
  deletedCount += result.affected || 0;
180
410
  }
411
+ // Check if any devices remain after removal
181
412
  const remainingDevicesResult = await this.getUserDevices({ sub: dto.userSub });
182
413
  const remainingActiveDevices = remainingDevicesResult.devices.filter((d) => d.isActive);
183
414
  let mfaDisabled = false;
415
+ // If no active devices remain, disable MFA for user
184
416
  if (remainingActiveDevices.length === 0) {
185
417
  userEntity.mfaEnabled = false;
186
418
  userEntity.mfaMethods = [];
187
419
  userEntity.preferredMfaMethod = null;
188
420
  await this.userRepository.save(userEntity);
189
421
  mfaDisabled = true;
422
+ // ============================================================================
423
+ // Audit: Record MFA disabled (all devices removed)
424
+ // ============================================================================
190
425
  if (this.auditService && this.clientInfoService) {
191
426
  try {
192
427
  await this.auditService?.recordEvent({
@@ -195,6 +430,7 @@ class MFAService {
195
430
  eventStatus: 'INFO',
196
431
  reason: 'all_devices_removed',
197
432
  description: 'MFA disabled - all devices removed',
433
+ // Client info automatically included from context
198
434
  metadata: {
199
435
  removedMethod: normalizedMethod,
200
436
  deletedCount,
@@ -202,6 +438,7 @@ class MFAService {
202
438
  });
203
439
  }
204
440
  catch (auditError) {
441
+ // Non-blocking: Log but continue
205
442
  const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
206
443
  this.logger?.error?.(`Failed to record MFA_DISABLED audit event: ${errorMessage}`, {
207
444
  error: auditError,
@@ -209,11 +446,13 @@ class MFAService {
209
446
  });
210
447
  }
211
448
  }
449
+ // Automatically create MFA_SETUP_REQUIRED challenge if MFA enforcement requires it
212
450
  if (this.challengeService && this.config?.mfa?.enabled) {
213
451
  const enforcement = this.config.mfa.enforcement || 'OPTIONAL';
214
452
  if (enforcement === 'REQUIRED' || enforcement === 'ADAPTIVE') {
215
453
  const user = userEntity;
216
454
  try {
455
+ // Client info (ipAddress, userAgent) automatically extracted from ClientInfoService
217
456
  await this.challengeService.createChallengeSession(user, auth_challenge_dto_1.AuthChallenge.MFA_SETUP_REQUIRED, {
218
457
  allowedMethods: this.config.mfa.allowedMethods || [],
219
458
  requiresSetup: true,
@@ -221,21 +460,26 @@ class MFAService {
221
460
  this.logger?.log?.(`Created MFA_SETUP_REQUIRED challenge for user ${user.sub} after MFA removal`);
222
461
  }
223
462
  catch (error) {
463
+ // Log but don't fail the removal if challenge creation fails
224
464
  this.logger?.warn?.(`Failed to create MFA_SETUP_REQUIRED challenge after MFA removal: ${error}`);
225
465
  }
226
466
  }
227
467
  }
228
468
  }
229
469
  else {
470
+ // Update mfaMethods array with remaining methods
230
471
  const remainingMethods = [...new Set(remainingActiveDevices.map((d) => d.type))];
231
472
  userEntity.mfaMethods = remainingMethods;
473
+ // If the removed method was preferred, update preferred method and device primary flags
232
474
  if (isPreferredMethod) {
233
475
  const newPreferredMethod = remainingActiveDevices[0].type;
234
476
  userEntity.preferredMfaMethod = newPreferredMethod;
235
477
  await this.userRepository.save(userEntity);
478
+ // Update device primary flags - set first remaining device as primary
236
479
  if (remainingActiveDevices[0].id) {
237
480
  await this.mfaDeviceRepository.update({ id: remainingActiveDevices[0].id }, { isPrimary: true });
238
481
  }
482
+ // Unset primary flag on other devices
239
483
  for (let i = 1; i < remainingActiveDevices.length; i++) {
240
484
  if (remainingActiveDevices[i].id) {
241
485
  await this.mfaDeviceRepository.update({ id: remainingActiveDevices[i].id }, { isPrimary: false });
@@ -244,9 +488,13 @@ class MFAService {
244
488
  this.logger?.log?.(`Updated preferred MFA method to ${newPreferredMethod} after removing ${normalizedMethod}`);
245
489
  }
246
490
  else {
491
+ // No preferred method change needed, just update mfaMethods
247
492
  await this.userRepository.save(userEntity);
248
493
  }
249
494
  }
495
+ // ============================================================================
496
+ // Audit: Record MFA device removal
497
+ // ============================================================================
250
498
  if (deletedCount > 0 && this.auditService && this.clientInfoService) {
251
499
  try {
252
500
  const user = userEntity;
@@ -260,9 +508,11 @@ class MFAService {
260
508
  remainingDevices: remainingActiveDevices.length,
261
509
  mfaDisabled,
262
510
  },
511
+ // Client info automatically included from context
263
512
  });
264
513
  }
265
514
  catch (auditError) {
515
+ // Non-blocking: Log but continue
266
516
  const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
267
517
  this.logger?.error?.(`Failed to record MFA_DEVICE_REMOVED audit event: ${errorMessage}`, {
268
518
  error: auditError,
@@ -273,12 +523,36 @@ class MFAService {
273
523
  }
274
524
  return { deletedCount, mfaDisabled };
275
525
  }
526
+ /**
527
+ * Set preferred MFA method for a user
528
+ *
529
+ * Updates the user's preferred MFA method and device primary flags.
530
+ * Validates that the method is configured for the user before setting it as preferred.
531
+ *
532
+ * This method encapsulates all database operations related to preferred method updates,
533
+ * ensuring the consumer app doesn't need to directly manipulate nauth_* tables.
534
+ *
535
+ * @param dto - Request DTO with user sub and method type
536
+ * @returns Response DTO with success message
537
+ * @throws {NAuthException} If user not found, invalid method type, or method not configured
538
+ *
539
+ * @example
540
+ * ```typescript
541
+ * // Consumer app controller
542
+ * @Put('mfa/preferred')
543
+ * async setPreferredMFAMethod(@CurrentUser() user: IUser, @Body() body: { method: string }) {
544
+ * return await this.mfaService.setPreferredMethod({ userSub: user.sub, methodType: body.method });
545
+ * }
546
+ * ```
547
+ */
276
548
  async setPreferredMethod(dto) {
549
+ // Validate method type
277
550
  const validMethods = [mfa_method_enum_1.MFAMethod.TOTP, mfa_method_enum_1.MFAMethod.SMS, mfa_method_enum_1.MFAMethod.EMAIL, mfa_method_enum_1.MFAMethod.PASSKEY];
278
551
  const normalizedMethod = dto.methodType.toLowerCase();
279
552
  if (!validMethods.includes(normalizedMethod)) {
280
553
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `Invalid MFA method: ${dto.methodType}. Valid methods are: ${validMethods.join(', ')}`);
281
554
  }
555
+ // Look up user by sub using repository directly (no AuthService dependency needed)
282
556
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.userSub } });
283
557
  if (!userEntity) {
284
558
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
@@ -287,20 +561,28 @@ class MFAService {
287
561
  if (!userId) {
288
562
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.INTERNAL_ERROR, 'User entity missing internal ID');
289
563
  }
564
+ // Cast to IUser for type safety
290
565
  const user = userEntity;
566
+ // Verify user has this method configured
291
567
  const devicesResult = await this.getUserDevices({ sub: dto.userSub });
568
+ // Normalize device types for comparison (database might store in different case)
292
569
  const preferredDevice = devicesResult.devices.find((d) => d.type.toLowerCase() === normalizedMethod && d.isActive);
293
570
  if (!preferredDevice) {
294
571
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `MFA method '${normalizedMethod}' is not configured for this user`);
295
572
  }
573
+ // Update user's preferred method directly via repository
296
574
  await this.userRepository.update({ id: userId }, {
297
575
  preferredMfaMethod: normalizedMethod,
298
576
  });
577
+ // Update device isPrimary flags: set preferred device as primary, unset others
299
578
  const activeDevices = devicesResult.devices.filter((d) => d.isActive);
300
579
  for (const device of activeDevices) {
301
580
  await this.mfaDeviceRepository.update({ id: device.id }, { isPrimary: device.id === preferredDevice.id });
302
581
  }
303
582
  this.logger?.log?.(`Device ${preferredDevice.id} set as primary for user ${dto.userSub}`);
583
+ // ============================================================================
584
+ // Audit: Record preferred MFA method update
585
+ // ============================================================================
304
586
  if (this.auditService && this.clientInfoService) {
305
587
  try {
306
588
  const previousMethod = userEntity.preferredMfaMethod;
@@ -309,6 +591,7 @@ class MFAService {
309
591
  eventType: auth_audit_event_type_enum_1.AuthAuditEventType.MFA_PREFERRED_METHOD_UPDATED,
310
592
  eventStatus: 'INFO',
311
593
  metadata: {
594
+ // Client info automatically included from context
312
595
  previousMethod: previousMethod || null,
313
596
  newMethod: normalizedMethod,
314
597
  deviceId: preferredDevice.id,
@@ -316,6 +599,7 @@ class MFAService {
316
599
  });
317
600
  }
318
601
  catch (auditError) {
602
+ // Non-blocking: Log but continue
319
603
  const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
320
604
  this.logger?.error?.(`Failed to record MFA_PREFERRED_METHOD_UPDATED audit event: ${errorMessage}`, {
321
605
  error: auditError,
@@ -328,22 +612,57 @@ class MFAService {
328
612
  message: 'Preferred method updated',
329
613
  };
330
614
  }
615
+ /**
616
+ * Grant or revoke a user's exemption from multi-factor authentication (MFA) requirements.
617
+ *
618
+ * SECURITY: This admin-only operation updates the user's MFA exemption status, logs the action,
619
+ * and records an audit event. MFA exemption bypasses MFA at login, but all other security controls remain enforced.
620
+ *
621
+ * @param dto - Request DTO with user sub, exempt flag, reason, and grantedBy
622
+ * @returns Response DTO with updated exemption fields
623
+ * @throws {NAuthException} If the user is not found
624
+ *
625
+ * @example
626
+ * ```typescript
627
+ * // Grant MFA exemption
628
+ * await mfaService.setMFAExemption({
629
+ * userSub: 'user-uuid',
630
+ * exempt: true,
631
+ * reason: 'Business partner requires MFA bypass',
632
+ * grantedBy: 'admin@example.com'
633
+ * });
634
+ *
635
+ * // Revoke MFA exemption
636
+ * await mfaService.setMFAExemption({
637
+ * userSub: 'user-uuid',
638
+ * exempt: false,
639
+ * reason: 'MFA now mandatory for this user',
640
+ * grantedBy: 'admin@example.com'
641
+ * });
642
+ * ```
643
+ */
331
644
  async setMFAExemption(dto) {
645
+ // Find user by sub (external identifier)
332
646
  const userEntity = await this.userRepository.findOne({ where: { sub: dto.userSub } });
333
647
  if (!userEntity) {
334
648
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.NOT_FOUND, 'User not found');
335
649
  }
336
650
  const user = userEntity;
651
+ // Prepare update
337
652
  const updateFields = {
338
653
  mfaExempt: dto.exempt,
339
654
  mfaExemptReason: dto.reason || null,
340
655
  mfaExemptGrantedAt: dto.exempt ? new Date() : null,
341
656
  mfaExemptGrantedBy: dto.exempt ? dto.grantedBy || null : null,
342
657
  };
658
+ // If revoking exemption and MFA is required, check if user needs to set up MFA
659
+ // Note: This is just for logging - actual MFA setup requirement is checked by state machine on next login
343
660
  if (!dto.exempt && userEntity.mfaExempt === true && !userEntity.mfaEnabled) {
344
661
  this.logger?.warn?.(`MFA exemption revoked for user ${dto.userSub} - MFA setup will be required on next login`);
345
662
  }
663
+ // Update user in database
346
664
  await this.userRepository.update(userEntity.id, updateFields);
665
+ // Log the exemption change for audit trail
347
666
  this.logger?.log?.(`MFA exemption ${dto.exempt ? 'granted' : 'revoked'} for user ${dto.userSub}`, {
348
667
  userSub: dto.userSub,
349
668
  exempt: dto.exempt,
@@ -351,6 +670,9 @@ class MFAService {
351
670
  grantedBy: dto.grantedBy || 'System',
352
671
  timestamp: new Date().toISOString(),
353
672
  });
673
+ // ============================================================================
674
+ // Audit: Record MFA exemption grant/revoke
675
+ // ============================================================================
354
676
  if (this.auditService && this.clientInfoService) {
355
677
  try {
356
678
  await this.auditService.recordEvent({
@@ -358,6 +680,7 @@ class MFAService {
358
680
  eventType: dto.exempt ? auth_audit_event_type_enum_1.AuthAuditEventType.MFA_EXEMPTION_GRANTED : auth_audit_event_type_enum_1.AuthAuditEventType.MFA_EXEMPTION_REVOKED,
359
681
  eventStatus: 'INFO',
360
682
  performedBy: dto.grantedBy || null,
683
+ // Client info automatically included from context
361
684
  reason: dto.reason || null,
362
685
  metadata: {
363
686
  previousExemptStatus: userEntity.mfaExempt,
@@ -366,6 +689,7 @@ class MFAService {
366
689
  });
367
690
  }
368
691
  catch (auditError) {
692
+ // Non-blocking: Log but continue
369
693
  const errorMessage = auditError instanceof Error ? auditError.message : 'Unknown error';
370
694
  this.logger?.error?.(`Failed to record MFA exemption audit event: ${errorMessage}`, {
371
695
  error: auditError,
@@ -373,6 +697,7 @@ class MFAService {
373
697
  });
374
698
  }
375
699
  }
700
+ // Fetch updated user to return exemption fields
376
701
  const exemptionData = await this.userRepository.findOne({
377
702
  where: { id: userEntity.id },
378
703
  select: ['mfaExempt', 'mfaExemptReason', 'mfaExemptGrantedAt'],
@@ -386,19 +711,51 @@ class MFAService {
386
711
  mfaExemptGrantedAt: exemptionData.mfaExemptGrantedAt || null,
387
712
  };
388
713
  }
714
+ /**
715
+ * Get MFA setup data during MFA_SETUP_REQUIRED challenge
716
+ *
717
+ * Returns provider-specific setup data:
718
+ * - TOTP: { secret, qrCode, manualEntryKey }
719
+ * - SMS: { maskedPhone } or error if phone required
720
+ * - Passkey: WebAuthn registration options
721
+ *
722
+ * @param dto - Request DTO with session token, method, and optional setup data
723
+ * @returns Response DTO with provider-specific setup data
724
+ * @throws {NAuthException} INVALID_CHALLENGE_SESSION | VALIDATION_FAILED | PHONE_REQUIRED
725
+ *
726
+ * @example
727
+ * ```typescript
728
+ * const result = await mfaService.getSetupData({
729
+ * session: 'session-token',
730
+ * method: 'totp'
731
+ * });
732
+ * // Returns: { setupData: { secret: '...', qrCode: '...', manualEntryKey: '...' } }
733
+ *
734
+ * const result = await mfaService.getSetupData({
735
+ * session: 'session-token',
736
+ * method: 'sms',
737
+ * setupData: { phoneNumber: '+1234567890' }
738
+ * });
739
+ * // Returns: { setupData: { maskedPhone: '***-***-7890' } }
740
+ * ```
741
+ */
389
742
  async getSetupData(dto) {
390
743
  if (!this.challengeService) {
391
744
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.INTERNAL_ERROR, 'Challenge service is not available');
392
745
  }
393
746
  this.logger?.debug?.(`Getting MFA setup data: session=${dto.session}, method=${dto.method}`);
747
+ // Validate session and ensure it's MFA_SETUP_REQUIRED
394
748
  const challengeSession = await this.challengeService.validateSession(dto.session);
395
749
  if (challengeSession.challengeName !== auth_challenge_dto_1.AuthChallenge.MFA_SETUP_REQUIRED) {
396
750
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `Cannot get setup data: expected MFA_SETUP_REQUIRED challenge, got ${challengeSession.challengeName}`);
397
751
  }
752
+ // Get user from session
398
753
  const user = challengeSession.user;
399
754
  if (!user) {
400
755
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, 'Challenge session has no associated user');
401
756
  }
757
+ // Get provider and call setup
758
+ // Pass challenge session ID in setupData so provider can link verification tokens
402
759
  const setupDataWithSession = {
403
760
  ...(dto.setupData || {}),
404
761
  challengeSessionId: challengeSession.id,
@@ -411,24 +768,47 @@ class MFAService {
411
768
  setupData: result,
412
769
  };
413
770
  }
771
+ /**
772
+ * Get MFA challenge data during MFA_REQUIRED challenge
773
+ *
774
+ * Currently only used for passkey authentication to get WebAuthn options.
775
+ * SMS/TOTP codes are sent automatically when the challenge is created.
776
+ *
777
+ * @param dto - Request DTO with session token and method
778
+ * @returns Response DTO with provider-specific challenge data
779
+ * @throws {NAuthException} INVALID_CHALLENGE_SESSION | VALIDATION_FAILED
780
+ *
781
+ * @example
782
+ * ```typescript
783
+ * const result = await mfaService.getChallengeData({
784
+ * session: 'session-token',
785
+ * method: 'passkey'
786
+ * });
787
+ * // Returns: { challengeData: { challenge: '...', allowCredentials: [...], ... } }
788
+ * ```
789
+ */
414
790
  async getChallengeData(dto) {
415
791
  if (!this.challengeService) {
416
792
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.INTERNAL_ERROR, 'Challenge service is not available');
417
793
  }
418
794
  this.logger?.debug?.(`Getting MFA challenge data: session=${dto.session}, method=${dto.method}`);
795
+ // Validate session and ensure it's MFA_REQUIRED
419
796
  const challengeSession = await this.challengeService.validateSession(dto.session);
420
797
  if (challengeSession.challengeName !== auth_challenge_dto_1.AuthChallenge.MFA_REQUIRED) {
421
798
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `Cannot get challenge data: expected MFA_REQUIRED challenge, got ${challengeSession.challengeName}`);
422
799
  }
800
+ // Get user from session
423
801
  const user = challengeSession.user;
424
802
  if (!user) {
425
803
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, 'Challenge session has no associated user');
426
804
  }
805
+ // Get provider and send challenge
427
806
  const provider = this.getProvider(dto.method);
428
807
  if (!provider.sendChallenge) {
429
808
  throw new nauth_exception_1.NAuthException(error_codes_enum_1.AuthErrorCode.VALIDATION_FAILED, `MFA method '${dto.method}' does not support challenge data generation`);
430
809
  }
431
810
  const challengeData = await provider.sendChallenge(user);
811
+ // For passkey, store the challenge in session metadata for verification
432
812
  if (dto.method === 'passkey') {
433
813
  const passkeyOptions = challengeData;
434
814
  const passkeyChallenge = passkeyOptions.options?.challenge;