@mulverse/mulguard-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (600) hide show
  1. package/README.md +24 -0
  2. package/adapters.d.ts +522 -0
  3. package/adapters.d.ts.map +1 -0
  4. package/adapters.js +170 -0
  5. package/errors.d.ts +429 -0
  6. package/errors.d.ts.map +1 -0
  7. package/errors.js +473 -0
  8. package/index.d.ts +547 -0
  9. package/index.d.ts.map +1 -0
  10. package/index.js +142 -0
  11. package/jwt.d.ts +132 -0
  12. package/jwt.d.ts.map +1 -0
  13. package/jwt.js +123 -0
  14. package/lib/actions/callback/handle-login.d.ts +35 -0
  15. package/lib/actions/callback/handle-login.d.ts.map +1 -0
  16. package/lib/actions/callback/handle-login.js +275 -0
  17. package/lib/actions/callback/index.d.ts +5 -0
  18. package/lib/actions/callback/index.d.ts.map +1 -0
  19. package/lib/actions/callback/index.js +409 -0
  20. package/lib/actions/callback/oauth/callback.d.ts +36 -0
  21. package/lib/actions/callback/oauth/callback.d.ts.map +1 -0
  22. package/lib/actions/callback/oauth/callback.js +248 -0
  23. package/lib/actions/callback/oauth/checks.d.ts +70 -0
  24. package/lib/actions/callback/oauth/checks.d.ts.map +1 -0
  25. package/lib/actions/callback/oauth/checks.js +188 -0
  26. package/lib/actions/callback/oauth/csrf-token.d.ts +33 -0
  27. package/lib/actions/callback/oauth/csrf-token.d.ts.map +1 -0
  28. package/lib/actions/callback/oauth/csrf-token.js +39 -0
  29. package/lib/actions/index.d.ts +6 -0
  30. package/lib/actions/index.d.ts.map +1 -0
  31. package/lib/actions/index.js +5 -0
  32. package/lib/actions/session.d.ts +5 -0
  33. package/lib/actions/session.d.ts.map +1 -0
  34. package/lib/actions/session.js +127 -0
  35. package/lib/actions/signin/authorization-url.d.ts +12 -0
  36. package/lib/actions/signin/authorization-url.d.ts.map +1 -0
  37. package/lib/actions/signin/authorization-url.js +94 -0
  38. package/lib/actions/signin/index.d.ts +4 -0
  39. package/lib/actions/signin/index.d.ts.map +1 -0
  40. package/lib/actions/signin/index.js +22 -0
  41. package/lib/actions/signin/send-token.d.ts +10 -0
  42. package/lib/actions/signin/send-token.d.ts.map +1 -0
  43. package/lib/actions/signin/send-token.js +98 -0
  44. package/lib/actions/signout.d.ts +11 -0
  45. package/lib/actions/signout.d.ts.map +1 -0
  46. package/lib/actions/signout.js +30 -0
  47. package/lib/actions/webauthn-options.d.ts +8 -0
  48. package/lib/actions/webauthn-options.d.ts.map +1 -0
  49. package/lib/actions/webauthn-options.js +60 -0
  50. package/lib/index.d.ts +2 -0
  51. package/lib/index.d.ts.map +1 -0
  52. package/lib/index.js +70 -0
  53. package/lib/init.d.ts +25 -0
  54. package/lib/init.d.ts.map +1 -0
  55. package/lib/init.js +172 -0
  56. package/lib/pages/error.d.ts +17 -0
  57. package/lib/pages/error.d.ts.map +1 -0
  58. package/lib/pages/error.js +40 -0
  59. package/lib/pages/index.d.ts +42 -0
  60. package/lib/pages/index.d.ts.map +1 -0
  61. package/lib/pages/index.js +136 -0
  62. package/lib/pages/signin.d.ts +10 -0
  63. package/lib/pages/signin.d.ts.map +1 -0
  64. package/lib/pages/signin.js +75 -0
  65. package/lib/pages/signout.d.ts +8 -0
  66. package/lib/pages/signout.d.ts.map +1 -0
  67. package/lib/pages/signout.js +17 -0
  68. package/lib/pages/styles.d.ts +3 -0
  69. package/lib/pages/styles.d.ts.map +1 -0
  70. package/lib/pages/styles.js +381 -0
  71. package/lib/pages/verify-request.d.ts +8 -0
  72. package/lib/pages/verify-request.d.ts.map +1 -0
  73. package/lib/pages/verify-request.js +11 -0
  74. package/lib/symbols.d.ts +50 -0
  75. package/lib/symbols.d.ts.map +1 -0
  76. package/lib/symbols.js +57 -0
  77. package/lib/utils/actions.d.ts +3 -0
  78. package/lib/utils/actions.d.ts.map +1 -0
  79. package/lib/utils/actions.js +14 -0
  80. package/lib/utils/assert.d.ts +14 -0
  81. package/lib/utils/assert.d.ts.map +1 -0
  82. package/lib/utils/assert.js +168 -0
  83. package/lib/utils/callback-url.d.ts +17 -0
  84. package/lib/utils/callback-url.d.ts.map +1 -0
  85. package/lib/utils/callback-url.js +27 -0
  86. package/lib/utils/cookie.d.ts +111 -0
  87. package/lib/utils/cookie.d.ts.map +1 -0
  88. package/lib/utils/cookie.js +205 -0
  89. package/lib/utils/date.d.ts +7 -0
  90. package/lib/utils/date.d.ts.map +1 -0
  91. package/lib/utils/date.js +8 -0
  92. package/lib/utils/email.d.ts +20 -0
  93. package/lib/utils/email.d.ts.map +1 -0
  94. package/lib/utils/email.js +57 -0
  95. package/lib/utils/env.d.ts +9 -0
  96. package/lib/utils/env.d.ts.map +1 -0
  97. package/lib/utils/env.js +96 -0
  98. package/lib/utils/logger.d.ts +18 -0
  99. package/lib/utils/logger.d.ts.map +1 -0
  100. package/lib/utils/logger.js +50 -0
  101. package/lib/utils/merge.d.ts +3 -0
  102. package/lib/utils/merge.d.ts.map +1 -0
  103. package/lib/utils/merge.js +23 -0
  104. package/lib/utils/providers.d.ts +19 -0
  105. package/lib/utils/providers.d.ts.map +1 -0
  106. package/lib/utils/providers.js +149 -0
  107. package/lib/utils/session.d.ts +7 -0
  108. package/lib/utils/session.d.ts.map +1 -0
  109. package/lib/utils/session.js +29 -0
  110. package/lib/utils/web.d.ts +10 -0
  111. package/lib/utils/web.d.ts.map +1 -0
  112. package/lib/utils/web.js +109 -0
  113. package/lib/utils/webauthn-client.d.ts +30 -0
  114. package/lib/utils/webauthn-client.d.ts.map +1 -0
  115. package/lib/utils/webauthn-client.js +197 -0
  116. package/lib/utils/webauthn-utils.d.ts +81 -0
  117. package/lib/utils/webauthn-utils.d.ts.map +1 -0
  118. package/lib/utils/webauthn-utils.js +343 -0
  119. package/lib/vendored/cookie.d.ts +120 -0
  120. package/lib/vendored/cookie.d.ts.map +1 -0
  121. package/lib/vendored/cookie.js +237 -0
  122. package/package.json +118 -0
  123. package/providers/42-school.d.ts +240 -0
  124. package/providers/42-school.d.ts.map +1 -0
  125. package/providers/42-school.js +78 -0
  126. package/providers/apple.d.ts +149 -0
  127. package/providers/apple.d.ts.map +1 -0
  128. package/providers/apple.js +104 -0
  129. package/providers/asgardeo.d.ts +102 -0
  130. package/providers/asgardeo.d.ts.map +1 -0
  131. package/providers/asgardeo.js +93 -0
  132. package/providers/atlassian.d.ts +94 -0
  133. package/providers/atlassian.d.ts.map +1 -0
  134. package/providers/atlassian.js +84 -0
  135. package/providers/auth0.d.ts +116 -0
  136. package/providers/auth0.d.ts.map +1 -0
  137. package/providers/auth0.js +49 -0
  138. package/providers/authentik.d.ts +90 -0
  139. package/providers/authentik.d.ts.map +1 -0
  140. package/providers/authentik.js +65 -0
  141. package/providers/azure-ad-b2c.d.ts +104 -0
  142. package/providers/azure-ad-b2c.d.ts.map +1 -0
  143. package/providers/azure-ad-b2c.js +100 -0
  144. package/providers/azure-ad.d.ts +19 -0
  145. package/providers/azure-ad.d.ts.map +1 -0
  146. package/providers/azure-ad.js +23 -0
  147. package/providers/azure-devops.d.ts +128 -0
  148. package/providers/azure-devops.d.ts.map +1 -0
  149. package/providers/azure-devops.js +158 -0
  150. package/providers/bankid-no.d.ts +134 -0
  151. package/providers/bankid-no.d.ts.map +1 -0
  152. package/providers/bankid-no.js +65 -0
  153. package/providers/battlenet.d.ts +85 -0
  154. package/providers/battlenet.d.ts.map +1 -0
  155. package/providers/battlenet.js +81 -0
  156. package/providers/beyondidentity.d.ts +77 -0
  157. package/providers/beyondidentity.d.ts.map +1 -0
  158. package/providers/beyondidentity.js +84 -0
  159. package/providers/bitbucket.d.ts +89 -0
  160. package/providers/bitbucket.d.ts.map +1 -0
  161. package/providers/bitbucket.js +92 -0
  162. package/providers/box.d.ts +63 -0
  163. package/providers/box.d.ts.map +1 -0
  164. package/providers/box.js +73 -0
  165. package/providers/boxyhq-saml.d.ts +121 -0
  166. package/providers/boxyhq-saml.d.ts.map +1 -0
  167. package/providers/boxyhq-saml.js +127 -0
  168. package/providers/bungie.d.ts +167 -0
  169. package/providers/bungie.d.ts.map +1 -0
  170. package/providers/bungie.js +174 -0
  171. package/providers/click-up.d.ts +75 -0
  172. package/providers/click-up.d.ts.map +1 -0
  173. package/providers/click-up.js +89 -0
  174. package/providers/cognito.d.ts +81 -0
  175. package/providers/cognito.d.ts.map +1 -0
  176. package/providers/cognito.js +73 -0
  177. package/providers/coinbase.d.ts +69 -0
  178. package/providers/coinbase.d.ts.map +1 -0
  179. package/providers/coinbase.js +78 -0
  180. package/providers/concept2.d.ts +81 -0
  181. package/providers/concept2.d.ts.map +1 -0
  182. package/providers/concept2.js +86 -0
  183. package/providers/credentials.d.ts +132 -0
  184. package/providers/credentials.d.ts.map +1 -0
  185. package/providers/credentials.js +74 -0
  186. package/providers/descope.d.ts +91 -0
  187. package/providers/descope.d.ts.map +1 -0
  188. package/providers/descope.js +78 -0
  189. package/providers/discord.d.ts +139 -0
  190. package/providers/discord.d.ts.map +1 -0
  191. package/providers/discord.js +86 -0
  192. package/providers/dribbble.d.ts +88 -0
  193. package/providers/dribbble.d.ts.map +1 -0
  194. package/providers/dribbble.js +85 -0
  195. package/providers/dropbox.d.ts +65 -0
  196. package/providers/dropbox.d.ts.map +1 -0
  197. package/providers/dropbox.js +88 -0
  198. package/providers/duende-identity-server6.d.ts +91 -0
  199. package/providers/duende-identity-server6.d.ts.map +1 -0
  200. package/providers/duende-identity-server6.js +80 -0
  201. package/providers/email.d.ts +41 -0
  202. package/providers/email.d.ts.map +1 -0
  203. package/providers/email.js +18 -0
  204. package/providers/eventbrite.d.ts +78 -0
  205. package/providers/eventbrite.d.ts.map +1 -0
  206. package/providers/eventbrite.js +88 -0
  207. package/providers/eveonline.d.ts +94 -0
  208. package/providers/eveonline.d.ts.map +1 -0
  209. package/providers/eveonline.js +92 -0
  210. package/providers/facebook.d.ts +84 -0
  211. package/providers/facebook.d.ts.map +1 -0
  212. package/providers/facebook.js +93 -0
  213. package/providers/faceit.d.ts +64 -0
  214. package/providers/faceit.d.ts.map +1 -0
  215. package/providers/faceit.js +74 -0
  216. package/providers/figma.d.ts +75 -0
  217. package/providers/figma.d.ts.map +1 -0
  218. package/providers/figma.js +81 -0
  219. package/providers/forwardemail.d.ts +4 -0
  220. package/providers/forwardemail.d.ts.map +1 -0
  221. package/providers/forwardemail.js +32 -0
  222. package/providers/foursquare.d.ts +71 -0
  223. package/providers/foursquare.d.ts.map +1 -0
  224. package/providers/foursquare.js +91 -0
  225. package/providers/freshbooks.d.ts +66 -0
  226. package/providers/freshbooks.d.ts.map +1 -0
  227. package/providers/freshbooks.js +76 -0
  228. package/providers/frontegg.d.ts +95 -0
  229. package/providers/frontegg.d.ts.map +1 -0
  230. package/providers/frontegg.js +88 -0
  231. package/providers/fusionauth.d.ts +279 -0
  232. package/providers/fusionauth.d.ts.map +1 -0
  233. package/providers/fusionauth.js +292 -0
  234. package/providers/github.d.ts +127 -0
  235. package/providers/github.d.ts.map +1 -0
  236. package/providers/github.js +115 -0
  237. package/providers/gitlab.d.ts +115 -0
  238. package/providers/gitlab.d.ts.map +1 -0
  239. package/providers/gitlab.js +75 -0
  240. package/providers/google.d.ts +138 -0
  241. package/providers/google.d.ts.map +1 -0
  242. package/providers/google.js +119 -0
  243. package/providers/hubspot.d.ts +76 -0
  244. package/providers/hubspot.d.ts.map +1 -0
  245. package/providers/hubspot.js +93 -0
  246. package/providers/huggingface.d.ts +216 -0
  247. package/providers/huggingface.d.ts.map +1 -0
  248. package/providers/huggingface.js +101 -0
  249. package/providers/identity-server4.d.ts +69 -0
  250. package/providers/identity-server4.d.ts.map +1 -0
  251. package/providers/identity-server4.js +64 -0
  252. package/providers/index.d.ts +61 -0
  253. package/providers/index.d.ts.map +1 -0
  254. package/providers/index.js +3 -0
  255. package/providers/instagram.d.ts +74 -0
  256. package/providers/instagram.d.ts.map +1 -0
  257. package/providers/instagram.js +87 -0
  258. package/providers/kakao.d.ts +148 -0
  259. package/providers/kakao.d.ts.map +1 -0
  260. package/providers/kakao.js +103 -0
  261. package/providers/keycloak.d.ts +100 -0
  262. package/providers/keycloak.d.ts.map +1 -0
  263. package/providers/keycloak.js +73 -0
  264. package/providers/kinde.d.ts +73 -0
  265. package/providers/kinde.d.ts.map +1 -0
  266. package/providers/kinde.js +51 -0
  267. package/providers/line.d.ts +83 -0
  268. package/providers/line.d.ts.map +1 -0
  269. package/providers/line.js +73 -0
  270. package/providers/linkedin.d.ts +77 -0
  271. package/providers/linkedin.d.ts.map +1 -0
  272. package/providers/linkedin.js +65 -0
  273. package/providers/logto.d.ts +98 -0
  274. package/providers/logto.d.ts.map +1 -0
  275. package/providers/logto.js +81 -0
  276. package/providers/loops.d.ts +40 -0
  277. package/providers/loops.d.ts.map +1 -0
  278. package/providers/loops.js +59 -0
  279. package/providers/mailchimp.d.ts +66 -0
  280. package/providers/mailchimp.d.ts.map +1 -0
  281. package/providers/mailchimp.js +76 -0
  282. package/providers/mailgun.d.ts +55 -0
  283. package/providers/mailgun.d.ts.map +1 -0
  284. package/providers/mailgun.js +74 -0
  285. package/providers/mailru.d.ts +63 -0
  286. package/providers/mailru.d.ts.map +1 -0
  287. package/providers/mailru.js +61 -0
  288. package/providers/mastodon.d.ts +90 -0
  289. package/providers/mastodon.d.ts.map +1 -0
  290. package/providers/mastodon.js +75 -0
  291. package/providers/mattermost.d.ts +132 -0
  292. package/providers/mattermost.d.ts.map +1 -0
  293. package/providers/mattermost.js +83 -0
  294. package/providers/medium.d.ts +68 -0
  295. package/providers/medium.d.ts.map +1 -0
  296. package/providers/medium.js +84 -0
  297. package/providers/microsoft-entra-id.d.ts +428 -0
  298. package/providers/microsoft-entra-id.d.ts.map +1 -0
  299. package/providers/microsoft-entra-id.js +156 -0
  300. package/providers/naver.d.ts +80 -0
  301. package/providers/naver.d.ts.map +1 -0
  302. package/providers/naver.js +79 -0
  303. package/providers/netlify.d.ts +66 -0
  304. package/providers/netlify.d.ts.map +1 -0
  305. package/providers/netlify.js +85 -0
  306. package/providers/netsuite.d.ts +189 -0
  307. package/providers/netsuite.d.ts.map +1 -0
  308. package/providers/netsuite.js +170 -0
  309. package/providers/nextcloud.d.ts +150 -0
  310. package/providers/nextcloud.d.ts.map +1 -0
  311. package/providers/nextcloud.js +99 -0
  312. package/providers/nodemailer.d.ts +27 -0
  313. package/providers/nodemailer.d.ts.map +1 -0
  314. package/providers/nodemailer.js +34 -0
  315. package/providers/notion.d.ts +99 -0
  316. package/providers/notion.d.ts.map +1 -0
  317. package/providers/notion.js +110 -0
  318. package/providers/oauth.d.ts +188 -0
  319. package/providers/oauth.d.ts.map +1 -0
  320. package/providers/oauth.js +1 -0
  321. package/providers/okta.d.ts +99 -0
  322. package/providers/okta.d.ts.map +1 -0
  323. package/providers/okta.js +63 -0
  324. package/providers/onelogin.d.ts +65 -0
  325. package/providers/onelogin.d.ts.map +1 -0
  326. package/providers/onelogin.js +61 -0
  327. package/providers/ory-hydra.d.ts +79 -0
  328. package/providers/ory-hydra.d.ts.map +1 -0
  329. package/providers/ory-hydra.js +67 -0
  330. package/providers/osso.d.ts +79 -0
  331. package/providers/osso.d.ts.map +1 -0
  332. package/providers/osso.js +77 -0
  333. package/providers/osu.d.ts +116 -0
  334. package/providers/osu.d.ts.map +1 -0
  335. package/providers/osu.js +75 -0
  336. package/providers/passage.d.ts +88 -0
  337. package/providers/passage.d.ts.map +1 -0
  338. package/providers/passage.js +75 -0
  339. package/providers/passkey.d.ts +65 -0
  340. package/providers/passkey.d.ts.map +1 -0
  341. package/providers/passkey.js +87 -0
  342. package/providers/patreon.d.ts +73 -0
  343. package/providers/patreon.d.ts.map +1 -0
  344. package/providers/patreon.js +77 -0
  345. package/providers/ping-id.d.ts +57 -0
  346. package/providers/ping-id.d.ts.map +1 -0
  347. package/providers/ping-id.js +40 -0
  348. package/providers/pinterest.d.ts +79 -0
  349. package/providers/pinterest.d.ts.map +1 -0
  350. package/providers/pinterest.js +85 -0
  351. package/providers/pipedrive.d.ts +99 -0
  352. package/providers/pipedrive.d.ts.map +1 -0
  353. package/providers/pipedrive.js +71 -0
  354. package/providers/postmark.d.ts +4 -0
  355. package/providers/postmark.d.ts.map +1 -0
  356. package/providers/postmark.js +36 -0
  357. package/providers/provider-types.d.ts +3 -0
  358. package/providers/provider-types.d.ts.map +1 -0
  359. package/providers/provider-types.js +1 -0
  360. package/providers/reddit.d.ts +88 -0
  361. package/providers/reddit.d.ts.map +1 -0
  362. package/providers/reddit.js +90 -0
  363. package/providers/resend.d.ts +4 -0
  364. package/providers/resend.d.ts.map +1 -0
  365. package/providers/resend.js +32 -0
  366. package/providers/roblox.d.ts +67 -0
  367. package/providers/roblox.d.ts.map +1 -0
  368. package/providers/roblox.js +53 -0
  369. package/providers/salesforce.d.ts +59 -0
  370. package/providers/salesforce.d.ts.map +1 -0
  371. package/providers/salesforce.js +52 -0
  372. package/providers/sendgrid.d.ts +4 -0
  373. package/providers/sendgrid.d.ts.map +1 -0
  374. package/providers/sendgrid.js +35 -0
  375. package/providers/simplelogin.d.ts +87 -0
  376. package/providers/simplelogin.d.ts.map +1 -0
  377. package/providers/simplelogin.js +83 -0
  378. package/providers/slack.d.ts +102 -0
  379. package/providers/slack.d.ts.map +1 -0
  380. package/providers/slack.js +69 -0
  381. package/providers/spotify.d.ts +75 -0
  382. package/providers/spotify.d.ts.map +1 -0
  383. package/providers/spotify.js +73 -0
  384. package/providers/strava.d.ts +68 -0
  385. package/providers/strava.d.ts.map +1 -0
  386. package/providers/strava.js +80 -0
  387. package/providers/threads.d.ts +108 -0
  388. package/providers/threads.d.ts.map +1 -0
  389. package/providers/threads.js +89 -0
  390. package/providers/tiktok.d.ts +248 -0
  391. package/providers/tiktok.d.ts.map +1 -0
  392. package/providers/tiktok.js +195 -0
  393. package/providers/todoist.d.ts +76 -0
  394. package/providers/todoist.d.ts.map +1 -0
  395. package/providers/todoist.js +97 -0
  396. package/providers/trakt.d.ts +93 -0
  397. package/providers/trakt.d.ts.map +1 -0
  398. package/providers/trakt.js +91 -0
  399. package/providers/twitch.d.ts +71 -0
  400. package/providers/twitch.d.ts.map +1 -0
  401. package/providers/twitch.js +96 -0
  402. package/providers/twitter.d.ts +183 -0
  403. package/providers/twitter.d.ts.map +1 -0
  404. package/providers/twitter.js +100 -0
  405. package/providers/united-effects.d.ts +80 -0
  406. package/providers/united-effects.d.ts.map +1 -0
  407. package/providers/united-effects.js +72 -0
  408. package/providers/vipps.d.ts +71 -0
  409. package/providers/vipps.d.ts.map +1 -0
  410. package/providers/vipps.js +33 -0
  411. package/providers/vk.d.ts +334 -0
  412. package/providers/vk.d.ts.map +1 -0
  413. package/providers/vk.js +103 -0
  414. package/providers/webauthn.d.ts +148 -0
  415. package/providers/webauthn.d.ts.map +1 -0
  416. package/providers/webauthn.js +128 -0
  417. package/providers/webex.d.ts +78 -0
  418. package/providers/webex.d.ts.map +1 -0
  419. package/providers/webex.js +73 -0
  420. package/providers/wechat.d.ts +78 -0
  421. package/providers/wechat.d.ts.map +1 -0
  422. package/providers/wechat.js +105 -0
  423. package/providers/wikimedia.d.ts +99 -0
  424. package/providers/wikimedia.d.ts.map +1 -0
  425. package/providers/wikimedia.js +90 -0
  426. package/providers/wordpress.d.ts +65 -0
  427. package/providers/wordpress.d.ts.map +1 -0
  428. package/providers/wordpress.js +71 -0
  429. package/providers/workos.d.ts +154 -0
  430. package/providers/workos.d.ts.map +1 -0
  431. package/providers/workos.js +143 -0
  432. package/providers/yandex.d.ts +131 -0
  433. package/providers/yandex.d.ts.map +1 -0
  434. package/providers/yandex.js +80 -0
  435. package/providers/zitadel.d.ts +117 -0
  436. package/providers/zitadel.d.ts.map +1 -0
  437. package/providers/zitadel.js +95 -0
  438. package/providers/zoho.d.ts +63 -0
  439. package/providers/zoho.d.ts.map +1 -0
  440. package/providers/zoho.js +79 -0
  441. package/providers/zoom.d.ts +93 -0
  442. package/providers/zoom.d.ts.map +1 -0
  443. package/providers/zoom.js +82 -0
  444. package/src/adapters/server-actions-helpers.ts +126 -0
  445. package/src/adapters.ts +603 -0
  446. package/src/errors.ts +551 -0
  447. package/src/index.ts +689 -0
  448. package/src/jwt.ts +283 -0
  449. package/src/lib/actions/callback/handle-login.ts +334 -0
  450. package/src/lib/actions/callback/index.ts +554 -0
  451. package/src/lib/actions/callback/oauth/callback.ts +347 -0
  452. package/src/lib/actions/callback/oauth/checks.ts +258 -0
  453. package/src/lib/actions/callback/oauth/csrf-token.ts +60 -0
  454. package/src/lib/actions/index.ts +5 -0
  455. package/src/lib/actions/session.ts +167 -0
  456. package/src/lib/actions/signin/authorization-url.ts +123 -0
  457. package/src/lib/actions/signin/index.ts +37 -0
  458. package/src/lib/actions/signin/send-token.ts +124 -0
  459. package/src/lib/actions/signout.ts +38 -0
  460. package/src/lib/actions/webauthn-options.ts +100 -0
  461. package/src/lib/index.ts +97 -0
  462. package/src/lib/init.ts +236 -0
  463. package/src/lib/pages/error.tsx +106 -0
  464. package/src/lib/pages/index.ts +181 -0
  465. package/src/lib/pages/signin.tsx +255 -0
  466. package/src/lib/pages/signout.tsx +49 -0
  467. package/src/lib/pages/styles.css +377 -0
  468. package/src/lib/pages/styles.ts +381 -0
  469. package/src/lib/pages/verify-request.tsx +36 -0
  470. package/src/lib/symbols.ts +60 -0
  471. package/src/lib/utils/actions.ts +17 -0
  472. package/src/lib/utils/assert.ts +259 -0
  473. package/src/lib/utils/callback-url.ts +42 -0
  474. package/src/lib/utils/cookie.ts +248 -0
  475. package/src/lib/utils/date.ts +8 -0
  476. package/src/lib/utils/email.ts +65 -0
  477. package/src/lib/utils/env.ts +113 -0
  478. package/src/lib/utils/logger.ts +75 -0
  479. package/src/lib/utils/merge.ts +30 -0
  480. package/src/lib/utils/providers.ts +203 -0
  481. package/src/lib/utils/session.ts +41 -0
  482. package/src/lib/utils/web.ts +151 -0
  483. package/src/lib/utils/webauthn-client.js +229 -0
  484. package/src/lib/utils/webauthn-utils.ts +531 -0
  485. package/src/lib/vendored/cookie.ts +383 -0
  486. package/src/providers/42-school.ts +256 -0
  487. package/src/providers/apple.ts +206 -0
  488. package/src/providers/asgardeo.ts +118 -0
  489. package/src/providers/atlassian.ts +120 -0
  490. package/src/providers/auth0.ts +127 -0
  491. package/src/providers/authentik.ts +100 -0
  492. package/src/providers/azure-ad-b2c.ts +124 -0
  493. package/src/providers/azure-ad.ts +30 -0
  494. package/src/providers/azure-devops.ts +184 -0
  495. package/src/providers/bankid-no.ts +161 -0
  496. package/src/providers/battlenet.ts +107 -0
  497. package/src/providers/beyondidentity.ts +102 -0
  498. package/src/providers/bitbucket.ts +122 -0
  499. package/src/providers/box.ts +87 -0
  500. package/src/providers/boxyhq-saml.ts +148 -0
  501. package/src/providers/bungie.ts +192 -0
  502. package/src/providers/click-up.ts +104 -0
  503. package/src/providers/cognito.ts +94 -0
  504. package/src/providers/coinbase.ts +93 -0
  505. package/src/providers/concept2.ts +108 -0
  506. package/src/providers/credentials.ts +157 -0
  507. package/src/providers/descope.ts +105 -0
  508. package/src/providers/discord.ts +176 -0
  509. package/src/providers/dribbble.ts +122 -0
  510. package/src/providers/dropbox.ts +102 -0
  511. package/src/providers/duende-identity-server6.ts +101 -0
  512. package/src/providers/email.ts +60 -0
  513. package/src/providers/eventbrite.ts +105 -0
  514. package/src/providers/eveonline.ts +117 -0
  515. package/src/providers/facebook.ts +119 -0
  516. package/src/providers/faceit.ts +90 -0
  517. package/src/providers/figma.ts +105 -0
  518. package/src/providers/forwardemail.ts +37 -0
  519. package/src/providers/foursquare.ts +105 -0
  520. package/src/providers/freshbooks.ts +90 -0
  521. package/src/providers/frontegg.ts +111 -0
  522. package/src/providers/fusionauth.ts +336 -0
  523. package/src/providers/github.ts +187 -0
  524. package/src/providers/gitlab.ts +140 -0
  525. package/src/providers/google.ts +152 -0
  526. package/src/providers/hubspot.ts +117 -0
  527. package/src/providers/huggingface.ts +234 -0
  528. package/src/providers/identity-server4.ts +78 -0
  529. package/src/providers/index.ts +115 -0
  530. package/src/providers/instagram.ts +103 -0
  531. package/src/providers/kakao.ts +184 -0
  532. package/src/providers/keycloak.ts +111 -0
  533. package/src/providers/kinde.ts +85 -0
  534. package/src/providers/line.ts +99 -0
  535. package/src/providers/linkedin.ts +91 -0
  536. package/src/providers/logto.ts +122 -0
  537. package/src/providers/loops.ts +79 -0
  538. package/src/providers/mailchimp.ts +90 -0
  539. package/src/providers/mailgun.ts +98 -0
  540. package/src/providers/mailru.ts +75 -0
  541. package/src/providers/mastodon.ts +112 -0
  542. package/src/providers/mattermost.ts +154 -0
  543. package/src/providers/medium.ts +89 -0
  544. package/src/providers/microsoft-entra-id.ts +497 -0
  545. package/src/providers/naver.ts +102 -0
  546. package/src/providers/netlify.ts +90 -0
  547. package/src/providers/netsuite.ts +225 -0
  548. package/src/providers/nextcloud.ts +207 -0
  549. package/src/providers/nodemailer.ts +84 -0
  550. package/src/providers/notion.ts +166 -0
  551. package/src/providers/oauth.ts +310 -0
  552. package/src/providers/okta.ts +111 -0
  553. package/src/providers/onelogin.ts +75 -0
  554. package/src/providers/ory-hydra.ts +93 -0
  555. package/src/providers/osso.ts +91 -0
  556. package/src/providers/osu.ts +138 -0
  557. package/src/providers/passage.ts +103 -0
  558. package/src/providers/passkey.ts +94 -0
  559. package/src/providers/patreon.ts +98 -0
  560. package/src/providers/ping-id.ts +68 -0
  561. package/src/providers/pinterest.ts +106 -0
  562. package/src/providers/pipedrive.ts +120 -0
  563. package/src/providers/postmark.ts +38 -0
  564. package/src/providers/provider-types.ts +107 -0
  565. package/src/providers/reddit.ts +104 -0
  566. package/src/providers/resend.ts +35 -0
  567. package/src/providers/roblox.ts +94 -0
  568. package/src/providers/salesforce.ts +73 -0
  569. package/src/providers/sendgrid.ts +36 -0
  570. package/src/providers/simplelogin.ts +107 -0
  571. package/src/providers/slack.ts +115 -0
  572. package/src/providers/spotify.ts +99 -0
  573. package/src/providers/strava.ts +101 -0
  574. package/src/providers/threads.ts +135 -0
  575. package/src/providers/tiktok.ts +319 -0
  576. package/src/providers/todoist.ts +122 -0
  577. package/src/providers/trakt.ts +120 -0
  578. package/src/providers/twitch.ts +121 -0
  579. package/src/providers/twitter.ts +207 -0
  580. package/src/providers/united-effects.ts +89 -0
  581. package/src/providers/vipps.ts +86 -0
  582. package/src/providers/vk.ts +401 -0
  583. package/src/providers/webauthn.ts +296 -0
  584. package/src/providers/webex.ts +102 -0
  585. package/src/providers/wechat.ts +141 -0
  586. package/src/providers/wikimedia.ts +258 -0
  587. package/src/providers/wordpress.ts +86 -0
  588. package/src/providers/workos.ts +180 -0
  589. package/src/providers/yandex.ts +159 -0
  590. package/src/providers/zitadel.ts +128 -0
  591. package/src/providers/zoho.ts +84 -0
  592. package/src/providers/zoom.ts +119 -0
  593. package/src/types.ts +430 -0
  594. package/src/warnings.ts +21 -0
  595. package/types.d.ts +309 -0
  596. package/types.d.ts.map +1 -0
  597. package/types.js +53 -0
  598. package/warnings.d.ts +17 -0
  599. package/warnings.d.ts.map +1 -0
  600. package/warnings.js +1 -0
