@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,554 @@
1
+ // TODO: Make this file smaller
2
+
3
+ import {
4
+ AuthError,
5
+ AccessDenied,
6
+ CallbackRouteError,
7
+ CredentialsSignin,
8
+ InvalidProvider,
9
+ Verification,
10
+ } from "../../../errors.js"
11
+ import { handleLoginOrRegister } from "./handle-login.js"
12
+ import { handleOAuth } from "./oauth/callback.js"
13
+ import { state } from "./oauth/checks.js"
14
+ import { createHash } from "../../utils/web.js"
15
+
16
+ import type { AdapterSession } from "../../../adapters.js"
17
+ import type {
18
+ Account,
19
+ Authenticator,
20
+ InternalOptions,
21
+ RequestInternal,
22
+ ResponseInternal,
23
+ User,
24
+ } from "../../../types.js"
25
+ import type { Cookie, SessionStore } from "../../utils/cookie.js"
26
+ import {
27
+ assertInternalOptionsWebAuthn,
28
+ verifyAuthenticate,
29
+ verifyRegister,
30
+ } from "../../utils/webauthn-utils.js"
31
+
32
+ /** Handle callbacks from login services */
33
+ export async function callback(
34
+ request: RequestInternal,
35
+ options: InternalOptions,
36
+ sessionStore: SessionStore,
37
+ cookies: Cookie[]
38
+ ): Promise<ResponseInternal> {
39
+ if (!options.provider)
40
+ throw new InvalidProvider("Callback route called without provider")
41
+ const { query, body, method, headers } = request
42
+ const {
43
+ provider,
44
+ adapter,
45
+ url,
46
+ callbackUrl,
47
+ pages,
48
+ jwt,
49
+ events,
50
+ callbacks,
51
+ session: { strategy: sessionStrategy, maxAge: sessionMaxAge },
52
+ logger,
53
+ } = options
54
+
55
+ const useJwtSession = sessionStrategy === "jwt"
56
+
57
+ try {
58
+ if (provider.type === "oauth" || provider.type === "oidc") {
59
+ // Use body if the response mode is set to form_post. For all other cases, use query
60
+ const params =
61
+ provider.authorization?.url.searchParams.get("response_mode") ===
62
+ "form_post"
63
+ ? body
64
+ : query
65
+
66
+ // If we have a state and we are on a redirect proxy, we try to parse it
67
+ // and see if it contains a valid origin to redirect to. If it does, we
68
+ // redirect the user to that origin with the original state.
69
+ if (options.isOnRedirectProxy && params?.state) {
70
+ // NOTE: We rely on the state being encrypted using a shared secret
71
+ // between the proxy and the original server.
72
+ const parsedState = await state.decode(params.state, options)
73
+ const shouldRedirect =
74
+ parsedState?.origin &&
75
+ new URL(parsedState.origin).origin !== options.url.origin
76
+ if (shouldRedirect) {
77
+ const proxyRedirect = `${parsedState.origin}?${new URLSearchParams(params)}`
78
+ logger.debug("Proxy redirecting to", proxyRedirect)
79
+ return { redirect: proxyRedirect, cookies }
80
+ }
81
+ }
82
+
83
+ const authorizationResult = await handleOAuth(
84
+ params,
85
+ request.cookies,
86
+ options
87
+ )
88
+
89
+ if (authorizationResult.cookies.length) {
90
+ cookies.push(...authorizationResult.cookies)
91
+ }
92
+
93
+ logger.debug("authorization result", authorizationResult)
94
+
95
+ const {
96
+ user: userFromProvider,
97
+ account,
98
+ profile: OAuthProfile,
99
+ } = authorizationResult
100
+
101
+ // If we don't have a profile object then either something went wrong
102
+ // or the user cancelled signing in. We don't know which, so we just
103
+ // direct the user to the signin page for now. We could do something
104
+ // else in future.
105
+ // TODO: Handle user cancelling signin
106
+ if (!userFromProvider || !account || !OAuthProfile) {
107
+ return { redirect: `${url}/signin`, cookies }
108
+ }
109
+
110
+ // Check if user is allowed to sign in
111
+ // Attempt to get Profile from OAuth provider details before invoking
112
+ // signIn callback - but if no user object is returned, that is fine
113
+ // (that just means it's a new user signing in for the first time).
114
+ let userByAccount
115
+ if (adapter) {
116
+ const { getUserByAccount } = adapter
117
+ userByAccount = await getUserByAccount({
118
+ providerAccountId: account.providerAccountId,
119
+ provider: provider.id,
120
+ })
121
+ }
122
+
123
+ const redirect = await handleAuthorized(
124
+ {
125
+ user: userByAccount ?? userFromProvider,
126
+ account,
127
+ profile: OAuthProfile,
128
+ },
129
+ options
130
+ )
131
+ if (redirect) return { redirect, cookies }
132
+
133
+ const { user, session, isNewUser } = await handleLoginOrRegister(
134
+ sessionStore.value,
135
+ userFromProvider,
136
+ account,
137
+ options
138
+ )
139
+
140
+ if (useJwtSession) {
141
+ const defaultToken = {
142
+ name: user.name,
143
+ email: user.email,
144
+ picture: user.image,
145
+ sub: user.id?.toString(),
146
+ }
147
+ const token = await callbacks.jwt({
148
+ token: defaultToken,
149
+ user,
150
+ account,
151
+ profile: OAuthProfile,
152
+ isNewUser,
153
+ trigger: isNewUser ? "signUp" : "signIn",
154
+ })
155
+
156
+ // Clear cookies if token is null
157
+ if (token === null) {
158
+ cookies.push(...sessionStore.clean())
159
+ } else {
160
+ const salt = options.cookies.sessionToken.name
161
+ // Encode token
162
+ const newToken = await jwt.encode({ ...jwt, token, salt })
163
+
164
+ // Set cookie expiry date
165
+ const cookieExpires = new Date()
166
+ cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
167
+
168
+ const sessionCookies = sessionStore.chunk(newToken, {
169
+ expires: cookieExpires,
170
+ })
171
+ cookies.push(...sessionCookies)
172
+ }
173
+ } else {
174
+ // Save Session Token in cookie
175
+ cookies.push({
176
+ name: options.cookies.sessionToken.name,
177
+ value: (session as AdapterSession).sessionToken,
178
+ options: {
179
+ ...options.cookies.sessionToken.options,
180
+ expires: (session as AdapterSession).expires,
181
+ },
182
+ })
183
+ }
184
+
185
+ await events.signIn?.({
186
+ user,
187
+ account,
188
+ profile: OAuthProfile,
189
+ isNewUser,
190
+ })
191
+
192
+ // Handle first logins on new accounts
193
+ // e.g. option to send users to a new account landing page on initial login
194
+ // Note that the callback URL is preserved, so the journey can still be resumed
195
+ if (isNewUser && pages.newUser) {
196
+ return {
197
+ redirect: `${pages.newUser}${
198
+ pages.newUser.includes("?") ? "&" : "?"
199
+ }${new URLSearchParams({ callbackUrl })}`,
200
+ cookies,
201
+ }
202
+ }
203
+
204
+ return { redirect: callbackUrl, cookies }
205
+ } else if (provider.type === "email") {
206
+ const paramToken = query?.token as string | undefined
207
+ const paramIdentifier = query?.email as string | undefined
208
+
209
+ if (!paramToken) {
210
+ const e = new TypeError(
211
+ "Missing token. The sign-in URL was manually opened without token or the link was not sent correctly in the email.",
212
+ { cause: { hasToken: !!paramToken } }
213
+ )
214
+ e.name = "Configuration"
215
+ throw e
216
+ }
217
+
218
+ const secret = provider.secret ?? options.secret
219
+ // @ts-expect-error -- Verified in `assertConfig`.
220
+ const invite = await adapter.useVerificationToken({
221
+ // @ts-expect-error User-land adapters might decide to omit the identifier during lookup
222
+ identifier: paramIdentifier, // TODO: Drop this requirement for lookup in official adapters too
223
+ token: await createHash(`${paramToken}${secret}`),
224
+ })
225
+
226
+ const hasInvite = !!invite
227
+ const expired = hasInvite && invite.expires.valueOf() < Date.now()
228
+ const invalidInvite =
229
+ !hasInvite ||
230
+ expired ||
231
+ // The user might have configured the link to not contain the identifier
232
+ // so we only compare if it exists
233
+ (paramIdentifier && invite.identifier !== paramIdentifier)
234
+ if (invalidInvite) throw new Verification({ hasInvite, expired })
235
+
236
+ const { identifier } = invite
237
+ const user = (await adapter!.getUserByEmail(identifier)) ?? {
238
+ id: crypto.randomUUID(),
239
+ email: identifier,
240
+ emailVerified: null,
241
+ }
242
+
243
+ const account: Account = {
244
+ providerAccountId: user.email,
245
+ userId: user.id,
246
+ type: "email" as const,
247
+ provider: provider.id,
248
+ }
249
+
250
+ const redirect = await handleAuthorized({ user, account }, options)
251
+ if (redirect) return { redirect, cookies }
252
+
253
+ // Sign user in
254
+ const {
255
+ user: loggedInUser,
256
+ session,
257
+ isNewUser,
258
+ } = await handleLoginOrRegister(
259
+ sessionStore.value,
260
+ user,
261
+ account,
262
+ options
263
+ )
264
+
265
+ if (useJwtSession) {
266
+ const defaultToken = {
267
+ name: loggedInUser.name,
268
+ email: loggedInUser.email,
269
+ picture: loggedInUser.image,
270
+ sub: loggedInUser.id?.toString(),
271
+ }
272
+ const token = await callbacks.jwt({
273
+ token: defaultToken,
274
+ user: loggedInUser,
275
+ account,
276
+ isNewUser,
277
+ trigger: isNewUser ? "signUp" : "signIn",
278
+ })
279
+
280
+ // Clear cookies if token is null
281
+ if (token === null) {
282
+ cookies.push(...sessionStore.clean())
283
+ } else {
284
+ const salt = options.cookies.sessionToken.name
285
+ // Encode token
286
+ const newToken = await jwt.encode({ ...jwt, token, salt })
287
+
288
+ // Set cookie expiry date
289
+ const cookieExpires = new Date()
290
+ cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
291
+
292
+ const sessionCookies = sessionStore.chunk(newToken, {
293
+ expires: cookieExpires,
294
+ })
295
+ cookies.push(...sessionCookies)
296
+ }
297
+ } else {
298
+ // Save Session Token in cookie
299
+ cookies.push({
300
+ name: options.cookies.sessionToken.name,
301
+ value: (session as AdapterSession).sessionToken,
302
+ options: {
303
+ ...options.cookies.sessionToken.options,
304
+ expires: (session as AdapterSession).expires,
305
+ },
306
+ })
307
+ }
308
+
309
+ await events.signIn?.({ user: loggedInUser, account, isNewUser })
310
+
311
+ // Handle first logins on new accounts
312
+ // e.g. option to send users to a new account landing page on initial login
313
+ // Note that the callback URL is preserved, so the journey can still be resumed
314
+ if (isNewUser && pages.newUser) {
315
+ return {
316
+ redirect: `${pages.newUser}${
317
+ pages.newUser.includes("?") ? "&" : "?"
318
+ }${new URLSearchParams({ callbackUrl })}`,
319
+ cookies,
320
+ }
321
+ }
322
+
323
+ // Callback URL is already verified at this point, so safe to use if specified
324
+ return { redirect: callbackUrl, cookies }
325
+ } else if (provider.type === "credentials" && method === "POST") {
326
+ const credentials = body ?? {}
327
+
328
+ // TODO: Forward the original request as is, instead of reconstructing it
329
+ Object.entries(query ?? {}).forEach(([k, v]) =>
330
+ url.searchParams.set(k, v)
331
+ )
332
+ const userFromAuthorize = await provider.authorize(
333
+ credentials,
334
+ // prettier-ignore
335
+ new Request(url, { headers, method, body: JSON.stringify(body) })
336
+ )
337
+ const user = userFromAuthorize
338
+
339
+ if (!user) throw new CredentialsSignin()
340
+ else user.id = user.id?.toString() ?? crypto.randomUUID()
341
+
342
+ const account = {
343
+ providerAccountId: user.id,
344
+ type: "credentials",
345
+ provider: provider.id,
346
+ } satisfies Account
347
+
348
+ const redirect = await handleAuthorized(
349
+ { user, account, credentials },
350
+ options
351
+ )
352
+ if (redirect) return { redirect, cookies }
353
+
354
+ const defaultToken = {
355
+ name: user.name,
356
+ email: user.email,
357
+ picture: user.image,
358
+ sub: user.id,
359
+ }
360
+
361
+ const token = await callbacks.jwt({
362
+ token: defaultToken,
363
+ user,
364
+ account,
365
+ isNewUser: false,
366
+ trigger: "signIn",
367
+ })
368
+
369
+ // Clear cookies if token is null
370
+ if (token === null) {
371
+ cookies.push(...sessionStore.clean())
372
+ } else {
373
+ const salt = options.cookies.sessionToken.name
374
+ // Encode token
375
+ const newToken = await jwt.encode({ ...jwt, token, salt })
376
+
377
+ // Set cookie expiry date
378
+ const cookieExpires = new Date()
379
+ cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
380
+
381
+ const sessionCookies = sessionStore.chunk(newToken, {
382
+ expires: cookieExpires,
383
+ })
384
+
385
+ cookies.push(...sessionCookies)
386
+ }
387
+
388
+ await events.signIn?.({ user, account })
389
+
390
+ return { redirect: callbackUrl, cookies }
391
+ } else if (provider.type === "webauthn" && method === "POST") {
392
+ // Get callback action from request. It should be either "authenticate" or "register"
393
+ const action = request.body?.action
394
+ if (
395
+ typeof action !== "string" ||
396
+ (action !== "authenticate" && action !== "register")
397
+ ) {
398
+ throw new AuthError("Invalid action parameter")
399
+ }
400
+ // Return an error if the adapter is missing or if the provider
401
+ // is not a webauthn provider.
402
+ const localOptions = assertInternalOptionsWebAuthn(options)
403
+
404
+ // Verify request to get user, account and authenticator
405
+ let user: User
406
+ let account: Account
407
+ let authenticator: Authenticator | undefined
408
+ switch (action) {
409
+ case "authenticate": {
410
+ const verified = await verifyAuthenticate(
411
+ localOptions,
412
+ request,
413
+ cookies
414
+ )
415
+
416
+ user = verified.user
417
+ account = verified.account
418
+
419
+ break
420
+ }
421
+ case "register": {
422
+ const verified = await verifyRegister(options, request, cookies)
423
+
424
+ user = verified.user
425
+ account = verified.account
426
+ authenticator = verified.authenticator
427
+
428
+ break
429
+ }
430
+ }
431
+
432
+ // Check if user is allowed to sign in
433
+ await handleAuthorized({ user, account }, options)
434
+
435
+ // Sign user in, creating them and their account if needed
436
+ const {
437
+ user: loggedInUser,
438
+ isNewUser,
439
+ session,
440
+ account: currentAccount,
441
+ } = await handleLoginOrRegister(
442
+ sessionStore.value,
443
+ user,
444
+ account,
445
+ options
446
+ )
447
+
448
+ if (!currentAccount) {
449
+ // This is mostly for type checking. It should never actually happen.
450
+ throw new AuthError("Error creating or finding account")
451
+ }
452
+
453
+ // Create new authenticator if needed
454
+ if (authenticator && loggedInUser.id) {
455
+ await localOptions.adapter.createAuthenticator({
456
+ ...authenticator,
457
+ userId: loggedInUser.id,
458
+ })
459
+ }
460
+
461
+ // Do the session registering dance
462
+ if (useJwtSession) {
463
+ const defaultToken = {
464
+ name: loggedInUser.name,
465
+ email: loggedInUser.email,
466
+ picture: loggedInUser.image,
467
+ sub: loggedInUser.id?.toString(),
468
+ }
469
+ const token = await callbacks.jwt({
470
+ token: defaultToken,
471
+ user: loggedInUser,
472
+ account: currentAccount,
473
+ isNewUser,
474
+ trigger: isNewUser ? "signUp" : "signIn",
475
+ })
476
+
477
+ // Clear cookies if token is null
478
+ if (token === null) {
479
+ cookies.push(...sessionStore.clean())
480
+ } else {
481
+ const salt = options.cookies.sessionToken.name
482
+ // Encode token
483
+ const newToken = await jwt.encode({ ...jwt, token, salt })
484
+
485
+ // Set cookie expiry date
486
+ const cookieExpires = new Date()
487
+ cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
488
+
489
+ const sessionCookies = sessionStore.chunk(newToken, {
490
+ expires: cookieExpires,
491
+ })
492
+ cookies.push(...sessionCookies)
493
+ }
494
+ } else {
495
+ // Save Session Token in cookie
496
+ cookies.push({
497
+ name: options.cookies.sessionToken.name,
498
+ value: (session as AdapterSession).sessionToken,
499
+ options: {
500
+ ...options.cookies.sessionToken.options,
501
+ expires: (session as AdapterSession).expires,
502
+ },
503
+ })
504
+ }
505
+
506
+ await events.signIn?.({
507
+ user: loggedInUser,
508
+ account: currentAccount,
509
+ isNewUser,
510
+ })
511
+
512
+ // Handle first logins on new accounts
513
+ // e.g. option to send users to a new account landing page on initial login
514
+ // Note that the callback URL is preserved, so the journey can still be resumed
515
+ if (isNewUser && pages.newUser) {
516
+ return {
517
+ redirect: `${pages.newUser}${
518
+ pages.newUser.includes("?") ? "&" : "?"
519
+ }${new URLSearchParams({ callbackUrl })}`,
520
+ cookies,
521
+ }
522
+ }
523
+
524
+ // Callback URL is already verified at this point, so safe to use if specified
525
+ return { redirect: callbackUrl, cookies }
526
+ }
527
+
528
+ throw new InvalidProvider(
529
+ `Callback for provider type (${provider.type}) is not supported`
530
+ )
531
+ } catch (e) {
532
+ if (e instanceof AuthError) throw e
533
+ const error = new CallbackRouteError(e as Error, { provider: provider.id })
534
+ logger.debug("callback route error details", { method, query, body })
535
+ throw error
536
+ }
537
+ }
538
+
539
+ async function handleAuthorized(
540
+ params: Parameters<InternalOptions["callbacks"]["signIn"]>[0],
541
+ config: InternalOptions
542
+ ): Promise<string | undefined> {
543
+ let authorized
544
+ const { signIn, redirect } = config.callbacks
545
+ try {
546
+ authorized = await signIn(params)
547
+ } catch (e) {
548
+ if (e instanceof AuthError) throw e
549
+ throw new AccessDenied(e as Error)
550
+ }
551
+ if (!authorized) throw new AccessDenied("AccessDenied")
552
+ if (typeof authorized !== "string") return
553
+ return await redirect({ url: authorized, baseUrl: config.url.origin })
554
+ }