@robelest/convex-auth 0.0.4-preview.18 → 0.0.4-preview.19

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 (541) hide show
  1. package/README.md +6 -3
  2. package/dist/authorization/index.d.ts +46 -0
  3. package/dist/authorization/index.d.ts.map +1 -1
  4. package/dist/authorization/index.js +46 -0
  5. package/dist/authorization/index.js.map +1 -1
  6. package/dist/bin.cjs +21 -13
  7. package/dist/client/core/types.d.ts +20 -0
  8. package/dist/client/core/types.d.ts.map +1 -0
  9. package/dist/client/index.d.ts +2 -16
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +67 -565
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +40 -12
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +1306 -1344
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/client/core/types.d.ts +2 -0
  19. package/dist/component/client/index.d.ts +2 -2
  20. package/dist/component/model.d.ts +80 -80
  21. package/dist/component/model.d.ts.map +1 -1
  22. package/dist/component/model.js +5 -1
  23. package/dist/component/model.js.map +1 -1
  24. package/dist/component/providers/credentials.d.ts +3 -2
  25. package/dist/component/providers/credentials.d.ts.map +1 -1
  26. package/dist/component/providers/email.d.ts +30 -0
  27. package/dist/component/providers/email.d.ts.map +1 -1
  28. package/dist/component/providers/phone.d.ts +28 -0
  29. package/dist/component/providers/phone.d.ts.map +1 -1
  30. package/dist/component/public/enterprise/audit.d.ts +73 -0
  31. package/dist/component/public/enterprise/audit.d.ts.map +1 -0
  32. package/dist/component/public/enterprise/audit.js +108 -0
  33. package/dist/component/public/enterprise/audit.js.map +1 -0
  34. package/dist/component/public/enterprise/core.d.ts +176 -0
  35. package/dist/component/public/enterprise/core.d.ts.map +1 -0
  36. package/dist/component/public/enterprise/core.js +292 -0
  37. package/dist/component/public/enterprise/core.js.map +1 -0
  38. package/dist/component/public/enterprise/domains.d.ts +174 -0
  39. package/dist/component/public/enterprise/domains.d.ts.map +1 -0
  40. package/dist/component/public/enterprise/domains.js +271 -0
  41. package/dist/component/public/enterprise/domains.js.map +1 -0
  42. package/dist/component/public/enterprise/scim.d.ts +245 -0
  43. package/dist/component/public/enterprise/scim.d.ts.map +1 -0
  44. package/dist/component/public/enterprise/scim.js +344 -0
  45. package/dist/component/public/enterprise/scim.js.map +1 -0
  46. package/dist/component/public/enterprise/secrets.d.ts +78 -0
  47. package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
  48. package/dist/component/public/enterprise/secrets.js +118 -0
  49. package/dist/component/public/enterprise/secrets.js.map +1 -0
  50. package/dist/component/public/enterprise/webhooks.d.ts +211 -0
  51. package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
  52. package/dist/component/public/enterprise/webhooks.js +300 -0
  53. package/dist/component/public/enterprise/webhooks.js.map +1 -0
  54. package/dist/component/public/factors/devices.d.ts +157 -0
  55. package/dist/component/public/factors/devices.d.ts.map +1 -0
  56. package/dist/component/public/factors/devices.js +216 -0
  57. package/dist/component/public/factors/devices.js.map +1 -0
  58. package/dist/component/public/factors/passkeys.d.ts +175 -0
  59. package/dist/component/public/factors/passkeys.d.ts.map +1 -0
  60. package/dist/component/public/factors/passkeys.js +238 -0
  61. package/dist/component/public/factors/passkeys.js.map +1 -0
  62. package/dist/component/public/factors/totp.d.ts +189 -0
  63. package/dist/component/public/factors/totp.d.ts.map +1 -0
  64. package/dist/component/public/factors/totp.js +254 -0
  65. package/dist/component/public/factors/totp.js.map +1 -0
  66. package/dist/component/public/groups/core.d.ts +137 -0
  67. package/dist/component/public/groups/core.d.ts.map +1 -0
  68. package/dist/component/public/groups/core.js +321 -0
  69. package/dist/component/public/groups/core.js.map +1 -0
  70. package/dist/component/public/groups/invites.d.ts +217 -0
  71. package/dist/component/public/groups/invites.d.ts.map +1 -0
  72. package/dist/component/public/groups/invites.js +457 -0
  73. package/dist/component/public/groups/invites.js.map +1 -0
  74. package/dist/component/public/groups/members.d.ts +204 -0
  75. package/dist/component/public/groups/members.d.ts.map +1 -0
  76. package/dist/component/public/groups/members.js +355 -0
  77. package/dist/component/public/groups/members.js.map +1 -0
  78. package/dist/component/public/identity/accounts.d.ts +147 -0
  79. package/dist/component/public/identity/accounts.d.ts.map +1 -0
  80. package/dist/component/public/identity/accounts.js +200 -0
  81. package/dist/component/public/identity/accounts.js.map +1 -0
  82. package/dist/component/public/identity/codes.d.ts +104 -0
  83. package/dist/component/public/identity/codes.d.ts.map +1 -0
  84. package/dist/component/public/identity/codes.js +140 -0
  85. package/dist/component/public/identity/codes.js.map +1 -0
  86. package/dist/component/public/identity/sessions.d.ts +128 -0
  87. package/dist/component/public/identity/sessions.d.ts.map +1 -0
  88. package/dist/component/public/identity/sessions.js +192 -0
  89. package/dist/component/public/identity/sessions.js.map +1 -0
  90. package/dist/component/public/identity/tokens.d.ts +169 -0
  91. package/dist/component/public/identity/tokens.d.ts.map +1 -0
  92. package/dist/component/public/identity/tokens.js +227 -0
  93. package/dist/component/public/identity/tokens.js.map +1 -0
  94. package/dist/component/public/identity/users.d.ts +212 -0
  95. package/dist/component/public/identity/users.d.ts.map +1 -0
  96. package/dist/component/public/identity/users.js +311 -0
  97. package/dist/component/public/identity/users.js.map +1 -0
  98. package/dist/component/public/identity/verifiers.d.ts +116 -0
  99. package/dist/component/public/identity/verifiers.d.ts.map +1 -0
  100. package/dist/component/public/identity/verifiers.js +154 -0
  101. package/dist/component/public/identity/verifiers.js.map +1 -0
  102. package/dist/component/public/security/keys.d.ts +209 -0
  103. package/dist/component/public/security/keys.d.ts.map +1 -0
  104. package/dist/component/public/security/keys.js +319 -0
  105. package/dist/component/public/security/keys.js.map +1 -0
  106. package/dist/component/public/security/limits.d.ts +114 -0
  107. package/dist/component/public/security/limits.d.ts.map +1 -0
  108. package/dist/component/public/security/limits.js +169 -0
  109. package/dist/component/public/security/limits.js.map +1 -0
  110. package/dist/component/public.d.ts +22 -7
  111. package/dist/component/public.js +21 -6
  112. package/dist/component/schema.d.ts +288 -288
  113. package/dist/component/server/auth.d.ts +212 -25
  114. package/dist/component/server/auth.d.ts.map +1 -1
  115. package/dist/component/server/auth.js +68 -4
  116. package/dist/component/server/auth.js.map +1 -1
  117. package/dist/component/server/authError.js +34 -0
  118. package/dist/component/server/authError.js.map +1 -0
  119. package/dist/component/server/{providers.js → config.js} +2 -2
  120. package/dist/component/server/config.js.map +1 -0
  121. package/dist/component/server/{domains/core.js → core.js} +107 -88
  122. package/dist/component/server/core.js.map +1 -0
  123. package/dist/component/server/{provider.js → crypto.js} +3 -3
  124. package/dist/component/server/crypto.js.map +1 -0
  125. package/dist/component/server/device.js +1 -1
  126. package/dist/component/server/device.js.map +1 -1
  127. package/dist/component/server/enterprise/config.js +46 -0
  128. package/dist/component/server/enterprise/config.js.map +1 -0
  129. package/dist/component/server/{domains/sso.js → enterprise/domain.js} +6 -5
  130. package/dist/component/server/enterprise/domain.js.map +1 -0
  131. package/dist/component/server/enterprise/http.js +766 -0
  132. package/dist/component/server/enterprise/http.js.map +1 -0
  133. package/dist/component/server/enterprise/oidc.js +248 -0
  134. package/dist/component/server/enterprise/oidc.js.map +1 -0
  135. package/dist/component/server/enterprise/policy.js +85 -0
  136. package/dist/component/server/enterprise/policy.js.map +1 -0
  137. package/dist/component/server/enterprise/saml.js +338 -0
  138. package/dist/component/server/enterprise/saml.js.map +1 -0
  139. package/dist/component/server/enterprise/scim.js +97 -0
  140. package/dist/component/server/enterprise/scim.js.map +1 -0
  141. package/dist/component/server/enterprise/shared.js +51 -0
  142. package/dist/component/server/enterprise/shared.js.map +1 -0
  143. package/dist/component/server/errors.js.map +1 -1
  144. package/dist/component/server/http.js +2 -1
  145. package/dist/component/server/http.js.map +1 -1
  146. package/dist/component/server/identity.js +1 -1
  147. package/dist/component/server/identity.js.map +1 -1
  148. package/dist/component/server/{ratelimit.js → limits.js} +3 -3
  149. package/dist/component/server/limits.js.map +1 -0
  150. package/dist/component/server/mutations/account.js +3 -3
  151. package/dist/component/server/mutations/account.js.map +1 -1
  152. package/dist/component/server/mutations/code.js +2 -2
  153. package/dist/component/server/mutations/code.js.map +1 -1
  154. package/dist/component/server/mutations/invalidate.js +1 -1
  155. package/dist/component/server/mutations/invalidate.js.map +1 -1
  156. package/dist/component/server/mutations/oauth.js +5 -3
  157. package/dist/component/server/mutations/oauth.js.map +1 -1
  158. package/dist/component/server/mutations/refresh.js +1 -1
  159. package/dist/component/server/mutations/refresh.js.map +1 -1
  160. package/dist/component/server/mutations/register.js +3 -3
  161. package/dist/component/server/mutations/register.js.map +1 -1
  162. package/dist/component/server/mutations/retrieve.js +4 -4
  163. package/dist/component/server/mutations/retrieve.js.map +1 -1
  164. package/dist/component/server/mutations/signature.js +2 -2
  165. package/dist/component/server/mutations/signature.js.map +1 -1
  166. package/dist/component/server/mutations/signin.js +1 -1
  167. package/dist/component/server/mutations/signin.js.map +1 -1
  168. package/dist/component/server/mutations/signout.js +1 -1
  169. package/dist/component/server/mutations/signout.js.map +1 -1
  170. package/dist/component/server/mutations/store/refs.js +15 -0
  171. package/dist/component/server/mutations/store/refs.js.map +1 -0
  172. package/dist/component/server/mutations/store.js +80 -10
  173. package/dist/component/server/mutations/store.js.map +1 -1
  174. package/dist/component/server/mutations/verifier.js +1 -1
  175. package/dist/component/server/mutations/verifier.js.map +1 -1
  176. package/dist/component/server/mutations/verify.js +4 -3
  177. package/dist/component/server/mutations/verify.js.map +1 -1
  178. package/dist/component/server/oauth.js +1 -1
  179. package/dist/component/server/oauth.js.map +1 -1
  180. package/dist/component/server/passkey.js +2 -1
  181. package/dist/component/server/passkey.js.map +1 -1
  182. package/dist/component/server/redirects.js +1 -1
  183. package/dist/component/server/redirects.js.map +1 -1
  184. package/dist/component/server/refresh.js +1 -1
  185. package/dist/component/server/refresh.js.map +1 -1
  186. package/dist/component/server/{factory.d.ts → runtime.d.ts} +2 -2
  187. package/dist/component/server/runtime.d.ts.map +1 -0
  188. package/dist/component/server/runtime.js +413 -0
  189. package/dist/component/server/runtime.js.map +1 -0
  190. package/dist/component/server/signin.js +2 -1
  191. package/dist/component/server/signin.js.map +1 -1
  192. package/dist/component/server/totp.js +2 -1
  193. package/dist/component/server/totp.js.map +1 -1
  194. package/dist/component/server/types.d.ts +225 -41
  195. package/dist/component/server/types.d.ts.map +1 -1
  196. package/dist/component/server/types.js.map +1 -1
  197. package/dist/component/server/users.js +1 -1
  198. package/dist/component/server/users.js.map +1 -1
  199. package/dist/component/server/utils.js +1 -1
  200. package/dist/component/server/utils.js.map +1 -1
  201. package/dist/core/types.d.ts +369 -0
  202. package/dist/core/types.d.ts.map +1 -0
  203. package/dist/factors/device.js +105 -0
  204. package/dist/factors/device.js.map +1 -0
  205. package/dist/factors/passkey.js +181 -0
  206. package/dist/factors/passkey.js.map +1 -0
  207. package/dist/factors/totp.js +122 -0
  208. package/dist/factors/totp.js.map +1 -0
  209. package/dist/providers/credentials.d.ts +5 -2
  210. package/dist/providers/credentials.d.ts.map +1 -1
  211. package/dist/providers/credentials.js +2 -0
  212. package/dist/providers/credentials.js.map +1 -1
  213. package/dist/providers/email.d.ts +30 -0
  214. package/dist/providers/email.d.ts.map +1 -1
  215. package/dist/providers/email.js +24 -0
  216. package/dist/providers/email.js.map +1 -1
  217. package/dist/providers/phone.d.ts +28 -0
  218. package/dist/providers/phone.d.ts.map +1 -1
  219. package/dist/providers/phone.js +22 -0
  220. package/dist/providers/phone.js.map +1 -1
  221. package/dist/runtime/browser.js +68 -0
  222. package/dist/runtime/browser.js.map +1 -0
  223. package/dist/runtime/invite.js +51 -0
  224. package/dist/runtime/invite.js.map +1 -0
  225. package/dist/runtime/proxy.js +70 -0
  226. package/dist/runtime/proxy.js.map +1 -0
  227. package/dist/runtime/storage.js +37 -0
  228. package/dist/runtime/storage.js.map +1 -0
  229. package/dist/server/auth.d.ts +218 -28
  230. package/dist/server/auth.d.ts.map +1 -1
  231. package/dist/server/auth.js +68 -4
  232. package/dist/server/auth.js.map +1 -1
  233. package/dist/server/{fx.d.ts → authError.d.ts} +25 -15
  234. package/dist/server/authError.d.ts.map +1 -0
  235. package/dist/server/authError.js +34 -0
  236. package/dist/server/authError.js.map +1 -0
  237. package/dist/server/{providers.js → config.js} +2 -2
  238. package/dist/server/config.js.map +1 -0
  239. package/dist/server/core.d.ts +1436 -0
  240. package/dist/server/core.d.ts.map +1 -0
  241. package/dist/server/{domains/core.js → core.js} +107 -88
  242. package/dist/server/core.js.map +1 -0
  243. package/dist/server/{provider.d.ts → crypto.d.ts} +2 -2
  244. package/dist/server/crypto.d.ts.map +1 -0
  245. package/dist/server/{provider.js → crypto.js} +3 -3
  246. package/dist/{component/server/provider.js.map → server/crypto.js.map} +1 -1
  247. package/dist/server/device.js +1 -1
  248. package/dist/server/device.js.map +1 -1
  249. package/dist/server/enterprise/config.js +46 -0
  250. package/dist/server/enterprise/config.js.map +1 -0
  251. package/dist/server/{domains/sso.d.ts → enterprise/domain.d.ts} +4 -4
  252. package/dist/server/enterprise/domain.d.ts.map +1 -0
  253. package/dist/server/{domains/sso.js → enterprise/domain.js} +6 -5
  254. package/dist/server/enterprise/domain.js.map +1 -0
  255. package/dist/server/enterprise/http.d.ts +26 -0
  256. package/dist/server/enterprise/http.d.ts.map +1 -0
  257. package/dist/server/enterprise/http.js +766 -0
  258. package/dist/server/enterprise/http.js.map +1 -0
  259. package/dist/server/enterprise/oidc.js +248 -0
  260. package/dist/server/enterprise/oidc.js.map +1 -0
  261. package/dist/server/enterprise/policy.js +85 -0
  262. package/dist/server/enterprise/policy.js.map +1 -0
  263. package/dist/server/enterprise/saml.d.ts +1 -0
  264. package/dist/server/enterprise/saml.js +338 -0
  265. package/dist/server/enterprise/saml.js.map +1 -0
  266. package/dist/server/enterprise/scim.d.ts +1 -0
  267. package/dist/server/enterprise/scim.js +97 -0
  268. package/dist/server/enterprise/scim.js.map +1 -0
  269. package/dist/server/enterprise/shared.d.ts +5 -0
  270. package/dist/server/enterprise/shared.d.ts.map +1 -0
  271. package/dist/server/enterprise/shared.js +51 -0
  272. package/dist/server/enterprise/shared.js.map +1 -0
  273. package/dist/server/enterprise/validators.d.ts +1 -0
  274. package/dist/server/{enterpriseValidators.js → enterprise/validators.js} +2 -2
  275. package/dist/server/enterprise/validators.js.map +1 -0
  276. package/dist/server/errors.d.ts +2 -0
  277. package/dist/server/errors.d.ts.map +1 -1
  278. package/dist/server/errors.js +2 -0
  279. package/dist/server/errors.js.map +1 -1
  280. package/dist/server/http.d.ts +2 -2
  281. package/dist/server/http.d.ts.map +1 -1
  282. package/dist/server/http.js +2 -1
  283. package/dist/server/http.js.map +1 -1
  284. package/dist/server/identity.js +1 -1
  285. package/dist/server/identity.js.map +1 -1
  286. package/dist/server/index.d.ts +4 -705
  287. package/dist/server/index.js +4 -1367
  288. package/dist/server/limits.d.ts +1 -0
  289. package/dist/server/{ratelimit.js → limits.js} +3 -3
  290. package/dist/server/limits.js.map +1 -0
  291. package/dist/server/mounts.d.ts +647 -0
  292. package/dist/server/mounts.d.ts.map +1 -0
  293. package/dist/server/mounts.js +643 -0
  294. package/dist/server/mounts.js.map +1 -0
  295. package/dist/server/mutations/account.d.ts +8 -8
  296. package/dist/server/mutations/account.js +3 -3
  297. package/dist/server/mutations/account.js.map +1 -1
  298. package/dist/server/mutations/code.d.ts +13 -13
  299. package/dist/server/mutations/code.js +2 -2
  300. package/dist/server/mutations/code.js.map +1 -1
  301. package/dist/server/mutations/index.d.ts +8 -312
  302. package/dist/server/mutations/index.js +14 -84
  303. package/dist/server/mutations/invalidate.d.ts +5 -5
  304. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  305. package/dist/server/mutations/invalidate.js +1 -1
  306. package/dist/server/mutations/invalidate.js.map +1 -1
  307. package/dist/server/mutations/oauth.d.ts +9 -9
  308. package/dist/server/mutations/oauth.d.ts.map +1 -1
  309. package/dist/server/mutations/oauth.js +5 -3
  310. package/dist/server/mutations/oauth.js.map +1 -1
  311. package/dist/server/mutations/refresh.d.ts +4 -4
  312. package/dist/server/mutations/refresh.js +1 -1
  313. package/dist/server/mutations/refresh.js.map +1 -1
  314. package/dist/server/mutations/register.d.ts +10 -10
  315. package/dist/server/mutations/register.d.ts.map +1 -1
  316. package/dist/server/mutations/register.js +3 -3
  317. package/dist/server/mutations/register.js.map +1 -1
  318. package/dist/server/mutations/retrieve.d.ts +8 -10
  319. package/dist/server/mutations/retrieve.d.ts.map +1 -1
  320. package/dist/server/mutations/retrieve.js +5 -7
  321. package/dist/server/mutations/retrieve.js.map +1 -1
  322. package/dist/server/mutations/signature.d.ts +6 -6
  323. package/dist/server/mutations/signature.d.ts.map +1 -1
  324. package/dist/server/mutations/signature.js +2 -2
  325. package/dist/server/mutations/signature.js.map +1 -1
  326. package/dist/server/mutations/signin.d.ts +1 -1
  327. package/dist/server/mutations/signin.js +1 -1
  328. package/dist/server/mutations/signin.js.map +1 -1
  329. package/dist/server/mutations/signout.d.ts +1 -1
  330. package/dist/server/mutations/signout.js +1 -1
  331. package/dist/server/mutations/signout.js.map +1 -1
  332. package/dist/server/mutations/store/refs.d.ts +12 -0
  333. package/dist/server/mutations/store/refs.d.ts.map +1 -0
  334. package/dist/server/mutations/store/refs.js +15 -0
  335. package/dist/server/mutations/store/refs.js.map +1 -0
  336. package/dist/server/mutations/store.d.ts +303 -9
  337. package/dist/server/mutations/store.d.ts.map +1 -1
  338. package/dist/server/mutations/store.js +80 -10
  339. package/dist/server/mutations/store.js.map +1 -1
  340. package/dist/server/mutations/verifier.d.ts +1 -1
  341. package/dist/server/mutations/verifier.js +1 -1
  342. package/dist/server/mutations/verifier.js.map +1 -1
  343. package/dist/server/mutations/verify.d.ts +8 -8
  344. package/dist/server/mutations/verify.d.ts.map +1 -1
  345. package/dist/server/mutations/verify.js +4 -3
  346. package/dist/server/mutations/verify.js.map +1 -1
  347. package/dist/server/oauth.js +1 -1
  348. package/dist/server/oauth.js.map +1 -1
  349. package/dist/server/passkey.d.ts +2 -2
  350. package/dist/server/passkey.d.ts.map +1 -1
  351. package/dist/server/passkey.js +3 -2
  352. package/dist/server/passkey.js.map +1 -1
  353. package/dist/server/redirects.js +1 -1
  354. package/dist/server/redirects.js.map +1 -1
  355. package/dist/server/refresh.js +1 -1
  356. package/dist/server/refresh.js.map +1 -1
  357. package/dist/server/{factory.d.ts → runtime.d.ts} +16 -16
  358. package/dist/server/runtime.d.ts.map +1 -0
  359. package/dist/server/runtime.js +413 -0
  360. package/dist/server/runtime.js.map +1 -0
  361. package/dist/server/signin.js +3 -2
  362. package/dist/server/signin.js.map +1 -1
  363. package/dist/server/ssr.d.ts +226 -0
  364. package/dist/server/ssr.d.ts.map +1 -0
  365. package/dist/server/ssr.js +786 -0
  366. package/dist/server/ssr.js.map +1 -0
  367. package/dist/server/totp.js +2 -1
  368. package/dist/server/totp.js.map +1 -1
  369. package/dist/server/types.d.ts +242 -42
  370. package/dist/server/types.d.ts.map +1 -1
  371. package/dist/server/types.js +12 -1
  372. package/dist/server/types.js.map +1 -1
  373. package/dist/server/users.js +1 -1
  374. package/dist/server/users.js.map +1 -1
  375. package/dist/server/utils.js +1 -1
  376. package/dist/server/utils.js.map +1 -1
  377. package/package.json +3 -4
  378. package/src/authorization/index.ts +46 -0
  379. package/src/cli/index.ts +38 -20
  380. package/src/client/core/types.ts +437 -0
  381. package/src/client/factors/device.ts +160 -0
  382. package/src/client/factors/passkey.ts +282 -0
  383. package/src/client/factors/totp.ts +150 -0
  384. package/src/client/index.ts +133 -1267
  385. package/src/client/runtime/browser.ts +112 -0
  386. package/src/client/runtime/invite.ts +65 -0
  387. package/src/client/runtime/proxy.ts +111 -0
  388. package/src/client/runtime/storage.ts +79 -0
  389. package/src/component/_generated/api.ts +40 -12
  390. package/src/component/_generated/component.ts +1772 -1798
  391. package/src/component/model.ts +6 -0
  392. package/src/component/public/enterprise/audit.ts +120 -0
  393. package/src/component/public/enterprise/core.ts +354 -0
  394. package/src/component/public/enterprise/domains.ts +323 -0
  395. package/src/component/public/enterprise/scim.ts +396 -0
  396. package/src/component/public/enterprise/secrets.ts +132 -0
  397. package/src/component/public/enterprise/webhooks.ts +306 -0
  398. package/src/component/public/factors/devices.ts +223 -0
  399. package/src/component/public/factors/passkeys.ts +242 -0
  400. package/src/component/public/factors/totp.ts +258 -0
  401. package/src/component/public/groups/core.ts +481 -0
  402. package/src/component/public/groups/invites.ts +602 -0
  403. package/src/component/public/groups/members.ts +409 -0
  404. package/src/component/public/identity/accounts.ts +206 -0
  405. package/src/component/public/identity/codes.ts +148 -0
  406. package/src/component/public/identity/sessions.ts +209 -0
  407. package/src/component/public/identity/tokens.ts +250 -0
  408. package/src/component/public/identity/users.ts +354 -0
  409. package/src/component/public/identity/verifiers.ts +157 -0
  410. package/src/component/public/security/keys.ts +365 -0
  411. package/src/component/public/security/limits.ts +173 -0
  412. package/src/component/public.ts +27 -5
  413. package/src/providers/credentials.ts +4 -5
  414. package/src/providers/email.ts +30 -0
  415. package/src/providers/phone.ts +28 -0
  416. package/src/server/auth.ts +282 -28
  417. package/src/server/authError.ts +44 -0
  418. package/src/server/core.ts +2095 -0
  419. package/src/server/{provider.ts → crypto.ts} +1 -1
  420. package/src/server/device.ts +1 -1
  421. package/src/server/enterprise/config.ts +51 -0
  422. package/src/server/{domains/sso.ts → enterprise/domain.ts} +4 -2
  423. package/src/server/enterprise/http.ts +1324 -0
  424. package/src/server/enterprise/oidc.ts +500 -0
  425. package/src/server/enterprise/policy.ts +128 -0
  426. package/src/server/enterprise/saml.ts +578 -0
  427. package/src/server/enterprise/scim.ts +135 -0
  428. package/src/server/enterprise/shared.ts +134 -0
  429. package/src/server/errors.ts +2 -0
  430. package/src/server/http.ts +3 -1
  431. package/src/server/identity.ts +1 -1
  432. package/src/server/index.ts +32 -2605
  433. package/src/server/{ratelimit.ts → limits.ts} +1 -1
  434. package/src/server/mounts.ts +948 -0
  435. package/src/server/mutations/account.ts +4 -4
  436. package/src/server/mutations/code.ts +3 -3
  437. package/src/server/mutations/index.ts +8 -148
  438. package/src/server/mutations/invalidate.ts +2 -2
  439. package/src/server/mutations/oauth.ts +8 -6
  440. package/src/server/mutations/refresh.ts +3 -3
  441. package/src/server/mutations/register.ts +3 -3
  442. package/src/server/mutations/retrieve.ts +4 -8
  443. package/src/server/mutations/signature.ts +3 -3
  444. package/src/server/mutations/signin.ts +2 -2
  445. package/src/server/mutations/signout.ts +2 -2
  446. package/src/server/mutations/store/refs.ts +10 -0
  447. package/src/server/mutations/store.ts +137 -9
  448. package/src/server/mutations/verifier.ts +2 -2
  449. package/src/server/mutations/verify.ts +5 -5
  450. package/src/server/oauth.ts +1 -1
  451. package/src/server/passkey.ts +3 -4
  452. package/src/server/redirects.ts +1 -1
  453. package/src/server/refresh.ts +1 -1
  454. package/src/server/runtime.ts +880 -0
  455. package/src/server/signin.ts +3 -1
  456. package/src/server/ssr.ts +1764 -0
  457. package/src/server/totp.ts +3 -1
  458. package/src/server/types.ts +254 -43
  459. package/src/server/users.ts +1 -1
  460. package/src/server/utils.ts +1 -1
  461. package/src/test.ts +25 -0
  462. package/dist/component/public/enterprise.d.ts +0 -54
  463. package/dist/component/public/enterprise.d.ts.map +0 -1
  464. package/dist/component/public/enterprise.js +0 -515
  465. package/dist/component/public/enterprise.js.map +0 -1
  466. package/dist/component/public/factors.d.ts +0 -52
  467. package/dist/component/public/factors.d.ts.map +0 -1
  468. package/dist/component/public/factors.js +0 -285
  469. package/dist/component/public/factors.js.map +0 -1
  470. package/dist/component/public/groups.d.ts +0 -124
  471. package/dist/component/public/groups.d.ts.map +0 -1
  472. package/dist/component/public/groups.js +0 -680
  473. package/dist/component/public/groups.js.map +0 -1
  474. package/dist/component/public/identity.d.ts +0 -93
  475. package/dist/component/public/identity.d.ts.map +0 -1
  476. package/dist/component/public/identity.js +0 -426
  477. package/dist/component/public/identity.js.map +0 -1
  478. package/dist/component/public/keys.d.ts +0 -41
  479. package/dist/component/public/keys.d.ts.map +0 -1
  480. package/dist/component/public/keys.js +0 -157
  481. package/dist/component/public/keys.js.map +0 -1
  482. package/dist/component/public/shared.d.ts +0 -26
  483. package/dist/component/public/shared.d.ts.map +0 -1
  484. package/dist/component/public/shared.js +0 -32
  485. package/dist/component/public/shared.js.map +0 -1
  486. package/dist/component/server/domains/core.js.map +0 -1
  487. package/dist/component/server/domains/sso.js.map +0 -1
  488. package/dist/component/server/factory.d.ts.map +0 -1
  489. package/dist/component/server/factory.js +0 -1134
  490. package/dist/component/server/factory.js.map +0 -1
  491. package/dist/component/server/fx.js +0 -66
  492. package/dist/component/server/fx.js.map +0 -1
  493. package/dist/component/server/mutations/index.js +0 -85
  494. package/dist/component/server/mutations/index.js.map +0 -1
  495. package/dist/component/server/providers.js.map +0 -1
  496. package/dist/component/server/ratelimit.js.map +0 -1
  497. package/dist/component/server/sso.js +0 -830
  498. package/dist/component/server/sso.js.map +0 -1
  499. package/dist/server/domains/core.d.ts +0 -449
  500. package/dist/server/domains/core.d.ts.map +0 -1
  501. package/dist/server/domains/core.js.map +0 -1
  502. package/dist/server/domains/sso.d.ts.map +0 -1
  503. package/dist/server/domains/sso.js.map +0 -1
  504. package/dist/server/enterpriseValidators.js.map +0 -1
  505. package/dist/server/factory.d.ts.map +0 -1
  506. package/dist/server/factory.js +0 -1134
  507. package/dist/server/factory.js.map +0 -1
  508. package/dist/server/fx.d.ts.map +0 -1
  509. package/dist/server/fx.js +0 -66
  510. package/dist/server/fx.js.map +0 -1
  511. package/dist/server/index.d.ts.map +0 -1
  512. package/dist/server/index.js.map +0 -1
  513. package/dist/server/mutations/index.d.ts.map +0 -1
  514. package/dist/server/mutations/index.js.map +0 -1
  515. package/dist/server/provider.d.ts.map +0 -1
  516. package/dist/server/provider.js.map +0 -1
  517. package/dist/server/providers.js.map +0 -1
  518. package/dist/server/ratelimit.js.map +0 -1
  519. package/dist/server/sso.js +0 -830
  520. package/dist/server/sso.js.map +0 -1
  521. package/dist/server/version.d.ts +0 -5
  522. package/dist/server/version.d.ts.map +0 -1
  523. package/dist/server/version.js +0 -6
  524. package/dist/server/version.js.map +0 -1
  525. package/src/component/public/enterprise.ts +0 -753
  526. package/src/component/public/factors.ts +0 -333
  527. package/src/component/public/groups.ts +0 -1066
  528. package/src/component/public/identity.ts +0 -569
  529. package/src/component/public/keys.ts +0 -209
  530. package/src/component/public/shared.ts +0 -119
  531. package/src/server/domains/core.ts +0 -1096
  532. package/src/server/factory.ts +0 -2181
  533. package/src/server/fx.ts +0 -152
  534. package/src/server/sso.ts +0 -1516
  535. package/src/server/version.ts +0 -2
  536. /package/dist/server/{enterpriseValidators.d.ts → config.d.ts} +0 -0
  537. /package/dist/server/{providers.d.ts → enterprise/config.d.ts} +0 -0
  538. /package/dist/server/{ratelimit.d.ts → enterprise/oidc.d.ts} +0 -0
  539. /package/dist/server/{sso.d.ts → enterprise/policy.d.ts} +0 -0
  540. /package/src/server/{providers.ts → config.ts} +0 -0
  541. /package/src/server/{enterpriseValidators.ts → enterprise/validators.ts} +0 -0