@@ -0,0 +1,167 @@
1
+ import { JWTSessionError, SessionTokenError } from "../../errors.js"
2
+ import { fromDate } from "../utils/date.js"
3
+
4
+ import type { Adapter } from "../../adapters.js"
5
+ import type { InternalOptions, ResponseInternal, Session } from "../../types.js"
6
+ import type { Cookie, SessionStore } from "../utils/cookie.js"
7
+
8
+ /** Return a session object filtered via `callbacks.session` */
9
+ export async function session(
10
+ options: InternalOptions,
11
+ sessionStore: SessionStore,
12
+ cookies: Cookie[],
13
+ isUpdate?: boolean,
14
+ newSession?: any
15
+ ): Promise<ResponseInternal<Session | null>> {
16
+ const {
17
+ adapter,
18
+ jwt,
19
+ events,
20
+ callbacks,
21
+ logger,
22
+ session: { strategy: sessionStrategy, maxAge: sessionMaxAge },
23
+ } = options
24
+
25
+ const response: ResponseInternal<Session | null> = {
26
+ body: null,
27
+ headers: {
28
+ "Content-Type": "application/json",
29
+ ...(!isUpdate && {
30
+ "Cache-Control": "private, no-cache, no-store",
31
+ Expires: "0",
32
+ Pragma: "no-cache",
33
+ }),
34
+ },
35
+ cookies,
36
+ }
37
+
38
+ const sessionToken = sessionStore.value
39
+
40
+ if (!sessionToken) return response
41
+
42
+ if (sessionStrategy === "jwt") {
43
+ try {
44
+ const salt = options.cookies.sessionToken.name
45
+ const payload = await jwt.decode({ ...jwt, token: sessionToken, salt })
46
+
47
+ if (!payload) throw new Error("Invalid JWT")
48
+
49
+ // @ts-expect-error
50
+ const token = await callbacks.jwt({
51
+ token: payload,
52
+ ...(isUpdate && { trigger: "update" }),
53
+ session: newSession,
54
+ })
55
+
56
+ const newExpires = fromDate(sessionMaxAge)
57
+
58
+ if (token !== null) {
59
+ // By default, only exposes a limited subset of information to the client
60
+ // as needed for presentation purposes (e.g. "you are logged in as...").
61
+ const session = {
62
+ user: { name: token.name, email: token.email, image: token.picture },
63
+ expires: newExpires.toISOString(),
64
+ }
65
+ // @ts-expect-error
66
+ const newSession = await callbacks.session({ session, token })
67
+
68
+ // Return session payload as response
69
+ response.body = newSession
70
+
71
+ // Refresh JWT expiry by re-signing it, with an updated expiry date
72
+ const newToken = await jwt.encode({ ...jwt, token, salt })
73
+
74
+ // Set cookie, to also update expiry date on cookie
75
+ const sessionCookies = sessionStore.chunk(newToken, {
76
+ expires: newExpires,
77
+ })
78
+
79
+ response.cookies?.push(...sessionCookies)
80
+
81
+ await events.session?.({ session: newSession, token })
82
+ } else {
83
+ response.cookies?.push(...sessionStore.clean())
84
+ }
85
+ } catch (e) {
86
+ logger.error(new JWTSessionError(e as Error))
87
+ // If the JWT is not verifiable remove the broken session cookie(s).
88
+ response.cookies?.push(...sessionStore.clean())
89
+ }
90
+
91
+ return response
92
+ }
93
+
94
+ // Retrieve session from database
95
+ try {
96
+ const { getSessionAndUser, deleteSession, updateSession } =
97
+ adapter as Required<Adapter>
98
+ let userAndSession = await getSessionAndUser(sessionToken)
99
+
100
+ // If session has expired, clean up the database
101
+ if (
102
+ userAndSession &&
103
+ userAndSession.session.expires.valueOf() < Date.now()
104
+ ) {
105
+ await deleteSession(sessionToken)
106
+ userAndSession = null
107
+ }
108
+
109
+ if (userAndSession) {
110
+ const { user, session } = userAndSession
111
+
112
+ const sessionUpdateAge = options.session.updateAge
113
+ // Calculate last updated date to throttle write updates to database
114
+ // Formula: ({expiry date} - sessionMaxAge) + sessionUpdateAge
115
+ // e.g. ({expiry date} - 30 days) + 1 hour
116
+ const sessionIsDueToBeUpdatedDate =
117
+ session.expires.valueOf() -
118
+ sessionMaxAge * 1000 +
119
+ sessionUpdateAge * 1000
120
+
121
+ const newExpires = fromDate(sessionMaxAge)
122
+ // Trigger update of session expiry date and write to database, only
123
+ // if the session was last updated more than {sessionUpdateAge} ago
124
+ if (sessionIsDueToBeUpdatedDate <= Date.now()) {
125
+ await updateSession({
126
+ sessionToken: sessionToken,
127
+ expires: newExpires,
128
+ })
129
+ }
130
+
131
+ // Pass Session through to the session callback
132
+ const sessionPayload = await callbacks.session({
133
+ // TODO: user already passed below,
134
+ // remove from session object in https://github.com/nextauthjs/next-auth/pull/9702
135
+ // @ts-expect-error
136
+ session: { ...session, user },
137
+ user,
138
+ newSession,
139
+ ...(isUpdate ? { trigger: "update" } : {}),
140
+ })
141
+
142
+ // Return session payload as response
143
+ response.body = sessionPayload
144
+
145
+ // Set cookie again to update expiry
146
+ response.cookies?.push({
147
+ name: options.cookies.sessionToken.name,
148
+ value: sessionToken,
149
+ options: {
150
+ ...options.cookies.sessionToken.options,
151
+ expires: newExpires,
152
+ },
153
+ })
154
+
155
+ // @ts-expect-error
156
+ await events.session?.({ session: sessionPayload })
157
+ } else if (sessionToken) {
158
+ // If `sessionToken` was found set but it's not valid for a session then
159
+ // remove the sessionToken cookie from browser.
160
+ response.cookies?.push(...sessionStore.clean())
161
+ }
162
+ } catch (e) {
163
+ logger.error(new SessionTokenError(e as Error))
164
+ }
165
+
166
+ return response
167
+ }
@@ -0,0 +1,123 @@
1
+ import * as checks from "../callback/oauth/checks.js"
2
+ import * as o from "oauth4webapi"
3
+
4
+ import type { InternalOptions, RequestInternal } from "../../../types.js"
5
+ import type { Cookie } from "../../utils/cookie.js"
6
+ import { customFetch } from "../../symbols.js"
7
+
8
+ /**
9
+ * Generates an authorization/request token URL.
10
+ *
11
+ * [OAuth 2](https://www.oauth.com/oauth2-servers/authorization/the-authorization-request/)
12
+ */
13
+ export async function getAuthorizationUrl(
14
+ query: RequestInternal["query"],
15
+ options: InternalOptions<"oauth" | "oidc">
16
+ ) {
17
+ const { logger, provider } = options
18
+
19
+ let url = provider.authorization?.url
20
+ let as: o.AuthorizationServer | undefined
21
+
22
+ // Falls back to authjs.dev if the user only passed params
23
+ if (!url || url.host === "authjs.dev") {
24
+ // If url is undefined, we assume that issuer is always defined
25
+ // We check this in assert.ts
26
+
27
+ const issuer = new URL(provider.issuer!)
28
+ const discoveryResponse = await o.discoveryRequest(issuer, {
29
+ [o.customFetch]: provider[customFetch],
30
+ // TODO: move away from allowing insecure HTTP requests
31
+ [o.allowInsecureRequests]: true,
32
+ })
33
+ const as = await o
34
+ .processDiscoveryResponse(issuer, discoveryResponse)
35
+ .catch((error) => {
36
+ if (!(error instanceof TypeError) || error.message !== "Invalid URL")
37
+ throw error
38
+ throw new TypeError(
39
+ `Discovery request responded with an invalid issuer. expected: ${issuer}`
40
+ )
41
+ })
42
+
43
+ if (!as.authorization_endpoint) {
44
+ throw new TypeError(
45
+ "Authorization server did not provide an authorization endpoint."
46
+ )
47
+ }
48
+
49
+ url = new URL(as.authorization_endpoint)
50
+ }
51
+
52
+ const authParams = url.searchParams
53
+
54
+ let redirect_uri: string = provider.callbackUrl
55
+ let data: string | undefined
56
+ if (!options.isOnRedirectProxy && provider.redirectProxyUrl) {
57
+ redirect_uri = provider.redirectProxyUrl
58
+ data = provider.callbackUrl
59
+ logger.debug("using redirect proxy", { redirect_uri, data })
60
+ }
61
+
62
+ const params = Object.assign(
63
+ {
64
+ response_type: "code",
65
+ // clientId can technically be undefined, should we check this in assert.ts or rely on the Authorization Server to do it?
66
+ client_id: provider.clientId,
67
+ redirect_uri,
68
+ // @ts-expect-error TODO:
69
+ ...provider.authorization?.params,
70
+ },
71
+ Object.fromEntries(provider.authorization?.url.searchParams ?? []),
72
+ query
73
+ )
74
+
75
+ for (const k in params) authParams.set(k, params[k])
76
+
77
+ const cookies: Cookie[] = []
78
+
79
+ if (
80
+ // Otherwise "POST /redirect_uri" wouldn't include the cookies
81
+ provider.authorization?.url.searchParams.get("response_mode") ===
82
+ "form_post"
83
+ ) {
84
+ options.cookies.state.options.sameSite = "none"
85
+ options.cookies.state.options.secure = true
86
+ options.cookies.nonce.options.sameSite = "none"
87
+ options.cookies.nonce.options.secure = true
88
+ }
89
+
90
+ const state = await checks.state.create(options, data)
91
+ if (state) {
92
+ authParams.set("state", state.value)
93
+ cookies.push(state.cookie)
94
+ }
95
+
96
+ if (provider.checks?.includes("pkce")) {
97
+ if (as && !as.code_challenge_methods_supported?.includes("S256")) {
98
+ // We assume S256 PKCE support, if the server does not advertise that,
99
+ // a random `nonce` must be used for CSRF protection.
100
+ if (provider.type === "oidc") provider.checks = ["nonce"]
101
+ } else {
102
+ const { value, cookie } = await checks.pkce.create(options)
103
+ authParams.set("code_challenge", value)
104
+ authParams.set("code_challenge_method", "S256")
105
+ cookies.push(cookie)
106
+ }
107
+ }
108
+
109
+ const nonce = await checks.nonce.create(options)
110
+ if (nonce) {
111
+ authParams.set("nonce", nonce.value)
112
+ cookies.push(nonce.cookie)
113
+ }
114
+
115
+ // TODO: This does not work in normalizeOAuth because authorization endpoint can come from discovery
116
+ // Need to make normalizeOAuth async
117
+ if (provider.type === "oidc" && !url.searchParams.has("scope")) {
118
+ url.searchParams.set("scope", "openid profile email")
119
+ }
120
+
121
+ logger.debug("authorization url is ready", { url, cookies, provider })
122
+ return { redirect: url.toString(), cookies }
123
+ }
@@ -0,0 +1,37 @@
1
+ import { getAuthorizationUrl } from "./authorization-url.js"
2
+ import { sendToken } from "./send-token.js"
3
+
4
+ import type { Cookie } from "../../utils/cookie.js"
5
+ import type {
6
+ InternalOptions,
7
+ RequestInternal,
8
+ ResponseInternal,
9
+ } from "../../../types.js"
10
+
11
+ export async function signIn(
12
+ request: RequestInternal,
13
+ cookies: Cookie[],
14
+ options: InternalOptions
15
+ ): Promise<ResponseInternal> {
16
+ const signInUrl = `${options.url.origin}${options.basePath}/signin`
17
+
18
+ if (!options.provider) return { redirect: signInUrl, cookies }
19
+
20
+ switch (options.provider.type) {
21
+ case "oauth":
22
+ case "oidc": {
23
+ const { redirect, cookies: authCookies } = await getAuthorizationUrl(
24
+ request.query,
25
+ options
26
+ )
27
+ if (authCookies) cookies.push(...authCookies)
28
+ return { redirect, cookies }
29
+ }
30
+ case "email": {
31
+ const response = await sendToken(request, options)
32
+ return { ...response, cookies }
33
+ }
34
+ default:
35
+ return { redirect: signInUrl, cookies }
36
+ }
37
+ }
@@ -0,0 +1,124 @@
1
+ import { createHash, randomString, toRequest } from "../../utils/web.js"
2
+ import { AccessDenied } from "../../../errors.js"
3
+
4
+ import type { InternalOptions, RequestInternal } from "../../../types.js"
5
+ import type { Account } from "../../../types.js"
6
+
7
+ /**
8
+ * Starts an e-mail login flow, by generating a token,
9
+ * and sending it to the user's e-mail (with the help of a DB adapter).
10
+ * At the end, it returns a redirect to the `verify-request` page.
11
+ */
12
+ export async function sendToken(
13
+ request: RequestInternal,
14
+ options: InternalOptions<"email">
15
+ ) {
16
+ const { body } = request
17
+ const { provider, callbacks, adapter } = options
18
+ const normalizer = provider.normalizeIdentifier ?? defaultNormalizer
19
+ const email = normalizer(body?.email)
20
+
21
+ const defaultUser = { id: crypto.randomUUID(), email, emailVerified: null }
22
+ const user = (await adapter!.getUserByEmail(email)) ?? defaultUser
23
+
24
+ const account = {
25
+ providerAccountId: email,
26
+ userId: user.id,
27
+ type: "email",
28
+ provider: provider.id,
29
+ } satisfies Account
30
+
31
+ let authorized
32
+ try {
33
+ authorized = await callbacks.signIn({
34
+ user,
35
+ account,
36
+ email: { verificationRequest: true },
37
+ })
38
+ } catch (e) {
39
+ throw new AccessDenied(e as Error)
40
+ }
41
+ if (!authorized) throw new AccessDenied("AccessDenied")
42
+ if (typeof authorized === "string") {
43
+ return {
44
+ redirect: await callbacks.redirect({
45
+ url: authorized,
46
+ baseUrl: options.url.origin,
47
+ }),
48
+ }
49
+ }
50
+
51
+ const { callbackUrl, theme } = options
52
+ const token =
53
+ (await provider.generateVerificationToken?.()) ?? randomString(32)
54
+
55
+ const ONE_DAY_IN_SECONDS = 86400
56
+ const expires = new Date(
57
+ Date.now() + (provider.maxAge ?? ONE_DAY_IN_SECONDS) * 1000
58
+ )
59
+
60
+ const secret = provider.secret ?? options.secret
61
+
62
+ const baseUrl = new URL(options.basePath, options.url.origin)
63
+
64
+ const sendRequest = provider.sendVerificationRequest({
65
+ identifier: email,
66
+ token,
67
+ expires,
68
+ url: `${baseUrl}/callback/${provider.id}?${new URLSearchParams({
69
+ callbackUrl,
70
+ token,
71
+ email,
72
+ })}`,
73
+ provider,
74
+ theme,
75
+ request: toRequest(request),
76
+ })
77
+
78
+ const createToken = adapter!.createVerificationToken?.({
79
+ identifier: email,
80
+ token: await createHash(`${token}${secret}`),
81
+ expires,
82
+ })
83
+
84
+ await Promise.all([sendRequest, createToken])
85
+
86
+ return {
87
+ redirect: `${baseUrl}/verify-request?${new URLSearchParams({
88
+ provider: provider.id,
89
+ type: provider.type,
90
+ })}`,
91
+ }
92
+ }
93
+
94
+ function defaultNormalizer(email?: string) {
95
+ if (!email) throw new Error("Missing email from request body.")
96
+
97
+ const trimmedEmail = email.toLowerCase().trim()
98
+
99
+ // Reject email addresses with quotes to prevent address parser confusion
100
+ // This prevents attacks like "attacker@evil.com"@victim.com
101
+ if (trimmedEmail.includes('"')) {
102
+ throw new Error("Invalid email address format.")
103
+ }
104
+
105
+ // Get the first two elements only,
106
+ // separated by `@` from user input.
107
+ let [local, domain] = trimmedEmail.split("@")
108
+
109
+ // Validate that we have exactly 2 parts (local and domain)
110
+ if (!local || !domain || trimmedEmail.split("@").length !== 2) {
111
+ throw new Error("Invalid email address format.")
112
+ }
113
+
114
+ // The part before "@" can contain a ","
115
+ // but we remove it on the domain part
116
+ domain = domain.split(",")[0]
117
+
118
+ // Additional validation: domain should not be empty after comma split
119
+ if (!domain) {
120
+ throw new Error("Invalid email address format.")
121
+ }
122
+
123
+ return `${local}@${domain}`
124
+ }
@@ -0,0 +1,38 @@
1
+ import { SignOutError } from "../../errors.js"
2
+
3
+ import type { InternalOptions, ResponseInternal } from "../../types.js"
4
+ import type { Cookie, SessionStore } from "../utils/cookie.js"
5
+
6
+ /**
7
+ * Destroys the session.
8
+ * If the session strategy is database,
9
+ * The session is also deleted from the database.
10
+ * In any case, the session cookie is cleared and
11
+ * {@link AuthConfig["events"].signOut} is emitted.
12
+ */
13
+ export async function signOut(
14
+ cookies: Cookie[],
15
+ sessionStore: SessionStore,
16
+ options: InternalOptions
17
+ ): Promise<ResponseInternal> {
18
+ const { jwt, events, callbackUrl: redirect, logger, session } = options
19
+ const sessionToken = sessionStore.value
20
+ if (!sessionToken) return { redirect, cookies }
21
+
22
+ try {
23
+ if (session.strategy === "jwt") {
24
+ const salt = options.cookies.sessionToken.name
25
+ const token = await jwt.decode({ ...jwt, token: sessionToken, salt })
26
+ await events.signOut?.({ token })
27
+ } else {
28
+ const session = await options.adapter?.deleteSession(sessionToken)
29
+ await events.signOut?.({ session })
30
+ }
31
+ } catch (e) {
32
+ logger.error(new SignOutError(e as Error))
33
+ }
34
+
35
+ cookies.push(...sessionStore.clean())
36
+
37
+ return { redirect, cookies }
38
+ }
@@ -0,0 +1,100 @@
1
+ import type {
2
+ InternalOptions,
3
+ RequestInternal,
4
+ ResponseInternal,
5
+ User,
6
+ } from "../../types.js"
7
+ import type { Cookie, SessionStore } from "../utils/cookie.js"
8
+ import { getLoggedInUser } from "../utils/session.js"
9
+ import {
10
+ assertInternalOptionsWebAuthn,
11
+ inferWebAuthnOptions,
12
+ getAuthenticationResponse,
13
+ getRegistrationResponse,
14
+ } from "../utils/webauthn-utils.js"
15
+
16
+ /**
17
+ * Returns authentication or registration options for a WebAuthn flow
18
+ * depending on the parameters provided.
19
+ */
20
+ export async function webAuthnOptions(
21
+ request: RequestInternal,
22
+ options: InternalOptions,
23
+ sessionStore: SessionStore,
24
+ cookies: Cookie[]
25
+ // @ts-expect-error issue with returning from a switch case
26
+ ): Promise<ResponseInternal> {
27
+ // Return an error if the adapter is missing or if the provider
28
+ // is not a webauthn provider.
29
+ const narrowOptions = assertInternalOptionsWebAuthn(options)
30
+ const { provider } = narrowOptions
31
+
32
+ // Extract the action from the query parameters
33
+ const { action } = (request.query ?? {}) as Record<string, unknown>
34
+
35
+ // Action must be either "register", "authenticate", or undefined
36
+ if (
37
+ action !== "register" &&
38
+ action !== "authenticate" &&
39
+ typeof action !== "undefined"
40
+ ) {
41
+ return {
42
+ status: 400,
43
+ body: { error: "Invalid action" },
44
+ cookies,
45
+ headers: {
46
+ "Content-Type": "application/json",
47
+ },
48
+ }
49
+ }
50
+
51
+ // Get the user info from the session
52
+ const sessionUser = await getLoggedInUser(options, sessionStore)
53
+
54
+ // Extract user info from request
55
+ // If session user exists, we don't need to call getUserInfo
56
+ const getUserInfoResponse = sessionUser
57
+ ? {
58
+ user: sessionUser,
59
+ exists: true,
60
+ }
61
+ : await provider.getUserInfo(options, request)
62
+
63
+ const userInfo = getUserInfoResponse?.user
64
+
65
+ // Make a decision on what kind of webauthn options to return
66
+ const decision = inferWebAuthnOptions(
67
+ action,
68
+ !!sessionUser,
69
+ getUserInfoResponse
70
+ )
71
+
72
+ switch (decision) {
73
+ case "authenticate":
74
+ return getAuthenticationResponse(
75
+ narrowOptions,
76
+ request,
77
+ userInfo,
78
+ cookies
79
+ )
80
+ case "register":
81
+ if (typeof userInfo?.email === "string") {
82
+ return getRegistrationResponse(
83
+ narrowOptions,
84
+ request,
85
+ userInfo as User & { email: string },
86
+ cookies
87
+ )
88
+ }
89
+ break
90
+ default:
91
+ return {
92
+ status: 400,
93
+ body: { error: "Invalid request" },
94
+ cookies,
95
+ headers: {
96
+ "Content-Type": "application/json",
97
+ },
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,97 @@
1
+ import { UnknownAction } from "../errors.js"
2
+ import { SessionStore } from "./utils/cookie.js"
3
+ import { init } from "./init.js"
4
+ import renderPage from "./pages/index.js"
5
+ import * as actions from "./actions/index.js"
6
+ import { validateCSRF } from "./actions/callback/oauth/csrf-token.js"
7
+
8
+ import type { RequestInternal, ResponseInternal } from "../types.js"
9
+ import type { AuthConfig } from "../index.js"
10
+ import { skipCSRFCheck } from "./symbols.js"
11
+
12
+ export { customFetch, raw, skipCSRFCheck } from "./symbols.js"
13
+
14
+ /** @internal */
15
+ export async function AuthInternal(
16
+ request: RequestInternal,
17
+ authOptions: AuthConfig
18
+ ): Promise<ResponseInternal> {
19
+ const { action, providerId, error, method } = request
20
+
21
+ const csrfDisabled = authOptions.skipCSRFCheck === skipCSRFCheck
22
+
23
+ const { options, cookies } = await init({
24
+ authOptions,
25
+ action,
26
+ providerId,
27
+ url: request.url,
28
+ callbackUrl: request.body?.callbackUrl ?? request.query?.callbackUrl,
29
+ csrfToken: request.body?.csrfToken,
30
+ cookies: request.cookies,
31
+ isPost: method === "POST",
32
+ csrfDisabled,
33
+ })
34
+
35
+ const sessionStore = new SessionStore(
36
+ options.cookies.sessionToken,
37
+ request.cookies,
38
+ options.logger
39
+ )
40
+
41
+ if (method === "GET") {
42
+ const render = renderPage({ ...options, query: request.query, cookies })
43
+ switch (action) {
44
+ case "callback":
45
+ return await actions.callback(request, options, sessionStore, cookies)
46
+ case "csrf":
47
+ return render.csrf(csrfDisabled, options, cookies)
48
+ case "error":
49
+ return render.error(error)
50
+ case "providers":
51
+ return render.providers(options.providers)
52
+ case "session":
53
+ return await actions.session(options, sessionStore, cookies)
54
+ case "signin":
55
+ return render.signin(providerId, error)
56
+ case "signout":
57
+ return render.signout()
58
+ case "verify-request":
59
+ return render.verifyRequest()
60
+ case "webauthn-options":
61
+ return await actions.webAuthnOptions(
62
+ request,
63
+ options,
64
+ sessionStore,
65
+ cookies
66
+ )
67
+ default:
68
+ }
69
+ } else {
70
+ const { csrfTokenVerified } = options
71
+ switch (action) {
72
+ case "callback":
73
+ if (options.provider.type === "credentials")
74
+ // Verified CSRF Token required for credentials providers only
75
+ validateCSRF(action, csrfTokenVerified)
76
+ return await actions.callback(request, options, sessionStore, cookies)
77
+ case "session":
78
+ validateCSRF(action, csrfTokenVerified)
79
+ return await actions.session(
80
+ options,
81
+ sessionStore,
82
+ cookies,
83
+ true,
84
+ request.body?.data
85
+ )
86
+ case "signin":
87
+ validateCSRF(action, csrfTokenVerified)
88
+ return await actions.signIn(request, cookies, options)
89
+
90
+ case "signout":
91
+ validateCSRF(action, csrfTokenVerified)
92
+ return await actions.signOut(cookies, sessionStore, options)
93
+ default:
94
+ }
95
+ }
96
+ throw new UnknownAction(`Cannot handle action: ${action}`)
97
+ }