@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,113 @@
1
+ import type { AuthAction } from "../../types.js"
2
+ import type { AuthConfig } from "../../index.js"
3
+ import { setLogger } from "./logger.js"
4
+
5
+ /**
6
+ * Set default env variables on the config object
7
+ * @param suppressWarnings intended for framework authors.
8
+ */
9
+ export function setEnvDefaults(
10
+ envObject: any,
11
+ config: AuthConfig,
12
+ suppressBasePathWarning = false
13
+ ) {
14
+ try {
15
+ const url = envObject.AUTH_URL
16
+ if (url) {
17
+ if (config.basePath) {
18
+ if (!suppressBasePathWarning) {
19
+ const logger = setLogger(config)
20
+ logger.warn("env-url-basepath-redundant")
21
+ }
22
+ } else {
23
+ config.basePath = new URL(url).pathname
24
+ }
25
+ }
26
+ } catch {
27
+ // Catching and swallowing potential URL parsing errors, we'll fall
28
+ // back to `/auth` below.
29
+ } finally {
30
+ config.basePath ??= `/auth`
31
+ }
32
+
33
+ if (!config.secret?.length) {
34
+ config.secret = []
35
+ const secret = envObject.AUTH_SECRET
36
+ if (secret) config.secret.push(secret)
37
+ for (const i of [1, 2, 3]) {
38
+ const secret = envObject[`AUTH_SECRET_${i}`]
39
+ if (secret) config.secret.unshift(secret)
40
+ }
41
+ }
42
+
43
+ config.redirectProxyUrl ??= envObject.AUTH_REDIRECT_PROXY_URL
44
+ config.trustHost ??= !!(
45
+ envObject.AUTH_URL ??
46
+ envObject.AUTH_TRUST_HOST ??
47
+ envObject.VERCEL ??
48
+ envObject.CF_PAGES ??
49
+ envObject.NODE_ENV !== "production"
50
+ )
51
+ config.providers = config.providers.map((provider) => {
52
+ const { id } = typeof provider === "function" ? provider({}) : provider
53
+ const ID = id.toUpperCase().replace(/-/g, "_")
54
+ const clientId = envObject[`AUTH_${ID}_ID`]
55
+ const clientSecret = envObject[`AUTH_${ID}_SECRET`]
56
+ const issuer = envObject[`AUTH_${ID}_ISSUER`]
57
+ const apiKey = envObject[`AUTH_${ID}_KEY`]
58
+ const finalProvider =
59
+ typeof provider === "function"
60
+ ? provider({ clientId, clientSecret, issuer, apiKey })
61
+ : provider
62
+ if (finalProvider.type === "oauth" || finalProvider.type === "oidc") {
63
+ finalProvider.clientId ??= clientId
64
+ finalProvider.clientSecret ??= clientSecret
65
+ finalProvider.issuer ??= issuer
66
+ } else if (finalProvider.type === "email") {
67
+ finalProvider.apiKey ??= apiKey
68
+ }
69
+ return finalProvider
70
+ })
71
+ }
72
+
73
+ export function createActionURL(
74
+ action: AuthAction,
75
+ protocol: string,
76
+ headers: Headers,
77
+ envObject: any,
78
+ config: Pick<AuthConfig, "basePath" | "logger">
79
+ ): URL {
80
+ const basePath = config?.basePath
81
+ const envUrl = envObject.AUTH_URL ?? envObject.NEXTAUTH_URL
82
+
83
+ let url: URL
84
+ if (envUrl) {
85
+ url = new URL(envUrl)
86
+ if (basePath && basePath !== "/" && url.pathname !== "/") {
87
+ if (url.pathname !== basePath) {
88
+ const logger = setLogger(config)
89
+ logger.warn("env-url-basepath-mismatch")
90
+ }
91
+ url.pathname = "/"
92
+ }
93
+ } else {
94
+ const detectedHost = headers.get("x-forwarded-host") ?? headers.get("host")
95
+ const detectedProtocol =
96
+ headers.get("x-forwarded-proto") ?? protocol ?? "https"
97
+ const _protocol = detectedProtocol.endsWith(":")
98
+ ? detectedProtocol
99
+ : detectedProtocol + ":"
100
+
101
+ url = new URL(`${_protocol}//${detectedHost}`)
102
+ }
103
+
104
+ // remove trailing slash
105
+ const sanitizedUrl = url.toString().replace(/\/$/, "")
106
+
107
+ if (basePath) {
108
+ // remove leading and trailing slash
109
+ const sanitizedBasePath = basePath?.replace(/(^\/|\/$)/g, "") ?? ""
110
+ return new URL(`${sanitizedUrl}/${sanitizedBasePath}/${action}`)
111
+ }
112
+ return new URL(`${sanitizedUrl}/${action}`)
113
+ }
@@ -0,0 +1,75 @@
1
+ import { AuthError } from "../../errors.js"
2
+ import type { WarningCode } from "../../warnings.js"
3
+ import type { AuthConfig } from "../../index.js"
4
+
5
+ /**
6
+ * Override any of the methods, and the rest will use the default logger.
7
+ *
8
+ * [Documentation](https://authjs.dev/reference/core#authconfig#logger)
9
+ */
10
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
11
+ export interface LoggerInstance extends Record<string, Function> {
12
+ warn: (code: WarningCode) => void
13
+ error: (error: Error) => void
14
+ debug: (message: string, metadata?: unknown) => void
15
+ }
16
+
17
+ const red = "\x1b[31m"
18
+ const yellow = "\x1b[33m"
19
+ const grey = "\x1b[90m"
20
+ const reset = "\x1b[0m"
21
+
22
+ const defaultLogger: LoggerInstance = {
23
+ error(error) {
24
+ const name = error instanceof AuthError ? error.type : error.name
25
+ console.error(`${red}[auth][error]${reset} ${name}: ${error.message}`)
26
+ if (
27
+ error.cause &&
28
+ typeof error.cause === "object" &&
29
+ "err" in error.cause &&
30
+ error.cause.err instanceof Error
31
+ ) {
32
+ const { err, ...data } = error.cause
33
+ console.error(`${red}[auth][cause]${reset}:`, err.stack)
34
+ if (data)
35
+ console.error(
36
+ `${red}[auth][details]${reset}:`,
37
+ JSON.stringify(data, null, 2)
38
+ )
39
+ } else if (error.stack) {
40
+ console.error(error.stack.replace(/.*/, "").substring(1))
41
+ }
42
+ },
43
+ warn(code) {
44
+ const url = `https://warnings.authjs.dev`
45
+ console.warn(`${yellow}[auth][warn][${code}]${reset}`, `Read more: ${url}`)
46
+ },
47
+ debug(message, metadata) {
48
+ console.log(
49
+ `${grey}[auth][debug]:${reset} ${message}`,
50
+ JSON.stringify(metadata, null, 2)
51
+ )
52
+ },
53
+ }
54
+
55
+ /**
56
+ * Override the built-in logger with user's implementation.
57
+ * Any `undefined` level will use the default logger.
58
+ */
59
+ export function setLogger(
60
+ config: Pick<AuthConfig, "logger" | "debug">
61
+ ): LoggerInstance {
62
+ const newLogger: LoggerInstance = {
63
+ ...defaultLogger,
64
+ }
65
+
66
+ // Turn off debug logging if `debug` isn't set to `true`
67
+ if (!config.debug) newLogger.debug = () => {}
68
+
69
+ if (config.logger?.error) newLogger.error = config.logger.error
70
+ if (config.logger?.warn) newLogger.warn = config.logger.warn
71
+ if (config.logger?.debug) newLogger.debug = config.logger.debug
72
+
73
+ config.logger ??= newLogger
74
+ return newLogger
75
+ }
@@ -0,0 +1,30 @@
1
+ function isObject(item: unknown): item is object {
2
+ return item !== null && typeof item === "object"
3
+ }
4
+
5
+ /** Deep merge two or more objects */
6
+ export function merge<T extends Record<string, unknown>>(
7
+ target: T,
8
+ ...sources: Array<Record<string, unknown> | undefined>
9
+ ): T & Record<string, unknown> {
10
+ if (!sources.length) return target
11
+ const source = sources.shift()
12
+
13
+ if (isObject(target) && isObject(source)) {
14
+ for (const key in source) {
15
+ if (isObject(source[key])) {
16
+ if (!isObject(target[key]))
17
+ (target as Record<string, unknown>)[key] = Array.isArray(source[key])
18
+ ? []
19
+ : {}
20
+ merge(
21
+ (target as Record<string, unknown>)[key] as T,
22
+ source[key] as Record<string, unknown>
23
+ )
24
+ } else if (source[key] !== undefined)
25
+ (target as Record<string, unknown>)[key] = source[key]
26
+ }
27
+ }
28
+
29
+ return merge(target, ...sources)
30
+ }
@@ -0,0 +1,203 @@
1
+ import { merge } from "./merge.js"
2
+
3
+ import type {
4
+ AccountCallback,
5
+ OAuthConfig,
6
+ OAuthConfigInternal,
7
+ OAuthEndpointType,
8
+ OAuthUserConfig,
9
+ ProfileCallback,
10
+ } from "../../providers/index.js"
11
+ import type { InternalProvider, Profile } from "../../types.js"
12
+ import { type AuthConfig } from "../../index.js"
13
+ import { customFetch } from "../symbols.js"
14
+
15
+ /**
16
+ * Adds `signinUrl` and `callbackUrl` to each provider
17
+ * and deep merge user-defined options.
18
+ */
19
+ export default function parseProviders(params: {
20
+ url: URL
21
+ providerId?: string
22
+ config: AuthConfig
23
+ }): {
24
+ providers: InternalProvider[]
25
+ provider?: InternalProvider
26
+ } {
27
+ const { providerId, config } = params
28
+ const url = new URL(config.basePath ?? "/auth", params.url.origin)
29
+
30
+ const providers = config.providers.map((p) => {
31
+ const provider = typeof p === "function" ? p() : p
32
+ const { options: userOptions, ...defaults } = provider
33
+
34
+ const id = (userOptions?.id ?? defaults.id) as string
35
+ // TODO: Support if properties have different types, e.g. authorization: string or object
36
+ const merged = merge(defaults, userOptions, {
37
+ signinUrl: `${url}/signin/${id}`,
38
+ callbackUrl: `${url}/callback/${id}`,
39
+ })
40
+
41
+ if (provider.type === "oauth" || provider.type === "oidc") {
42
+ merged.redirectProxyUrl ??=
43
+ userOptions?.redirectProxyUrl ?? config.redirectProxyUrl
44
+
45
+ const normalized = normalizeOAuth(merged) as InternalProvider<
46
+ "oauth" | "oidc"
47
+ >
48
+ // We currently don't support redirect proxies for response_mode=form_post
49
+ if (
50
+ normalized.authorization?.url.searchParams.get("response_mode") ===
51
+ "form_post"
52
+ ) {
53
+ delete normalized.redirectProxyUrl
54
+ }
55
+
56
+ // @ts-expect-error Symbols don't get merged by the `merge` function
57
+ // so we need to do it manually.
58
+ normalized[customFetch] ??= userOptions?.[customFetch]
59
+ return normalized
60
+ }
61
+
62
+ return merged as InternalProvider
63
+ })
64
+
65
+ const provider = providers.find(({ id }) => id === providerId)
66
+ if (providerId && !provider) {
67
+ const availableProviders = providers.map((p) => p.id).join(", ")
68
+ throw new Error(
69
+ `Provider with id "${providerId}" not found. Available providers: [${availableProviders}].`
70
+ )
71
+ }
72
+
73
+ return { providers, provider }
74
+ }
75
+
76
+ // TODO: Also add discovery here, if some endpoints/config are missing.
77
+ // We should return both a client and authorization server config.
78
+ function normalizeOAuth(
79
+ c: OAuthConfig<any> | OAuthUserConfig<any>
80
+ ): OAuthConfigInternal<any> | object {
81
+ if (c.issuer) c.wellKnown ??= `${c.issuer}/.well-known/openid-configuration`
82
+
83
+ const authorization = normalizeEndpoint(c.authorization, c.issuer)
84
+ if (authorization && !authorization.url?.searchParams.has("scope")) {
85
+ authorization.url.searchParams.set("scope", "openid profile email")
86
+ }
87
+
88
+ const token = normalizeEndpoint(c.token, c.issuer)
89
+
90
+ const userinfo = normalizeEndpoint(c.userinfo, c.issuer)
91
+
92
+ const checks = c.checks ?? ["pkce"]
93
+ if (c.redirectProxyUrl) {
94
+ if (!checks.includes("state")) checks.push("state")
95
+ c.redirectProxyUrl = `${c.redirectProxyUrl}/callback/${c.id}`
96
+ }
97
+
98
+ return {
99
+ ...c,
100
+ authorization,
101
+ token,
102
+ checks,
103
+ userinfo,
104
+ profile: c.profile ?? defaultProfile,
105
+ account: c.account ?? defaultAccount,
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Returns basic user profile from the userinfo response/`id_token` claims.
111
+ * The returned `id` will become the `account.providerAccountId`. `user.id`
112
+ * and `account.id` are auto-generated UUID's.
113
+ *
114
+ * The result if this function is used to create the `User` in the database.
115
+ * @see https://authjs.dev/reference/core/adapters#user
116
+ * @see https://openid.net/specs/openid-connect-core-1_0.html#IDToken
117
+ * @see https://openid.net/specs/openid-connect-core-1_0.html#
118
+ */
119
+ const defaultProfile: ProfileCallback<Profile> = (profile) => {
120
+ return stripUndefined({
121
+ id: profile.sub ?? profile.id ?? crypto.randomUUID(),
122
+ name: profile.name ?? profile.nickname ?? profile.preferred_username,
123
+ email: profile.email,
124
+ image: profile.picture,
125
+ })
126
+ }
127
+
128
+ /**
129
+ * Returns basic OAuth/OIDC values from the token response.
130
+ * @see https://www.ietf.org/rfc/rfc6749.html#section-5.1
131
+ * @see https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse
132
+ * @see https://authjs.dev/reference/core/adapters#account
133
+ */
134
+ const defaultAccount: AccountCallback = (account) => {
135
+ return stripUndefined({
136
+ access_token: account.access_token,
137
+ id_token: account.id_token,
138
+ refresh_token: account.refresh_token,
139
+ expires_at: account.expires_at,
140
+ scope: account.scope,
141
+ token_type: account.token_type,
142
+ session_state: account.session_state,
143
+ })
144
+ }
145
+
146
+ function stripUndefined<T extends object>(o: T): T {
147
+ const result = {} as any
148
+ for (const [k, v] of Object.entries(o)) {
149
+ if (v !== undefined) result[k] = v
150
+ }
151
+ return result as T
152
+ }
153
+
154
+ function normalizeEndpoint(
155
+ e?: OAuthConfig<any>[OAuthEndpointType],
156
+ issuer?: string
157
+ ): OAuthConfigInternal<any>[OAuthEndpointType] {
158
+ if (!e && issuer) return
159
+ if (typeof e === "string") {
160
+ return { url: new URL(e) }
161
+ }
162
+ // If e.url is undefined, it's because the provider config
163
+ // assumes that we will use the issuer endpoint.
164
+ // The existence of either e.url or provider.issuer is checked in
165
+ // assert.ts. We fallback to "https://authjs.dev" to be able to pass around
166
+ // a valid URL even if the user only provided params.
167
+ // NOTE: This need to be checked when constructing the URL
168
+ // for the authorization, token and userinfo endpoints.
169
+ const url = new URL(e?.url ?? "https://authjs.dev")
170
+ if (e?.params != null) {
171
+ for (let [key, value] of Object.entries(e.params)) {
172
+ if (key === "claims") {
173
+ value = JSON.stringify(value)
174
+ }
175
+ url.searchParams.set(key, String(value))
176
+ }
177
+ }
178
+ return {
179
+ url,
180
+ request: e?.request,
181
+ conform: e?.conform,
182
+ ...(e?.clientPrivateKey ? { clientPrivateKey: e?.clientPrivateKey } : null),
183
+ }
184
+ }
185
+
186
+ export function isOIDCProvider(
187
+ provider: InternalProvider<"oidc" | "oauth">
188
+ ): provider is InternalProvider<"oidc"> {
189
+ return provider.type === "oidc"
190
+ }
191
+
192
+ export function isOAuth2Provider(
193
+ provider: InternalProvider<"oidc" | "oauth">
194
+ ): provider is InternalProvider<"oauth"> {
195
+ return provider.type === "oauth"
196
+ }
197
+
198
+ /** Either OAuth 2 or OIDC */
199
+ export function isOAuthProvider(
200
+ provider: InternalProvider<any>
201
+ ): provider is InternalProvider<"oauth" | "oidc"> {
202
+ return provider.type === "oauth" || provider.type === "oidc"
203
+ }
@@ -0,0 +1,41 @@
1
+ import type { InternalOptions, User } from "../../types.js"
2
+ import type { SessionStore } from "./cookie.js"
3
+
4
+ /**
5
+ * Returns the currently logged in user, if any.
6
+ */
7
+ export async function getLoggedInUser(
8
+ options: InternalOptions,
9
+ sessionStore: SessionStore
10
+ ): Promise<User | null> {
11
+ const {
12
+ adapter,
13
+ jwt,
14
+ session: { strategy: sessionStrategy },
15
+ } = options
16
+
17
+ const sessionToken = sessionStore.value
18
+ if (!sessionToken) return null
19
+
20
+ // Try to decode JWT
21
+ if (sessionStrategy === "jwt") {
22
+ const salt = options.cookies.sessionToken.name
23
+ const payload = await jwt.decode({ ...jwt, token: sessionToken, salt })
24
+
25
+ if (payload && payload.sub) {
26
+ return {
27
+ id: payload.sub,
28
+ name: payload.name,
29
+ email: payload.email,
30
+ image: payload.picture,
31
+ }
32
+ }
33
+ } else {
34
+ const userAndSession = await adapter?.getSessionAndUser(sessionToken)
35
+ if (userAndSession) {
36
+ return userAndSession.user
37
+ }
38
+ }
39
+
40
+ return null
41
+ }
@@ -0,0 +1,151 @@
1
+ import * as cookie from "../vendored/cookie.js"
2
+ import { UnknownAction } from "../../errors.js"
3
+ import { setLogger } from "./logger.js"
4
+
5
+ import type {
6
+ AuthAction,
7
+ RequestInternal,
8
+ ResponseInternal,
9
+ } from "../../types.js"
10
+ import { isAuthAction } from "./actions.js"
11
+ import type { AuthConfig } from "../../index.js"
12
+
13
+ const { parse: parseCookie, serialize: serializeCookie } = cookie
14
+
15
+ async function getBody(req: Request): Promise<Record<string, any> | undefined> {
16
+ if (!("body" in req) || !req.body || req.method !== "POST") return
17
+
18
+ const contentType = req.headers.get("content-type")
19
+ if (contentType?.includes("application/json")) {
20
+ return await req.json()
21
+ } else if (contentType?.includes("application/x-www-form-urlencoded")) {
22
+ const params = new URLSearchParams(await req.text())
23
+ return Object.fromEntries(params)
24
+ }
25
+ }
26
+
27
+ export async function toInternalRequest(
28
+ req: Request,
29
+ config: AuthConfig
30
+ ): Promise<RequestInternal | undefined> {
31
+ try {
32
+ if (req.method !== "GET" && req.method !== "POST")
33
+ throw new UnknownAction("Only GET and POST requests are supported")
34
+
35
+ // Defaults are usually set in the `init` function, but this is needed below
36
+ config.basePath ??= "/auth"
37
+
38
+ const url = new URL(req.url)
39
+
40
+ const { action, providerId } = parseActionAndProviderId(
41
+ url.pathname,
42
+ config.basePath
43
+ )
44
+
45
+ return {
46
+ url,
47
+ action,
48
+ providerId,
49
+ method: req.method,
50
+ headers: Object.fromEntries(req.headers),
51
+ body: req.body ? await getBody(req) : undefined,
52
+ cookies: parseCookie(req.headers.get("cookie") ?? "") ?? {},
53
+ error: url.searchParams.get("error") ?? undefined,
54
+ query: Object.fromEntries(url.searchParams),
55
+ }
56
+ } catch (e) {
57
+ const logger = setLogger(config)
58
+ logger.error(e as Error)
59
+ logger.debug("request", req)
60
+ }
61
+ }
62
+
63
+ export function toRequest(request: RequestInternal): Request {
64
+ return new Request(request.url, {
65
+ headers: request.headers,
66
+ method: request.method,
67
+ body:
68
+ request.method === "POST"
69
+ ? JSON.stringify(request.body ?? {})
70
+ : undefined,
71
+ })
72
+ }
73
+
74
+ export function toResponse(res: ResponseInternal): Response {
75
+ const headers = new Headers(res.headers)
76
+
77
+ res.cookies?.forEach((cookie) => {
78
+ const { name, value, options } = cookie
79
+ const cookieHeader = serializeCookie(name, value, options)
80
+ if (headers.has("Set-Cookie")) headers.append("Set-Cookie", cookieHeader)
81
+ else headers.set("Set-Cookie", cookieHeader)
82
+ })
83
+
84
+ let body = res.body
85
+
86
+ if (headers.get("content-type") === "application/json")
87
+ body = JSON.stringify(res.body)
88
+ else if (headers.get("content-type") === "application/x-www-form-urlencoded")
89
+ body = new URLSearchParams(res.body).toString()
90
+
91
+ const status = res.redirect ? 302 : (res.status ?? 200)
92
+ const response = new Response(body, { headers, status })
93
+
94
+ if (res.redirect) response.headers.set("Location", res.redirect)
95
+
96
+ return response
97
+ }
98
+
99
+ /** Web compatible method to create a hash, using SHA256 */
100
+ export async function createHash(message: string) {
101
+ const data = new TextEncoder().encode(message)
102
+ const hash = await crypto.subtle.digest("SHA-256", data)
103
+ return Array.from(new Uint8Array(hash))
104
+ .map((b) => b.toString(16).padStart(2, "0"))
105
+ .join("")
106
+ .toString()
107
+ }
108
+
109
+ /** Web compatible method to create a random string of a given length */
110
+ export function randomString(size: number) {
111
+ const i2hex = (i: number) => ("0" + i.toString(16)).slice(-2)
112
+ const r = (a: string, i: number): string => a + i2hex(i)
113
+ const bytes = crypto.getRandomValues(new Uint8Array(size))
114
+ return Array.from(bytes).reduce(r, "")
115
+ }
116
+
117
+ /** @internal Parse the action and provider id from a URL pathname. */
118
+ export function parseActionAndProviderId(
119
+ pathname: string,
120
+ base: string
121
+ ): {
122
+ action: AuthAction
123
+ providerId?: string
124
+ } {
125
+ const a = pathname.match(new RegExp(`^${base}(.+)`))
126
+
127
+ if (a === null) throw new UnknownAction(`Cannot parse action at ${pathname}`)
128
+
129
+ const actionAndProviderId = a.at(-1)!
130
+
131
+ const b = actionAndProviderId.replace(/^\//, "").split("/").filter(Boolean)
132
+
133
+ if (b.length !== 1 && b.length !== 2)
134
+ throw new UnknownAction(`Cannot parse action at ${pathname}`)
135
+
136
+ const [action, providerId] = b
137
+
138
+ if (!isAuthAction(action))
139
+ throw new UnknownAction(`Cannot parse action at ${pathname}`)
140
+
141
+ if (
142
+ providerId &&
143
+ !["signin", "callback", "webauthn-options"].includes(action)
144
+ )
145
+ throw new UnknownAction(`Cannot parse action at ${pathname}`)
146
+
147
+ return {
148
+ action,
149
+ providerId: providerId == "undefined" ? undefined : providerId,
150
+ }
151
+ }