@@ -0,0 +1,500 @@
1
+ import { sha256 } from "@oslojs/crypto/sha2";
2
+ import { encodeBase64urlNoPadding } from "@oslojs/encoding";
3
+ import { Fx } from "@robelest/fx";
4
+ import { decodeIdToken } from "arctic";
5
+ import {
6
+ createRemoteJWKSet,
7
+ customFetch,
8
+ decodeProtectedHeader,
9
+ jwtVerify,
10
+ } from "jose";
11
+
12
+ import type { OAuthMaterializedConfig, OAuthProfile } from "../types";
13
+ import { enterpriseOidcProviderId, getEnterpriseOidcUrls } from "./shared";
14
+
15
+ const OIDC_JWKS_CACHE = new Map<
16
+ string,
17
+ ReturnType<typeof createRemoteJWKSet>
18
+ >();
19
+
20
+ async function discoverOidcConfiguration(config: Record<string, any>) {
21
+ const discoveryUrl =
22
+ typeof config.discoveryUrl === "string"
23
+ ? config.discoveryUrl
24
+ : typeof config.issuer === "string"
25
+ ? `${config.issuer.replace(/\/$/, "")}/.well-known/openid-configuration`
26
+ : null;
27
+
28
+ if (!discoveryUrl) {
29
+ throw new Error("Enterprise OIDC requires an issuer or discoveryUrl.");
30
+ }
31
+
32
+ const oidcFetch = createEnterpriseOidcFetch(config, config.issuer);
33
+
34
+ return await Fx.run(
35
+ Fx.defer(() =>
36
+ Fx.from({
37
+ ok: async () => {
38
+ const response = await oidcFetch(discoveryUrl);
39
+ if (!response.ok) {
40
+ throw new Error(
41
+ `Failed to discover OIDC configuration: ${response.status}`,
42
+ );
43
+ }
44
+ const discovery = (await response.json()) as Record<string, any>;
45
+ if (
46
+ typeof discovery.issuer !== "string" ||
47
+ typeof discovery.authorization_endpoint !== "string" ||
48
+ typeof discovery.token_endpoint !== "string" ||
49
+ typeof discovery.jwks_uri !== "string"
50
+ ) {
51
+ throw new Error(
52
+ "OIDC discovery document is missing required fields.",
53
+ );
54
+ }
55
+ return discovery;
56
+ },
57
+ err: (error) =>
58
+ error instanceof Error ? error : new Error(String(error)),
59
+ }),
60
+ ).pipe(
61
+ Fx.timeout(10_000),
62
+ Fx.retry(
63
+ Fx.retry.compose(
64
+ Fx.retry.jittered(Fx.retry.exponential(200)),
65
+ Fx.retry.recurs(2),
66
+ ),
67
+ ),
68
+ Fx.recover((error) =>
69
+ Fx.fail(error instanceof Error ? error : new Error(String(error))),
70
+ ),
71
+ ),
72
+ );
73
+ }
74
+
75
+ function createEnterpriseOidcFetch(
76
+ config: Record<string, any>,
77
+ discoveredIssuer?: string,
78
+ ) {
79
+ const runtimeOrigin =
80
+ typeof config.discoveryUrl === "string"
81
+ ? new URL(config.discoveryUrl).origin
82
+ : undefined;
83
+ const externalHost =
84
+ typeof config.issuer === "string"
85
+ ? new URL(config.issuer).host
86
+ : typeof discoveredIssuer === "string"
87
+ ? new URL(discoveredIssuer).host
88
+ : undefined;
89
+
90
+ return async (input: string | URL, init?: RequestInit) => {
91
+ const url = new URL(typeof input === "string" ? input : input.toString());
92
+ const rewrittenUrl =
93
+ runtimeOrigin !== undefined && url.origin !== runtimeOrigin
94
+ ? new URL(`${runtimeOrigin}${url.pathname}${url.search}`)
95
+ : url;
96
+ const headers = new Headers(init?.headers);
97
+ if (runtimeOrigin !== undefined && externalHost !== undefined) {
98
+ headers.set("host", externalHost);
99
+ }
100
+ return await fetch(rewrittenUrl, { ...init, headers });
101
+ };
102
+ }
103
+
104
+ function getOidcJwks(
105
+ url: string,
106
+ fetchImpl?: ReturnType<typeof createEnterpriseOidcFetch>,
107
+ ) {
108
+ const cacheKey = fetchImpl ? `${url}::custom` : url;
109
+ let jwks = OIDC_JWKS_CACHE.get(cacheKey);
110
+ if (!jwks) {
111
+ jwks = fetchImpl
112
+ ? createRemoteJWKSet(new URL(url), { [customFetch]: fetchImpl })
113
+ : createRemoteJWKSet(new URL(url));
114
+ OIDC_JWKS_CACHE.set(cacheKey, jwks);
115
+ }
116
+ return jwks;
117
+ }
118
+
119
+ type UserInfoFetchFailure =
120
+ | { kind: "transport"; error: unknown }
121
+ | { kind: "subject-mismatch" };
122
+
123
+ function userInfoProfileFx(opts: {
124
+ endpoint: string;
125
+ accessToken: string;
126
+ verifiedClaims: Record<string, unknown>;
127
+ verifiedProfile: OAuthProfile & { emailVerified?: boolean };
128
+ fetchImpl?: ReturnType<typeof createEnterpriseOidcFetch>;
129
+ }) {
130
+ return Fx.from({
131
+ ok: async () => {
132
+ const response = await (opts.fetchImpl ?? fetch)(opts.endpoint, {
133
+ headers: { Authorization: `Bearer ${opts.accessToken}` },
134
+ });
135
+ if (!response.ok) {
136
+ throw new Error(`OIDC userinfo request failed: ${response.status}`);
137
+ }
138
+ return (await response.json()) as Record<string, unknown>;
139
+ },
140
+ err: (error): UserInfoFetchFailure => ({ kind: "transport", error }),
141
+ }).pipe(
142
+ Fx.chain((userInfo) => {
143
+ const userInfoSubject =
144
+ typeof userInfo.sub === "string" ? userInfo.sub : undefined;
145
+ const tokenSubject =
146
+ typeof opts.verifiedClaims.sub === "string"
147
+ ? opts.verifiedClaims.sub
148
+ : undefined;
149
+ return userInfoSubject !== undefined &&
150
+ tokenSubject !== undefined &&
151
+ userInfoSubject !== tokenSubject
152
+ ? Fx.fail({ kind: "subject-mismatch" } as const)
153
+ : Fx.succeed({
154
+ id:
155
+ userInfoSubject ??
156
+ (typeof opts.verifiedClaims.sub === "string"
157
+ ? opts.verifiedClaims.sub
158
+ : undefined) ??
159
+ crypto.randomUUID(),
160
+ email:
161
+ typeof userInfo.email === "string"
162
+ ? userInfo.email
163
+ : opts.verifiedProfile.email,
164
+ emailVerified:
165
+ typeof userInfo.email_verified === "boolean"
166
+ ? userInfo.email_verified
167
+ : opts.verifiedProfile.emailVerified,
168
+ name:
169
+ typeof userInfo.name === "string"
170
+ ? userInfo.name
171
+ : opts.verifiedProfile.name,
172
+ image:
173
+ typeof userInfo.picture === "string"
174
+ ? userInfo.picture
175
+ : opts.verifiedProfile.image,
176
+ } as OAuthProfile & { emailVerified?: boolean });
177
+ }),
178
+ Fx.recover((failure) => {
179
+ if (failure.kind === "transport") {
180
+ return Fx.succeed(null);
181
+ }
182
+ return Fx.fail(
183
+ new Error("OIDC userinfo subject does not match ID token subject."),
184
+ );
185
+ }),
186
+ );
187
+ }
188
+
189
+ /** @internal */
190
+ export async function createEnterpriseOidcProvider(
191
+ config: Record<string, any>,
192
+ redirectUri: string,
193
+ ) {
194
+ const discovery = await discoverOidcConfiguration(config);
195
+ const expectedIssuer = String(config.issuer ?? discovery.issuer).replace(
196
+ /\/$/,
197
+ "",
198
+ );
199
+ const discoveredIssuer = String(discovery.issuer).replace(/\/$/, "");
200
+ const strictIssuer = config.strictIssuer === true;
201
+ if (
202
+ typeof config.issuer === "string" &&
203
+ expectedIssuer !== discoveredIssuer
204
+ ) {
205
+ if (strictIssuer) {
206
+ throw new Error(
207
+ `Configured OIDC issuer mismatch. configured=${expectedIssuer} discovery=${discoveredIssuer}`,
208
+ );
209
+ }
210
+ console.warn(
211
+ "Configured OIDC issuer differs from discovery issuer; accepting both for token verification.",
212
+ {
213
+ configuredIssuer: expectedIssuer,
214
+ discoveryIssuer: discoveredIssuer,
215
+ },
216
+ );
217
+ }
218
+ const authorizationEndpoint = discovery.authorization_endpoint as string;
219
+ const tokenEndpoint = discovery.token_endpoint as string;
220
+ const jwksUri = String(config.jwksUri ?? discovery.jwks_uri);
221
+ const supportedIdTokenSigningAlgs = Array.isArray(
222
+ discovery.id_token_signing_alg_values_supported,
223
+ )
224
+ ? discovery.id_token_signing_alg_values_supported.filter(
225
+ (value: unknown): value is string => typeof value === "string",
226
+ )
227
+ : [];
228
+ const userinfoEndpoint =
229
+ (discovery.userinfo_endpoint as string | undefined) ?? undefined;
230
+ const oidcFetch = createEnterpriseOidcFetch(
231
+ config,
232
+ discovery.issuer as string,
233
+ );
234
+ const scopes = Array.isArray(config.scopes)
235
+ ? config.scopes.filter(
236
+ (value: unknown): value is string => typeof value === "string",
237
+ )
238
+ : ["openid", "profile", "email"];
239
+ const expectedAudience = config.audience ?? String(config.clientId);
240
+ const getIssuerCandidates = (issuer: string) => {
241
+ const candidates = [issuer];
242
+ if (issuer.startsWith("https://")) {
243
+ candidates.push(`http://${issuer.slice("https://".length)}`);
244
+ } else if (issuer.startsWith("http://")) {
245
+ candidates.push(`https://${issuer.slice("http://".length)}`);
246
+ }
247
+ return candidates;
248
+ };
249
+ const expectedIssuers = strictIssuer
250
+ ? [expectedIssuer]
251
+ : Array.from(
252
+ new Set([
253
+ ...getIssuerCandidates(expectedIssuer),
254
+ ...getIssuerCandidates(discoveredIssuer),
255
+ ]),
256
+ );
257
+ const jwks = getOidcJwks(jwksUri, oidcFetch);
258
+ let verifiedClaims: Record<string, unknown> | null = null;
259
+ let verifiedProfile: (OAuthProfile & { emailVerified?: boolean }) | null =
260
+ null;
261
+ const normalizeProfile = (claims: Record<string, unknown>) => ({
262
+ id: typeof claims.sub === "string" ? claims.sub : crypto.randomUUID(),
263
+ email: typeof claims.email === "string" ? claims.email : undefined,
264
+ emailVerified:
265
+ typeof claims.email_verified === "boolean"
266
+ ? claims.email_verified
267
+ : undefined,
268
+ name: typeof claims.name === "string" ? claims.name : undefined,
269
+ image: typeof claims.picture === "string" ? claims.picture : undefined,
270
+ });
271
+
272
+ const provider = {
273
+ createAuthorizationURL(
274
+ state: string,
275
+ codeVerifier: string,
276
+ requestedScopes: string[],
277
+ ) {
278
+ const url = new URL(authorizationEndpoint);
279
+ url.searchParams.set("response_type", "code");
280
+ url.searchParams.set("client_id", String(config.clientId));
281
+ url.searchParams.set("redirect_uri", redirectUri);
282
+ url.searchParams.set(
283
+ "scope",
284
+ (requestedScopes.length > 0 ? requestedScopes : scopes).join(" "),
285
+ );
286
+ url.searchParams.set("state", state);
287
+ url.searchParams.set("code_challenge_method", "S256");
288
+ url.searchParams.set(
289
+ "code_challenge",
290
+ encodeBase64urlNoPadding(
291
+ sha256(new TextEncoder().encode(codeVerifier)),
292
+ ),
293
+ );
294
+ const authorizationParams =
295
+ typeof config.authorizationParams === "object" &&
296
+ config.authorizationParams !== null
297
+ ? (config.authorizationParams as Record<string, unknown>)
298
+ : {};
299
+ for (const [key, value] of Object.entries(authorizationParams)) {
300
+ if (typeof value === "string") {
301
+ url.searchParams.set(key, value);
302
+ }
303
+ }
304
+ return url;
305
+ },
306
+ async validateAuthorizationCode(code: string, codeVerifier?: string) {
307
+ const body = new URLSearchParams({
308
+ grant_type: "authorization_code",
309
+ code,
310
+ redirect_uri: redirectUri,
311
+ client_id: String(config.clientId),
312
+ });
313
+ if (typeof config.clientSecret === "string") {
314
+ body.set("client_secret", config.clientSecret);
315
+ }
316
+ if (codeVerifier) {
317
+ body.set("code_verifier", codeVerifier);
318
+ }
319
+ const response = await oidcFetch(tokenEndpoint, {
320
+ method: "POST",
321
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
322
+ body,
323
+ });
324
+ if (!response.ok) {
325
+ throw new Error(`OIDC token exchange failed: ${response.status}`);
326
+ }
327
+ const data = (await response.json()) as Record<string, any>;
328
+ return {
329
+ data,
330
+ idToken() {
331
+ if (typeof data.id_token !== "string") {
332
+ throw new Error("OIDC response is missing id_token.");
333
+ }
334
+ return data.id_token;
335
+ },
336
+ accessToken() {
337
+ if (typeof data.access_token !== "string") {
338
+ throw new Error("OIDC response is missing access_token.");
339
+ }
340
+ return data.access_token;
341
+ },
342
+ };
343
+ },
344
+ };
345
+
346
+ const oauthConfig = {
347
+ scopes,
348
+ nonce: true,
349
+ validateTokens: async (tokens: any, ctx: { nonce?: string }) => {
350
+ const verified = await Fx.run(
351
+ Fx.gen(function* () {
352
+ yield* Fx.guard(
353
+ ctx.nonce === undefined,
354
+ Fx.fail(new Error("OIDC nonce is required.")),
355
+ );
356
+
357
+ const idToken = tokens.idToken();
358
+ const protectedHeader = decodeProtectedHeader(idToken);
359
+ const tokenAlg = protectedHeader.alg;
360
+ const useSymmetricValidation =
361
+ typeof tokenAlg === "string" &&
362
+ (tokenAlg === "HS256" ||
363
+ tokenAlg === "HS384" ||
364
+ tokenAlg === "HS512") &&
365
+ supportedIdTokenSigningAlgs.includes(tokenAlg);
366
+
367
+ const verificationOptions = {
368
+ audience: expectedAudience,
369
+ requiredClaims: ["iss", "sub", "aud", "exp", "iat"],
370
+ clockTolerance: config.clockToleranceSeconds ?? 10,
371
+ } as const;
372
+
373
+ const verification = yield* Fx.from({
374
+ ok: () =>
375
+ useSymmetricValidation
376
+ ? jwtVerify(
377
+ idToken,
378
+ (() => {
379
+ if (typeof config.clientSecret !== "string") {
380
+ throw new Error(
381
+ "OIDC provider uses symmetric ID token signatures but clientSecret is missing.",
382
+ );
383
+ }
384
+ return new TextEncoder().encode(config.clientSecret);
385
+ })(),
386
+ verificationOptions as any,
387
+ )
388
+ : jwtVerify(idToken, jwks as any, verificationOptions as any),
389
+ err: (error) =>
390
+ error instanceof Error ? error : new Error(String(error)),
391
+ });
392
+
393
+ const payload = verification.payload as Record<string, unknown>;
394
+ const tokenIssuerRaw =
395
+ typeof payload.iss === "string" ? payload.iss : undefined;
396
+ const tokenIssuer =
397
+ typeof tokenIssuerRaw === "string"
398
+ ? tokenIssuerRaw.replace(/\/$/, "")
399
+ : undefined;
400
+
401
+ yield* Fx.guard(
402
+ !tokenIssuer || !expectedIssuers.includes(tokenIssuer),
403
+ Fx.fail(
404
+ new Error(
405
+ `OIDC token issuer mismatch. Received: ${tokenIssuer ?? "<missing>"}. Expected one of: ${expectedIssuers.join(", ")}`,
406
+ ),
407
+ ),
408
+ );
409
+
410
+ yield* Fx.guard(
411
+ payload.nonce !== ctx.nonce,
412
+ Fx.fail(new Error("OIDC nonce mismatch.")),
413
+ );
414
+
415
+ yield* Fx.guard(
416
+ Array.isArray(payload.aud) &&
417
+ payload.aud.length > 1 &&
418
+ payload.azp !== String(config.clientId),
419
+ Fx.fail(
420
+ new Error("OIDC authorized party does not match client ID."),
421
+ ),
422
+ );
423
+
424
+ return payload;
425
+ }),
426
+ );
427
+
428
+ verifiedClaims = verified;
429
+ verifiedProfile = normalizeProfile(verified);
430
+ },
431
+ accountLinking: config.accountLinking,
432
+ profile: async (tokens: any): Promise<OAuthProfile> => {
433
+ if (verifiedProfile === null || verifiedClaims === null) {
434
+ const claims = decodeIdToken(tokens.idToken()) as Record<
435
+ string,
436
+ unknown
437
+ >;
438
+ verifiedClaims = claims;
439
+ verifiedProfile = normalizeProfile(claims);
440
+ }
441
+ if (userinfoEndpoint && typeof tokens.accessToken === "function") {
442
+ const userInfoProfile = await Fx.run(
443
+ userInfoProfileFx({
444
+ endpoint: userinfoEndpoint,
445
+ accessToken: tokens.accessToken(),
446
+ verifiedClaims,
447
+ verifiedProfile,
448
+ fetchImpl: oidcFetch,
449
+ }),
450
+ );
451
+ if (userInfoProfile !== null) {
452
+ return userInfoProfile;
453
+ }
454
+ }
455
+ return verifiedProfile;
456
+ },
457
+ } as const;
458
+
459
+ return { provider, oauthConfig };
460
+ }
461
+
462
+ /** @internal */
463
+ export function createSyntheticOAuthMaterializedConfig(
464
+ providerId: string,
465
+ options?: {
466
+ accountLinking?: OAuthMaterializedConfig["accountLinking"];
467
+ },
468
+ ): OAuthMaterializedConfig {
469
+ return {
470
+ id: providerId,
471
+ type: "oauth",
472
+ provider: null,
473
+ scopes: [],
474
+ accountLinking: options?.accountLinking ?? "verifiedEmail",
475
+ };
476
+ }
477
+
478
+ /** @internal */
479
+ export async function createEnterpriseOidcRuntime(opts: {
480
+ rootUrl: string;
481
+ enterpriseId: string;
482
+ oidc: Record<string, any>;
483
+ }) {
484
+ const providerId = enterpriseOidcProviderId(opts.enterpriseId);
485
+ const urls = getEnterpriseOidcUrls({
486
+ rootUrl: opts.rootUrl,
487
+ enterpriseId: opts.enterpriseId,
488
+ });
489
+ const { provider, oauthConfig } = await createEnterpriseOidcProvider(
490
+ opts.oidc,
491
+ urls.callbackUrl,
492
+ );
493
+ return {
494
+ oidc: opts.oidc,
495
+ providerId,
496
+ provider,
497
+ oauthConfig,
498
+ ...urls,
499
+ };
500
+ }
@@ -0,0 +1,128 @@
1
+ import type { EnterprisePolicy, EnterprisePolicyPatch } from "../types";
2
+ import { asRecord } from "./shared";
3
+
4
+ /** @internal */
5
+ export const DEFAULT_ENTERPRISE_POLICY: EnterprisePolicy = {
6
+ version: 1,
7
+ identity: {
8
+ accountLinking: {
9
+ oidc: "verifiedEmail",
10
+ saml: "verifiedEmail",
11
+ },
12
+ },
13
+ provisioning: {
14
+ scimReuse: {
15
+ user: "externalId",
16
+ },
17
+ jit: {
18
+ mode: "createUserAndMembership",
19
+ defaultRoleIds: [],
20
+ },
21
+ deprovision: {
22
+ mode: "soft",
23
+ },
24
+ },
25
+ };
26
+
27
+ /** @internal */
28
+ export function normalizeEnterprisePolicy(policy: unknown): EnterprisePolicy {
29
+ const input = asRecord(policy) ?? {};
30
+ const identity = asRecord(input.identity) ?? {};
31
+ const accountLinking = asRecord(identity.accountLinking) ?? {};
32
+ const provisioning = asRecord(input.provisioning) ?? {};
33
+ const scimReuse = asRecord(provisioning.scimReuse) ?? {};
34
+ const jit = asRecord(provisioning.jit) ?? {};
35
+ const deprovision = asRecord(provisioning.deprovision) ?? {};
36
+ const extend = asRecord(input.extend) ?? undefined;
37
+
38
+ return {
39
+ version: 1,
40
+ identity: {
41
+ accountLinking: {
42
+ oidc:
43
+ accountLinking.oidc === "none"
44
+ ? "none"
45
+ : DEFAULT_ENTERPRISE_POLICY.identity.accountLinking.oidc,
46
+ saml:
47
+ accountLinking.saml === "none"
48
+ ? "none"
49
+ : DEFAULT_ENTERPRISE_POLICY.identity.accountLinking.saml,
50
+ },
51
+ },
52
+ provisioning: {
53
+ scimReuse: {
54
+ user:
55
+ scimReuse.user === "none"
56
+ ? "none"
57
+ : DEFAULT_ENTERPRISE_POLICY.provisioning.scimReuse.user,
58
+ },
59
+ jit: {
60
+ mode:
61
+ jit.mode === "off" ||
62
+ jit.mode === "createUser" ||
63
+ jit.mode === "createUserAndMembership"
64
+ ? jit.mode
65
+ : DEFAULT_ENTERPRISE_POLICY.provisioning.jit.mode,
66
+ defaultRoleIds: Array.isArray(jit.defaultRoleIds)
67
+ ? Array.from(
68
+ new Set(
69
+ jit.defaultRoleIds.filter(
70
+ (value): value is string =>
71
+ typeof value === "string" && value.length > 0,
72
+ ),
73
+ ),
74
+ )
75
+ : typeof jit.defaultRole === "string" && jit.defaultRole.length > 0
76
+ ? [jit.defaultRole]
77
+ : DEFAULT_ENTERPRISE_POLICY.provisioning.jit.defaultRoleIds,
78
+ },
79
+ deprovision: {
80
+ mode:
81
+ deprovision.mode === "hard"
82
+ ? "hard"
83
+ : DEFAULT_ENTERPRISE_POLICY.provisioning.deprovision.mode,
84
+ },
85
+ },
86
+ ...(extend ? { extend } : {}),
87
+ };
88
+ }
89
+
90
+ /** @internal */
91
+ export function patchEnterprisePolicy(
92
+ current: unknown,
93
+ patch: EnterprisePolicyPatch,
94
+ ): EnterprisePolicy {
95
+ const base = normalizeEnterprisePolicy(current);
96
+ return normalizeEnterprisePolicy({
97
+ ...base,
98
+ ...patch,
99
+ identity: {
100
+ ...base.identity,
101
+ ...patch.identity,
102
+ accountLinking: {
103
+ ...base.identity.accountLinking,
104
+ ...patch.identity?.accountLinking,
105
+ },
106
+ },
107
+ provisioning: {
108
+ ...base.provisioning,
109
+ ...patch.provisioning,
110
+ scimReuse: {
111
+ ...base.provisioning.scimReuse,
112
+ ...patch.provisioning?.scimReuse,
113
+ },
114
+ jit: {
115
+ ...base.provisioning.jit,
116
+ ...patch.provisioning?.jit,
117
+ },
118
+ deprovision: {
119
+ ...base.provisioning.deprovision,
120
+ ...patch.provisioning?.deprovision,
121
+ },
122
+ },
123
+ extend:
124
+ patch.extend === undefined
125
+ ? base.extend
126
+ : { ...base.extend, ...patch.extend },
127
+ });
128
+ }