@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,127 @@
1
+ import { JWTSessionError, SessionTokenError } from "../../errors.js";
2
+ import { fromDate } from "../utils/date.js";
3
+ /** Return a session object filtered via `callbacks.session` */
4
+ export async function session(options, sessionStore, cookies, isUpdate, newSession) {
5
+ const { adapter, jwt, events, callbacks, logger, session: { strategy: sessionStrategy, maxAge: sessionMaxAge }, } = options;
6
+ const response = {
7
+ body: null,
8
+ headers: {
9
+ "Content-Type": "application/json",
10
+ ...(!isUpdate && {
11
+ "Cache-Control": "private, no-cache, no-store",
12
+ Expires: "0",
13
+ Pragma: "no-cache",
14
+ }),
15
+ },
16
+ cookies,
17
+ };
18
+ const sessionToken = sessionStore.value;
19
+ if (!sessionToken)
20
+ return response;
21
+ if (sessionStrategy === "jwt") {
22
+ try {
23
+ const salt = options.cookies.sessionToken.name;
24
+ const payload = await jwt.decode({ ...jwt, token: sessionToken, salt });
25
+ if (!payload)
26
+ throw new Error("Invalid JWT");
27
+ // @ts-expect-error
28
+ const token = await callbacks.jwt({
29
+ token: payload,
30
+ ...(isUpdate && { trigger: "update" }),
31
+ session: newSession,
32
+ });
33
+ const newExpires = fromDate(sessionMaxAge);
34
+ if (token !== null) {
35
+ // By default, only exposes a limited subset of information to the client
36
+ // as needed for presentation purposes (e.g. "you are logged in as...").
37
+ const session = {
38
+ user: { name: token.name, email: token.email, image: token.picture },
39
+ expires: newExpires.toISOString(),
40
+ };
41
+ // @ts-expect-error
42
+ const newSession = await callbacks.session({ session, token });
43
+ // Return session payload as response
44
+ response.body = newSession;
45
+ // Refresh JWT expiry by re-signing it, with an updated expiry date
46
+ const newToken = await jwt.encode({ ...jwt, token, salt });
47
+ // Set cookie, to also update expiry date on cookie
48
+ const sessionCookies = sessionStore.chunk(newToken, {
49
+ expires: newExpires,
50
+ });
51
+ response.cookies?.push(...sessionCookies);
52
+ await events.session?.({ session: newSession, token });
53
+ }
54
+ else {
55
+ response.cookies?.push(...sessionStore.clean());
56
+ }
57
+ }
58
+ catch (e) {
59
+ logger.error(new JWTSessionError(e));
60
+ // If the JWT is not verifiable remove the broken session cookie(s).
61
+ response.cookies?.push(...sessionStore.clean());
62
+ }
63
+ return response;
64
+ }
65
+ // Retrieve session from database
66
+ try {
67
+ const { getSessionAndUser, deleteSession, updateSession } = adapter;
68
+ let userAndSession = await getSessionAndUser(sessionToken);
69
+ // If session has expired, clean up the database
70
+ if (userAndSession &&
71
+ userAndSession.session.expires.valueOf() < Date.now()) {
72
+ await deleteSession(sessionToken);
73
+ userAndSession = null;
74
+ }
75
+ if (userAndSession) {
76
+ const { user, session } = userAndSession;
77
+ const sessionUpdateAge = options.session.updateAge;
78
+ // Calculate last updated date to throttle write updates to database
79
+ // Formula: ({expiry date} - sessionMaxAge) + sessionUpdateAge
80
+ // e.g. ({expiry date} - 30 days) + 1 hour
81
+ const sessionIsDueToBeUpdatedDate = session.expires.valueOf() -
82
+ sessionMaxAge * 1000 +
83
+ sessionUpdateAge * 1000;
84
+ const newExpires = fromDate(sessionMaxAge);
85
+ // Trigger update of session expiry date and write to database, only
86
+ // if the session was last updated more than {sessionUpdateAge} ago
87
+ if (sessionIsDueToBeUpdatedDate <= Date.now()) {
88
+ await updateSession({
89
+ sessionToken: sessionToken,
90
+ expires: newExpires,
91
+ });
92
+ }
93
+ // Pass Session through to the session callback
94
+ const sessionPayload = await callbacks.session({
95
+ // TODO: user already passed below,
96
+ // remove from session object in https://github.com/nextauthjs/next-auth/pull/9702
97
+ // @ts-expect-error
98
+ session: { ...session, user },
99
+ user,
100
+ newSession,
101
+ ...(isUpdate ? { trigger: "update" } : {}),
102
+ });
103
+ // Return session payload as response
104
+ response.body = sessionPayload;
105
+ // Set cookie again to update expiry
106
+ response.cookies?.push({
107
+ name: options.cookies.sessionToken.name,
108
+ value: sessionToken,
109
+ options: {
110
+ ...options.cookies.sessionToken.options,
111
+ expires: newExpires,
112
+ },
113
+ });
114
+ // @ts-expect-error
115
+ await events.session?.({ session: sessionPayload });
116
+ }
117
+ else if (sessionToken) {
118
+ // If `sessionToken` was found set but it's not valid for a session then
119
+ // remove the sessionToken cookie from browser.
120
+ response.cookies?.push(...sessionStore.clean());
121
+ }
122
+ }
123
+ catch (e) {
124
+ logger.error(new SessionTokenError(e));
125
+ }
126
+ return response;
127
+ }
@@ -0,0 +1,12 @@
1
+ import type { InternalOptions, RequestInternal } from "../../../types.js";
2
+ import type { Cookie } from "../../utils/cookie.js";
3
+ /**
4
+ * Generates an authorization/request token URL.
5
+ *
6
+ * [OAuth 2](https://www.oauth.com/oauth2-servers/authorization/the-authorization-request/)
7
+ */
8
+ export declare function getAuthorizationUrl(query: RequestInternal["query"], options: InternalOptions<"oauth" | "oidc">): Promise<{
9
+ redirect: string;
10
+ cookies: Cookie[];
11
+ }>;
12
+ //# sourceMappingURL=authorization-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-url.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/signin/authorization-url.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAGnD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC;;;GA4G3C"}
@@ -0,0 +1,94 @@
1
+ import * as checks from "../callback/oauth/checks.js";
2
+ import * as o from "oauth4webapi";
3
+ import { customFetch } from "../../symbols.js";
4
+ /**
5
+ * Generates an authorization/request token URL.
6
+ *
7
+ * [OAuth 2](https://www.oauth.com/oauth2-servers/authorization/the-authorization-request/)
8
+ */
9
+ export async function getAuthorizationUrl(query, options) {
10
+ const { logger, provider } = options;
11
+ let url = provider.authorization?.url;
12
+ let as;
13
+ // Falls back to authjs.dev if the user only passed params
14
+ if (!url || url.host === "authjs.dev") {
15
+ // If url is undefined, we assume that issuer is always defined
16
+ // We check this in assert.ts
17
+ const issuer = new URL(provider.issuer);
18
+ const discoveryResponse = await o.discoveryRequest(issuer, {
19
+ [o.customFetch]: provider[customFetch],
20
+ // TODO: move away from allowing insecure HTTP requests
21
+ [o.allowInsecureRequests]: true,
22
+ });
23
+ const as = await o
24
+ .processDiscoveryResponse(issuer, discoveryResponse)
25
+ .catch((error) => {
26
+ if (!(error instanceof TypeError) || error.message !== "Invalid URL")
27
+ throw error;
28
+ throw new TypeError(`Discovery request responded with an invalid issuer. expected: ${issuer}`);
29
+ });
30
+ if (!as.authorization_endpoint) {
31
+ throw new TypeError("Authorization server did not provide an authorization endpoint.");
32
+ }
33
+ url = new URL(as.authorization_endpoint);
34
+ }
35
+ const authParams = url.searchParams;
36
+ let redirect_uri = provider.callbackUrl;
37
+ let data;
38
+ if (!options.isOnRedirectProxy && provider.redirectProxyUrl) {
39
+ redirect_uri = provider.redirectProxyUrl;
40
+ data = provider.callbackUrl;
41
+ logger.debug("using redirect proxy", { redirect_uri, data });
42
+ }
43
+ const params = Object.assign({
44
+ response_type: "code",
45
+ // clientId can technically be undefined, should we check this in assert.ts or rely on the Authorization Server to do it?
46
+ client_id: provider.clientId,
47
+ redirect_uri,
48
+ // @ts-expect-error TODO:
49
+ ...provider.authorization?.params,
50
+ }, Object.fromEntries(provider.authorization?.url.searchParams ?? []), query);
51
+ for (const k in params)
52
+ authParams.set(k, params[k]);
53
+ const cookies = [];
54
+ if (
55
+ // Otherwise "POST /redirect_uri" wouldn't include the cookies
56
+ provider.authorization?.url.searchParams.get("response_mode") ===
57
+ "form_post") {
58
+ options.cookies.state.options.sameSite = "none";
59
+ options.cookies.state.options.secure = true;
60
+ options.cookies.nonce.options.sameSite = "none";
61
+ options.cookies.nonce.options.secure = true;
62
+ }
63
+ const state = await checks.state.create(options, data);
64
+ if (state) {
65
+ authParams.set("state", state.value);
66
+ cookies.push(state.cookie);
67
+ }
68
+ if (provider.checks?.includes("pkce")) {
69
+ if (as && !as.code_challenge_methods_supported?.includes("S256")) {
70
+ // We assume S256 PKCE support, if the server does not advertise that,
71
+ // a random `nonce` must be used for CSRF protection.
72
+ if (provider.type === "oidc")
73
+ provider.checks = ["nonce"];
74
+ }
75
+ else {
76
+ const { value, cookie } = await checks.pkce.create(options);
77
+ authParams.set("code_challenge", value);
78
+ authParams.set("code_challenge_method", "S256");
79
+ cookies.push(cookie);
80
+ }
81
+ }
82
+ const nonce = await checks.nonce.create(options);
83
+ if (nonce) {
84
+ authParams.set("nonce", nonce.value);
85
+ cookies.push(nonce.cookie);
86
+ }
87
+ // TODO: This does not work in normalizeOAuth because authorization endpoint can come from discovery
88
+ // Need to make normalizeOAuth async
89
+ if (provider.type === "oidc" && !url.searchParams.has("scope")) {
90
+ url.searchParams.set("scope", "openid profile email");
91
+ }
92
+ logger.debug("authorization url is ready", { url, cookies, provider });
93
+ return { redirect: url.toString(), cookies };
94
+ }
@@ -0,0 +1,4 @@
1
+ import type { Cookie } from "../../utils/cookie.js";
2
+ import type { InternalOptions, RequestInternal, ResponseInternal } from "../../../types.js";
3
+ export declare function signIn(request: RequestInternal, cookies: Cookie[], options: InternalOptions): Promise<ResponseInternal>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/signin/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAE1B,wBAAsB,MAAM,CAC1B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsB3B"}
@@ -0,0 +1,22 @@
1
+ import { getAuthorizationUrl } from "./authorization-url.js";
2
+ import { sendToken } from "./send-token.js";
3
+ export async function signIn(request, cookies, options) {
4
+ const signInUrl = `${options.url.origin}${options.basePath}/signin`;
5
+ if (!options.provider)
6
+ return { redirect: signInUrl, cookies };
7
+ switch (options.provider.type) {
8
+ case "oauth":
9
+ case "oidc": {
10
+ const { redirect, cookies: authCookies } = await getAuthorizationUrl(request.query, options);
11
+ if (authCookies)
12
+ cookies.push(...authCookies);
13
+ return { redirect, cookies };
14
+ }
15
+ case "email": {
16
+ const response = await sendToken(request, options);
17
+ return { ...response, cookies };
18
+ }
19
+ default:
20
+ return { redirect: signInUrl, cookies };
21
+ }
22
+ }
@@ -0,0 +1,10 @@
1
+ import type { InternalOptions, RequestInternal } from "../../../types.js";
2
+ /**
3
+ * Starts an e-mail login flow, by generating a token,
4
+ * and sending it to the user's e-mail (with the help of a DB adapter).
5
+ * At the end, it returns a redirect to the `verify-request` page.
6
+ */
7
+ export declare function sendToken(request: RequestInternal, options: InternalOptions<"email">): Promise<{
8
+ redirect: string;
9
+ }>;
10
+ //# sourceMappingURL=send-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-token.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/signin/send-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGzE;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;;GA8ElC"}
@@ -0,0 +1,98 @@
1
+ import { createHash, randomString, toRequest } from "../../utils/web.js";
2
+ import { AccessDenied } from "../../../errors.js";
3
+ /**
4
+ * Starts an e-mail login flow, by generating a token,
5
+ * and sending it to the user's e-mail (with the help of a DB adapter).
6
+ * At the end, it returns a redirect to the `verify-request` page.
7
+ */
8
+ export async function sendToken(request, options) {
9
+ const { body } = request;
10
+ const { provider, callbacks, adapter } = options;
11
+ const normalizer = provider.normalizeIdentifier ?? defaultNormalizer;
12
+ const email = normalizer(body?.email);
13
+ const defaultUser = { id: crypto.randomUUID(), email, emailVerified: null };
14
+ const user = (await adapter.getUserByEmail(email)) ?? defaultUser;
15
+ const account = {
16
+ providerAccountId: email,
17
+ userId: user.id,
18
+ type: "email",
19
+ provider: provider.id,
20
+ };
21
+ let authorized;
22
+ try {
23
+ authorized = await callbacks.signIn({
24
+ user,
25
+ account,
26
+ email: { verificationRequest: true },
27
+ });
28
+ }
29
+ catch (e) {
30
+ throw new AccessDenied(e);
31
+ }
32
+ if (!authorized)
33
+ throw new AccessDenied("AccessDenied");
34
+ if (typeof authorized === "string") {
35
+ return {
36
+ redirect: await callbacks.redirect({
37
+ url: authorized,
38
+ baseUrl: options.url.origin,
39
+ }),
40
+ };
41
+ }
42
+ const { callbackUrl, theme } = options;
43
+ const token = (await provider.generateVerificationToken?.()) ?? randomString(32);
44
+ const ONE_DAY_IN_SECONDS = 86400;
45
+ const expires = new Date(Date.now() + (provider.maxAge ?? ONE_DAY_IN_SECONDS) * 1000);
46
+ const secret = provider.secret ?? options.secret;
47
+ const baseUrl = new URL(options.basePath, options.url.origin);
48
+ const sendRequest = provider.sendVerificationRequest({
49
+ identifier: email,
50
+ token,
51
+ expires,
52
+ url: `${baseUrl}/callback/${provider.id}?${new URLSearchParams({
53
+ callbackUrl,
54
+ token,
55
+ email,
56
+ })}`,
57
+ provider,
58
+ theme,
59
+ request: toRequest(request),
60
+ });
61
+ const createToken = adapter.createVerificationToken?.({
62
+ identifier: email,
63
+ token: await createHash(`${token}${secret}`),
64
+ expires,
65
+ });
66
+ await Promise.all([sendRequest, createToken]);
67
+ return {
68
+ redirect: `${baseUrl}/verify-request?${new URLSearchParams({
69
+ provider: provider.id,
70
+ type: provider.type,
71
+ })}`,
72
+ };
73
+ }
74
+ function defaultNormalizer(email) {
75
+ if (!email)
76
+ throw new Error("Missing email from request body.");
77
+ const trimmedEmail = email.toLowerCase().trim();
78
+ // Reject email addresses with quotes to prevent address parser confusion
79
+ // This prevents attacks like "attacker@evil.com"@victim.com
80
+ if (trimmedEmail.includes('"')) {
81
+ throw new Error("Invalid email address format.");
82
+ }
83
+ // Get the first two elements only,
84
+ // separated by `@` from user input.
85
+ let [local, domain] = trimmedEmail.split("@");
86
+ // Validate that we have exactly 2 parts (local and domain)
87
+ if (!local || !domain || trimmedEmail.split("@").length !== 2) {
88
+ throw new Error("Invalid email address format.");
89
+ }
90
+ // The part before "@" can contain a ","
91
+ // but we remove it on the domain part
92
+ domain = domain.split(",")[0];
93
+ // Additional validation: domain should not be empty after comma split
94
+ if (!domain) {
95
+ throw new Error("Invalid email address format.");
96
+ }
97
+ return `${local}@${domain}`;
98
+ }
@@ -0,0 +1,11 @@
1
+ import type { InternalOptions, ResponseInternal } from "../../types.js";
2
+ import type { Cookie, SessionStore } from "../utils/cookie.js";
3
+ /**
4
+ * Destroys the session.
5
+ * If the session strategy is database,
6
+ * The session is also deleted from the database.
7
+ * In any case, the session cookie is cleared and
8
+ * {@link AuthConfig["events"].signOut} is emitted.
9
+ */
10
+ export declare function signOut(cookies: Cookie[], sessionStore: SessionStore, options: InternalOptions): Promise<ResponseInternal>;
11
+ //# sourceMappingURL=signout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signout.d.ts","sourceRoot":"","sources":["../../src/lib/actions/signout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE9D;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
@@ -0,0 +1,30 @@
1
+ import { SignOutError } from "../../errors.js";
2
+ /**
3
+ * Destroys the session.
4
+ * If the session strategy is database,
5
+ * The session is also deleted from the database.
6
+ * In any case, the session cookie is cleared and
7
+ * {@link AuthConfig["events"].signOut} is emitted.
8
+ */
9
+ export async function signOut(cookies, sessionStore, options) {
10
+ const { jwt, events, callbackUrl: redirect, logger, session } = options;
11
+ const sessionToken = sessionStore.value;
12
+ if (!sessionToken)
13
+ return { redirect, cookies };
14
+ try {
15
+ if (session.strategy === "jwt") {
16
+ const salt = options.cookies.sessionToken.name;
17
+ const token = await jwt.decode({ ...jwt, token: sessionToken, salt });
18
+ await events.signOut?.({ token });
19
+ }
20
+ else {
21
+ const session = await options.adapter?.deleteSession(sessionToken);
22
+ await events.signOut?.({ session });
23
+ }
24
+ }
25
+ catch (e) {
26
+ logger.error(new SignOutError(e));
27
+ }
28
+ cookies.push(...sessionStore.clean());
29
+ return { redirect, cookies };
30
+ }
@@ -0,0 +1,8 @@
1
+ import type { InternalOptions, RequestInternal, ResponseInternal } from "../../types.js";
2
+ import type { Cookie, SessionStore } from "../utils/cookie.js";
3
+ /**
4
+ * Returns authentication or registration options for a WebAuthn flow
5
+ * depending on the parameters provided.
6
+ */
7
+ export declare function webAuthnOptions(request: RequestInternal, options: InternalOptions, sessionStore: SessionStore, cookies: Cookie[]): Promise<ResponseInternal>;
8
+ //# sourceMappingURL=webauthn-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn-options.d.ts","sourceRoot":"","sources":["../../src/lib/actions/webauthn-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAEjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAS9D;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EAAE,GAEhB,OAAO,CAAC,gBAAgB,CAAC,CA0E3B"}
@@ -0,0 +1,60 @@
1
+ import { getLoggedInUser } from "../utils/session.js";
2
+ import { assertInternalOptionsWebAuthn, inferWebAuthnOptions, getAuthenticationResponse, getRegistrationResponse, } from "../utils/webauthn-utils.js";
3
+ /**
4
+ * Returns authentication or registration options for a WebAuthn flow
5
+ * depending on the parameters provided.
6
+ */
7
+ export async function webAuthnOptions(request, options, sessionStore, cookies
8
+ // @ts-expect-error issue with returning from a switch case
9
+ ) {
10
+ // Return an error if the adapter is missing or if the provider
11
+ // is not a webauthn provider.
12
+ const narrowOptions = assertInternalOptionsWebAuthn(options);
13
+ const { provider } = narrowOptions;
14
+ // Extract the action from the query parameters
15
+ const { action } = (request.query ?? {});
16
+ // Action must be either "register", "authenticate", or undefined
17
+ if (action !== "register" &&
18
+ action !== "authenticate" &&
19
+ typeof action !== "undefined") {
20
+ return {
21
+ status: 400,
22
+ body: { error: "Invalid action" },
23
+ cookies,
24
+ headers: {
25
+ "Content-Type": "application/json",
26
+ },
27
+ };
28
+ }
29
+ // Get the user info from the session
30
+ const sessionUser = await getLoggedInUser(options, sessionStore);
31
+ // Extract user info from request
32
+ // If session user exists, we don't need to call getUserInfo
33
+ const getUserInfoResponse = sessionUser
34
+ ? {
35
+ user: sessionUser,
36
+ exists: true,
37
+ }
38
+ : await provider.getUserInfo(options, request);
39
+ const userInfo = getUserInfoResponse?.user;
40
+ // Make a decision on what kind of webauthn options to return
41
+ const decision = inferWebAuthnOptions(action, !!sessionUser, getUserInfoResponse);
42
+ switch (decision) {
43
+ case "authenticate":
44
+ return getAuthenticationResponse(narrowOptions, request, userInfo, cookies);
45
+ case "register":
46
+ if (typeof userInfo?.email === "string") {
47
+ return getRegistrationResponse(narrowOptions, request, userInfo, cookies);
48
+ }
49
+ break;
50
+ default:
51
+ return {
52
+ status: 400,
53
+ body: { error: "Invalid request" },
54
+ cookies,
55
+ headers: {
56
+ "Content-Type": "application/json",
57
+ },
58
+ };
59
+ }
60
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { customFetch, raw, skipCSRFCheck } from "./symbols.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
package/lib/index.js ADDED
@@ -0,0 +1,70 @@
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
+ import { skipCSRFCheck } from "./symbols.js";
8
+ export { customFetch, raw, skipCSRFCheck } from "./symbols.js";
9
+ /** @internal */
10
+ export async function AuthInternal(request, authOptions) {
11
+ const { action, providerId, error, method } = request;
12
+ const csrfDisabled = authOptions.skipCSRFCheck === skipCSRFCheck;
13
+ const { options, cookies } = await init({
14
+ authOptions,
15
+ action,
16
+ providerId,
17
+ url: request.url,
18
+ callbackUrl: request.body?.callbackUrl ?? request.query?.callbackUrl,
19
+ csrfToken: request.body?.csrfToken,
20
+ cookies: request.cookies,
21
+ isPost: method === "POST",
22
+ csrfDisabled,
23
+ });
24
+ const sessionStore = new SessionStore(options.cookies.sessionToken, request.cookies, options.logger);
25
+ if (method === "GET") {
26
+ const render = renderPage({ ...options, query: request.query, cookies });
27
+ switch (action) {
28
+ case "callback":
29
+ return await actions.callback(request, options, sessionStore, cookies);
30
+ case "csrf":
31
+ return render.csrf(csrfDisabled, options, cookies);
32
+ case "error":
33
+ return render.error(error);
34
+ case "providers":
35
+ return render.providers(options.providers);
36
+ case "session":
37
+ return await actions.session(options, sessionStore, cookies);
38
+ case "signin":
39
+ return render.signin(providerId, error);
40
+ case "signout":
41
+ return render.signout();
42
+ case "verify-request":
43
+ return render.verifyRequest();
44
+ case "webauthn-options":
45
+ return await actions.webAuthnOptions(request, options, sessionStore, cookies);
46
+ default:
47
+ }
48
+ }
49
+ else {
50
+ const { csrfTokenVerified } = options;
51
+ switch (action) {
52
+ case "callback":
53
+ if (options.provider.type === "credentials")
54
+ // Verified CSRF Token required for credentials providers only
55
+ validateCSRF(action, csrfTokenVerified);
56
+ return await actions.callback(request, options, sessionStore, cookies);
57
+ case "session":
58
+ validateCSRF(action, csrfTokenVerified);
59
+ return await actions.session(options, sessionStore, cookies, true, request.body?.data);
60
+ case "signin":
61
+ validateCSRF(action, csrfTokenVerified);
62
+ return await actions.signIn(request, cookies, options);
63
+ case "signout":
64
+ validateCSRF(action, csrfTokenVerified);
65
+ return await actions.signOut(cookies, sessionStore, options);
66
+ default:
67
+ }
68
+ }
69
+ throw new UnknownAction(`Cannot handle action: ${action}`);
70
+ }
package/lib/init.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import * as cookie from "./utils/cookie.js";
2
+ import type { InternalOptions, RequestInternal } from "../types.js";
3
+ import type { AuthConfig } from "../index.js";
4
+ interface InitParams {
5
+ url: URL;
6
+ authOptions: AuthConfig;
7
+ providerId?: string;
8
+ action: InternalOptions["action"];
9
+ /** Callback URL value extracted from the incoming request. */
10
+ callbackUrl?: string;
11
+ /** CSRF token value extracted from the incoming request. From body if POST, from query if GET */
12
+ csrfToken?: string;
13
+ /** Is the incoming request a POST request? */
14
+ csrfDisabled: boolean;
15
+ isPost: boolean;
16
+ cookies: RequestInternal["cookies"];
17
+ }
18
+ export declare const defaultCallbacks: InternalOptions["callbacks"];
19
+ /** Initialize all internal options and cookies. */
20
+ export declare function init({ authOptions: config, providerId, action, url, cookies: reqCookies, callbackUrl: reqCallbackUrl, csrfToken: reqCsrfToken, csrfDisabled, isPost, }: InitParams): Promise<{
21
+ options: InternalOptions;
22
+ cookies: cookie.Cookie[];
23
+ }>;
24
+ export {};
25
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/lib/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAQ3C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,UAAU,UAAU;IAClB,GAAG,EAAE,GAAG,CAAA;IACR,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;CACpC;AAED,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,WAAW,CAsBzD,CAAA;AAED,mDAAmD;AACnD,wBAAsB,IAAI,CAAC,EACzB,WAAW,EAAE,MAAM,EACnB,UAAU,EACV,MAAM,EACN,GAAG,EACH,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,cAAc,EAC3B,SAAS,EAAE,YAAY,EACvB,YAAY,EACZ,MAAM,GACP,EAAE,UAAU,GAAG,OAAO,CAAC;IACtB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;CACzB,CAAC,CA6HD"}