@workos-inc/node 8.0.0-rc.6 → 8.0.0-rc.8

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 (261) hide show
  1. package/README.md +54 -0
  2. package/lib/api-keys/api-keys.cjs +3 -0
  3. package/lib/api-keys/api-keys.cjs.map +1 -1
  4. package/lib/api-keys/api-keys.d.cts +2 -1
  5. package/lib/api-keys/api-keys.d.ts +2 -1
  6. package/lib/api-keys/api-keys.js +3 -0
  7. package/lib/api-keys/api-keys.js.map +1 -1
  8. package/lib/api-keys/interfaces/create-organization-api-key-options.interface.cjs +0 -0
  9. package/lib/api-keys/interfaces/create-organization-api-key-options.interface.d.cts +16 -0
  10. package/lib/api-keys/interfaces/create-organization-api-key-options.interface.d.ts +16 -0
  11. package/lib/api-keys/interfaces/create-organization-api-key-options.interface.js +1 -0
  12. package/lib/api-keys/interfaces/created-api-key.interface.cjs +0 -0
  13. package/lib/api-keys/interfaces/created-api-key.interface.d.cts +34 -0
  14. package/lib/api-keys/interfaces/created-api-key.interface.d.ts +34 -0
  15. package/lib/api-keys/interfaces/created-api-key.interface.js +1 -0
  16. package/lib/api-keys/interfaces/index.cjs +0 -0
  17. package/lib/api-keys/interfaces/index.d.cts +6 -0
  18. package/lib/api-keys/interfaces/index.d.ts +6 -0
  19. package/lib/api-keys/interfaces/index.js +1 -0
  20. package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.cjs +0 -0
  21. package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.d.cts +9 -0
  22. package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.d.ts +9 -0
  23. package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.js +1 -0
  24. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.cjs +12 -0
  25. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.cjs.map +1 -0
  26. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.d.cts +7 -0
  27. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.d.ts +7 -0
  28. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.js +11 -0
  29. package/lib/api-keys/serializers/create-organization-api-key-options.serializer.js.map +1 -0
  30. package/lib/api-keys/serializers/created-api-key.serializer.cjs +20 -0
  31. package/lib/api-keys/serializers/created-api-key.serializer.cjs.map +1 -0
  32. package/lib/api-keys/serializers/created-api-key.serializer.d.cts +7 -0
  33. package/lib/api-keys/serializers/created-api-key.serializer.d.ts +7 -0
  34. package/lib/api-keys/serializers/created-api-key.serializer.js +19 -0
  35. package/lib/api-keys/serializers/created-api-key.serializer.js.map +1 -0
  36. package/lib/api-keys/serializers/index.cjs +9 -0
  37. package/lib/api-keys/serializers/index.d.cts +5 -0
  38. package/lib/api-keys/serializers/index.d.ts +5 -0
  39. package/lib/api-keys/serializers/index.js +6 -0
  40. package/lib/common/crypto/seal.cjs +7 -7
  41. package/lib/common/crypto/seal.cjs.map +1 -1
  42. package/lib/common/crypto/seal.js +1 -1
  43. package/lib/common/exceptions/api-key-required.exception.cjs +15 -0
  44. package/lib/common/exceptions/api-key-required.exception.cjs.map +1 -0
  45. package/lib/common/exceptions/api-key-required.exception.d.cts +10 -0
  46. package/lib/common/exceptions/api-key-required.exception.d.ts +10 -0
  47. package/lib/common/exceptions/api-key-required.exception.js +14 -0
  48. package/lib/common/exceptions/api-key-required.exception.js.map +1 -0
  49. package/lib/common/exceptions/index.cjs +2 -0
  50. package/lib/common/exceptions/index.d.cts +2 -1
  51. package/lib/common/exceptions/index.d.ts +2 -1
  52. package/lib/common/exceptions/index.js +2 -1
  53. package/lib/common/interfaces/event.interface.d.cts +28 -3
  54. package/lib/common/interfaces/event.interface.d.ts +28 -3
  55. package/lib/common/interfaces/get-options.interface.d.cts +2 -0
  56. package/lib/common/interfaces/get-options.interface.d.ts +2 -0
  57. package/lib/common/interfaces/index.d.cts +2 -2
  58. package/lib/common/interfaces/index.d.ts +2 -2
  59. package/lib/common/interfaces/post-options.interface.d.cts +2 -0
  60. package/lib/common/interfaces/post-options.interface.d.ts +2 -0
  61. package/lib/common/interfaces/put-options.interface.d.cts +2 -0
  62. package/lib/common/interfaces/put-options.interface.d.ts +2 -0
  63. package/lib/common/interfaces/workos-options.interface.d.cts +1 -0
  64. package/lib/common/interfaces/workos-options.interface.d.ts +1 -0
  65. package/lib/common/net/http-client.cjs.map +1 -1
  66. package/lib/common/net/http-client.js.map +1 -1
  67. package/lib/common/serializers/event.serializer.cjs +13 -5
  68. package/lib/common/serializers/event.serializer.cjs.map +1 -1
  69. package/lib/common/serializers/event.serializer.js +13 -5
  70. package/lib/common/serializers/event.serializer.js.map +1 -1
  71. package/lib/directory-sync/directory-sync.cjs +1 -1
  72. package/lib/directory-sync/directory-sync.js +1 -1
  73. package/lib/factory.cjs +10 -0
  74. package/lib/factory.cjs.map +1 -0
  75. package/lib/factory.d.cts +83 -0
  76. package/lib/factory.d.ts +83 -0
  77. package/lib/factory.js +10 -0
  78. package/lib/factory.js.map +1 -0
  79. package/lib/feature-flags/feature-flags.cjs +37 -0
  80. package/lib/feature-flags/feature-flags.cjs.map +1 -0
  81. package/lib/feature-flags/feature-flags.d.cts +21 -0
  82. package/lib/feature-flags/feature-flags.d.ts +21 -0
  83. package/lib/feature-flags/feature-flags.js +37 -0
  84. package/lib/feature-flags/feature-flags.js.map +1 -0
  85. package/lib/feature-flags/interfaces/add-flag-target-options.interface.cjs +0 -0
  86. package/lib/feature-flags/interfaces/add-flag-target-options.interface.d.cts +8 -0
  87. package/lib/feature-flags/interfaces/add-flag-target-options.interface.d.ts +8 -0
  88. package/lib/feature-flags/interfaces/add-flag-target-options.interface.js +1 -0
  89. package/lib/feature-flags/interfaces/feature-flag.interface.d.cts +8 -2
  90. package/lib/feature-flags/interfaces/feature-flag.interface.d.ts +8 -2
  91. package/lib/feature-flags/interfaces/index.d.cts +4 -1
  92. package/lib/feature-flags/interfaces/index.d.ts +4 -1
  93. package/lib/feature-flags/interfaces/list-feature-flags-options.interface.cjs +0 -0
  94. package/lib/feature-flags/interfaces/list-feature-flags-options.interface.d.cts +7 -0
  95. package/lib/feature-flags/interfaces/list-feature-flags-options.interface.d.ts +7 -0
  96. package/lib/feature-flags/interfaces/list-feature-flags-options.interface.js +1 -0
  97. package/lib/feature-flags/interfaces/remove-flag-target-options.interface.cjs +0 -0
  98. package/lib/feature-flags/interfaces/remove-flag-target-options.interface.d.cts +8 -0
  99. package/lib/feature-flags/interfaces/remove-flag-target-options.interface.d.ts +8 -0
  100. package/lib/feature-flags/interfaces/remove-flag-target-options.interface.js +1 -0
  101. package/lib/feature-flags/serializers/feature-flag.serializer.cjs +3 -0
  102. package/lib/feature-flags/serializers/feature-flag.serializer.cjs.map +1 -1
  103. package/lib/feature-flags/serializers/feature-flag.serializer.js +3 -0
  104. package/lib/feature-flags/serializers/feature-flag.serializer.js.map +1 -1
  105. package/lib/feature-flags/serializers/index.cjs +3 -0
  106. package/lib/feature-flags/serializers/index.d.cts +2 -0
  107. package/lib/feature-flags/serializers/index.d.ts +2 -0
  108. package/lib/feature-flags/serializers/index.js +3 -0
  109. package/lib/fga/serializers/query-result.serializer.cjs.map +1 -1
  110. package/lib/fga/serializers/query-result.serializer.js.map +1 -1
  111. package/lib/index.cjs +18 -9
  112. package/lib/index.cjs.map +1 -1
  113. package/lib/index.d.cts +18 -5
  114. package/lib/index.d.ts +18 -5
  115. package/lib/index.js +16 -10
  116. package/lib/index.js.map +1 -1
  117. package/lib/index.worker.cjs +15 -9
  118. package/lib/index.worker.cjs.map +1 -1
  119. package/lib/index.worker.d.cts +10 -5
  120. package/lib/index.worker.d.ts +10 -5
  121. package/lib/index.worker.js +13 -10
  122. package/lib/index.worker.js.map +1 -1
  123. package/lib/node_modules/iron-webcrypto/index.cjs +218 -0
  124. package/lib/node_modules/iron-webcrypto/index.cjs.map +1 -0
  125. package/lib/node_modules/iron-webcrypto/index.js +216 -0
  126. package/lib/node_modules/iron-webcrypto/index.js.map +1 -0
  127. package/lib/node_modules/uint8array-extras/index.cjs +55 -0
  128. package/lib/node_modules/uint8array-extras/index.cjs.map +1 -0
  129. package/lib/node_modules/uint8array-extras/index.js +52 -0
  130. package/lib/node_modules/uint8array-extras/index.js.map +1 -0
  131. package/lib/organizations/organizations.cjs +14 -2
  132. package/lib/organizations/organizations.cjs.map +1 -1
  133. package/lib/organizations/organizations.d.cts +6 -0
  134. package/lib/organizations/organizations.d.ts +6 -0
  135. package/lib/organizations/organizations.js +14 -2
  136. package/lib/organizations/organizations.js.map +1 -1
  137. package/lib/organizations/serializers/index.cjs +1 -1
  138. package/lib/organizations/serializers/index.js +1 -1
  139. package/lib/pkce/pkce.cjs +54 -0
  140. package/lib/pkce/pkce.cjs.map +1 -0
  141. package/lib/pkce/pkce.d.cts +38 -0
  142. package/lib/pkce/pkce.d.ts +38 -0
  143. package/lib/pkce/pkce.js +53 -0
  144. package/lib/pkce/pkce.js.map +1 -0
  145. package/lib/sso/interfaces/authorization-url-options.interface.d.cts +34 -8
  146. package/lib/sso/interfaces/authorization-url-options.interface.d.ts +34 -8
  147. package/lib/sso/interfaces/get-profile-and-token-options.interface.d.cts +6 -0
  148. package/lib/sso/interfaces/get-profile-and-token-options.interface.d.ts +6 -0
  149. package/lib/sso/interfaces/index.d.cts +2 -2
  150. package/lib/sso/interfaces/index.d.ts +2 -2
  151. package/lib/sso/sso.cjs +90 -8
  152. package/lib/sso/sso.cjs.map +1 -1
  153. package/lib/sso/sso.d.cts +41 -2
  154. package/lib/sso/sso.d.ts +41 -2
  155. package/lib/sso/sso.js +90 -8
  156. package/lib/sso/sso.js.map +1 -1
  157. package/lib/user-management/interfaces/authenticate-with-code-and-verifier-options.interface.d.cts +2 -2
  158. package/lib/user-management/interfaces/authenticate-with-code-and-verifier-options.interface.d.ts +2 -2
  159. package/lib/user-management/interfaces/authenticate-with-options-base.interface.d.cts +19 -3
  160. package/lib/user-management/interfaces/authenticate-with-options-base.interface.d.ts +19 -3
  161. package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.cjs +0 -0
  162. package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.d.cts +16 -0
  163. package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.d.ts +16 -0
  164. package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.js +1 -0
  165. package/lib/user-management/interfaces/authorization-url-options.interface.d.cts +30 -5
  166. package/lib/user-management/interfaces/authorization-url-options.interface.d.ts +30 -5
  167. package/lib/user-management/interfaces/index.d.cts +5 -3
  168. package/lib/user-management/interfaces/index.d.ts +5 -3
  169. package/lib/user-management/interfaces/logout-url-options.interface.cjs +0 -0
  170. package/lib/user-management/interfaces/logout-url-options.interface.d.cts +8 -0
  171. package/lib/user-management/interfaces/logout-url-options.interface.d.ts +8 -0
  172. package/lib/user-management/interfaces/logout-url-options.interface.js +1 -0
  173. package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.cjs.map +1 -1
  174. package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.d.cts +2 -1
  175. package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.d.ts +2 -1
  176. package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.js.map +1 -1
  177. package/lib/user-management/serializers/authenticate-with-code-options.serializer.cjs.map +1 -1
  178. package/lib/user-management/serializers/authenticate-with-code-options.serializer.d.cts +2 -1
  179. package/lib/user-management/serializers/authenticate-with-code-options.serializer.d.ts +2 -1
  180. package/lib/user-management/serializers/authenticate-with-code-options.serializer.js.map +1 -1
  181. package/lib/user-management/serializers/authenticate-with-email-verification.serializer.cjs.map +1 -1
  182. package/lib/user-management/serializers/authenticate-with-email-verification.serializer.d.cts +2 -1
  183. package/lib/user-management/serializers/authenticate-with-email-verification.serializer.d.ts +2 -1
  184. package/lib/user-management/serializers/authenticate-with-email-verification.serializer.js.map +1 -1
  185. package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.cjs.map +1 -1
  186. package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.d.cts +2 -1
  187. package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.d.ts +2 -1
  188. package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.js.map +1 -1
  189. package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.cjs.map +1 -1
  190. package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.d.cts +2 -1
  191. package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.d.ts +2 -1
  192. package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.js.map +1 -1
  193. package/lib/user-management/serializers/authenticate-with-password-options.serializer.cjs.map +1 -1
  194. package/lib/user-management/serializers/authenticate-with-password-options.serializer.d.cts +2 -1
  195. package/lib/user-management/serializers/authenticate-with-password-options.serializer.d.ts +2 -1
  196. package/lib/user-management/serializers/authenticate-with-password-options.serializer.js.map +1 -1
  197. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.cjs +14 -0
  198. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.cjs.map +1 -0
  199. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.d.cts +8 -0
  200. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.d.ts +8 -0
  201. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.js +13 -0
  202. package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.js.map +1 -0
  203. package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.cjs.map +1 -1
  204. package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.d.cts +2 -1
  205. package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.d.ts +2 -1
  206. package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.js.map +1 -1
  207. package/lib/user-management/serializers/authenticate-with-totp-options.serializer.cjs.map +1 -1
  208. package/lib/user-management/serializers/authenticate-with-totp-options.serializer.d.cts +2 -1
  209. package/lib/user-management/serializers/authenticate-with-totp-options.serializer.d.ts +2 -1
  210. package/lib/user-management/serializers/authenticate-with-totp-options.serializer.js.map +1 -1
  211. package/lib/user-management/serializers/index.cjs +2 -0
  212. package/lib/user-management/serializers/index.d.cts +2 -1
  213. package/lib/user-management/serializers/index.d.ts +2 -1
  214. package/lib/user-management/serializers/index.js +2 -1
  215. package/lib/user-management/session.cjs +3 -10
  216. package/lib/user-management/session.cjs.map +1 -1
  217. package/lib/user-management/session.js +3 -10
  218. package/lib/user-management/session.js.map +1 -1
  219. package/lib/user-management/user-management.cjs +186 -31
  220. package/lib/user-management/user-management.cjs.map +1 -1
  221. package/lib/user-management/user-management.d.cts +71 -2
  222. package/lib/user-management/user-management.d.ts +71 -2
  223. package/lib/user-management/user-management.js +186 -31
  224. package/lib/user-management/user-management.js.map +1 -1
  225. package/lib/vault/vault.cjs +4 -0
  226. package/lib/vault/vault.cjs.map +1 -1
  227. package/lib/vault/vault.d.cts +1 -0
  228. package/lib/vault/vault.d.ts +1 -0
  229. package/lib/vault/vault.js +4 -0
  230. package/lib/vault/vault.js.map +1 -1
  231. package/lib/webhooks/webhooks.cjs +1 -1
  232. package/lib/webhooks/webhooks.js +1 -1
  233. package/lib/workos.cjs +68 -26
  234. package/lib/workos.cjs.map +1 -1
  235. package/lib/workos.d.cts +37 -8
  236. package/lib/workos.d.ts +37 -8
  237. package/lib/workos.js +68 -26
  238. package/lib/workos.js.map +1 -1
  239. package/package.json +4 -21
  240. package/lib/_virtual/rolldown_runtime.cjs +0 -19
  241. package/lib/_virtual/rolldown_runtime.js +0 -18
  242. package/lib/client/index.cjs +0 -15
  243. package/lib/client/index.d.cts +0 -3
  244. package/lib/client/index.d.ts +0 -3
  245. package/lib/client/index.js +0 -4
  246. package/lib/client/sso.cjs +0 -40
  247. package/lib/client/sso.cjs.map +0 -1
  248. package/lib/client/sso.d.cts +0 -21
  249. package/lib/client/sso.d.ts +0 -21
  250. package/lib/client/sso.js +0 -34
  251. package/lib/client/sso.js.map +0 -1
  252. package/lib/client/user-management.cjs +0 -80
  253. package/lib/client/user-management.cjs.map +0 -1
  254. package/lib/client/user-management.d.cts +0 -58
  255. package/lib/client/user-management.d.ts +0 -58
  256. package/lib/client/user-management.js +0 -72
  257. package/lib/client/user-management.js.map +0 -1
  258. package/lib/index.client.cjs +0 -15
  259. package/lib/index.client.d.cts +0 -3
  260. package/lib/index.client.d.ts +0 -3
  261. package/lib/index.client.js +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"authenticate-with-totp-options.serializer.js","names":[],"sources":["../../../src/user-management/serializers/authenticate-with-totp-options.serializer.ts"],"sourcesContent":["import {\n AuthenticateUserWithTotpCredentials,\n AuthenticateWithTotpOptions,\n SerializedAuthenticateWithTotpOptions,\n} from '../interfaces';\n\nexport const serializeAuthenticateWithTotpOptions = (\n options: AuthenticateWithTotpOptions & AuthenticateUserWithTotpCredentials,\n): SerializedAuthenticateWithTotpOptions => ({\n grant_type: 'urn:workos:oauth:grant-type:mfa-totp',\n client_id: options.clientId,\n client_secret: options.clientSecret,\n code: options.code,\n authentication_challenge_id: options.authenticationChallengeId,\n pending_authentication_token: options.pendingAuthenticationToken,\n ip_address: options.ipAddress,\n user_agent: options.userAgent,\n});\n"],"mappings":";AAMA,MAAa,wCACX,aAC2C;CAC3C,YAAY;CACZ,WAAW,QAAQ;CACnB,eAAe,QAAQ;CACvB,MAAM,QAAQ;CACd,6BAA6B,QAAQ;CACrC,8BAA8B,QAAQ;CACtC,YAAY,QAAQ;CACpB,YAAY,QAAQ;CACrB"}
1
+ {"version":3,"file":"authenticate-with-totp-options.serializer.js","names":[],"sources":["../../../src/user-management/serializers/authenticate-with-totp-options.serializer.ts"],"sourcesContent":["import {\n AuthenticateUserWithTotpCredentials,\n AuthenticateWithTotpOptions,\n SerializedAuthenticateWithTotpOptions,\n WithResolvedClientId,\n} from '../interfaces';\n\nexport const serializeAuthenticateWithTotpOptions = (\n options: WithResolvedClientId<AuthenticateWithTotpOptions> &\n AuthenticateUserWithTotpCredentials,\n): SerializedAuthenticateWithTotpOptions => ({\n grant_type: 'urn:workos:oauth:grant-type:mfa-totp',\n client_id: options.clientId,\n client_secret: options.clientSecret,\n code: options.code,\n authentication_challenge_id: options.authenticationChallengeId,\n pending_authentication_token: options.pendingAuthenticationToken,\n ip_address: options.ipAddress,\n user_agent: options.userAgent,\n});\n"],"mappings":";AAOA,MAAa,wCACX,aAE2C;CAC3C,YAAY;CACZ,WAAW,QAAQ;CACnB,eAAe,QAAQ;CACvB,MAAM,QAAQ;CACd,6BAA6B,QAAQ;CACrC,8BAA8B,QAAQ;CACtC,YAAY,QAAQ;CACpB,YAAY,QAAQ;CACrB"}
@@ -3,6 +3,7 @@ const require_user_management_serializers_authenticate_with_code_and_verifier_op
3
3
  const require_user_management_serializers_authenticate_with_magic_auth_options_serializer = require('./authenticate-with-magic-auth-options.serializer.cjs');
4
4
  const require_user_management_serializers_authenticate_with_password_options_serializer = require('./authenticate-with-password-options.serializer.cjs');
5
5
  const require_user_management_serializers_authenticate_with_refresh_token_options_serializer = require('./authenticate-with-refresh-token.options.serializer.cjs');
6
+ const require_user_management_serializers_authenticate_with_refresh_token_public_client_options_serializer = require('./authenticate-with-refresh-token-public-client-options.serializer.cjs');
6
7
  const require_user_management_serializers_authenticate_with_totp_options_serializer = require('./authenticate-with-totp-options.serializer.cjs');
7
8
  const require_user_management_serializers_authentication_event_serializer = require('./authentication-event.serializer.cjs');
8
9
  const require_user_management_serializers_user_serializer = require('./user.serializer.cjs');
@@ -41,6 +42,7 @@ exports.serializeAuthenticateWithCodeOptions = require_user_management_serialize
41
42
  exports.serializeAuthenticateWithMagicAuthOptions = require_user_management_serializers_authenticate_with_magic_auth_options_serializer.serializeAuthenticateWithMagicAuthOptions;
42
43
  exports.serializeAuthenticateWithPasswordOptions = require_user_management_serializers_authenticate_with_password_options_serializer.serializeAuthenticateWithPasswordOptions;
43
44
  exports.serializeAuthenticateWithRefreshTokenOptions = require_user_management_serializers_authenticate_with_refresh_token_options_serializer.serializeAuthenticateWithRefreshTokenOptions;
45
+ exports.serializeAuthenticateWithRefreshTokenPublicClientOptions = require_user_management_serializers_authenticate_with_refresh_token_public_client_options_serializer.serializeAuthenticateWithRefreshTokenPublicClientOptions;
44
46
  exports.serializeAuthenticateWithTotpOptions = require_user_management_serializers_authenticate_with_totp_options_serializer.serializeAuthenticateWithTotpOptions;
45
47
  exports.serializeCreateMagicAuthOptions = require_user_management_serializers_create_magic_auth_options_serializer.serializeCreateMagicAuthOptions;
46
48
  exports.serializeCreatePasswordResetOptions = require_user_management_serializers_create_password_reset_options_serializer.serializeCreatePasswordResetOptions;
@@ -2,6 +2,7 @@ import { serializeAuthenticateWithCodeAndVerifierOptions } from "./authenticate-
2
2
  import { serializeAuthenticateWithCodeOptions } from "./authenticate-with-code-options.serializer.cjs";
3
3
  import { serializeAuthenticateWithMagicAuthOptions } from "./authenticate-with-magic-auth-options.serializer.cjs";
4
4
  import { serializeAuthenticateWithPasswordOptions } from "./authenticate-with-password-options.serializer.cjs";
5
+ import { serializeAuthenticateWithRefreshTokenPublicClientOptions } from "./authenticate-with-refresh-token-public-client-options.serializer.cjs";
5
6
  import { serializeAuthenticateWithRefreshTokenOptions } from "./authenticate-with-refresh-token.options.serializer.cjs";
6
7
  import { serializeAuthenticateWithTotpOptions } from "./authenticate-with-totp-options.serializer.cjs";
7
8
  import { deserializeAuthenticationEvent } from "./authentication-event.serializer.cjs";
@@ -21,4 +22,4 @@ import { deserializeSession } from "./session.serializer.cjs";
21
22
  import { serializeUpdateUserOptions } from "./update-user-options.serializer.cjs";
22
23
  import { serializeUpdateUserPasswordOptions } from "./update-user-password-options.serializer.cjs";
23
24
  import { deserializeUser } from "./user.serializer.cjs";
24
- export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
25
+ export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithRefreshTokenPublicClientOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
@@ -2,6 +2,7 @@ import { serializeAuthenticateWithCodeAndVerifierOptions } from "./authenticate-
2
2
  import { serializeAuthenticateWithCodeOptions } from "./authenticate-with-code-options.serializer.js";
3
3
  import { serializeAuthenticateWithMagicAuthOptions } from "./authenticate-with-magic-auth-options.serializer.js";
4
4
  import { serializeAuthenticateWithPasswordOptions } from "./authenticate-with-password-options.serializer.js";
5
+ import { serializeAuthenticateWithRefreshTokenPublicClientOptions } from "./authenticate-with-refresh-token-public-client-options.serializer.js";
5
6
  import { serializeAuthenticateWithRefreshTokenOptions } from "./authenticate-with-refresh-token.options.serializer.js";
6
7
  import { serializeAuthenticateWithTotpOptions } from "./authenticate-with-totp-options.serializer.js";
7
8
  import { deserializeAuthenticationEvent } from "./authentication-event.serializer.js";
@@ -21,4 +22,4 @@ import { deserializeSession } from "./session.serializer.js";
21
22
  import { serializeUpdateUserOptions } from "./update-user-options.serializer.js";
22
23
  import { serializeUpdateUserPasswordOptions } from "./update-user-password-options.serializer.js";
23
24
  import { deserializeUser } from "./user.serializer.js";
24
- export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
25
+ export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithRefreshTokenPublicClientOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
@@ -3,6 +3,7 @@ import { serializeAuthenticateWithCodeAndVerifierOptions } from "./authenticate-
3
3
  import { serializeAuthenticateWithMagicAuthOptions } from "./authenticate-with-magic-auth-options.serializer.js";
4
4
  import { serializeAuthenticateWithPasswordOptions } from "./authenticate-with-password-options.serializer.js";
5
5
  import { serializeAuthenticateWithRefreshTokenOptions } from "./authenticate-with-refresh-token.options.serializer.js";
6
+ import { serializeAuthenticateWithRefreshTokenPublicClientOptions } from "./authenticate-with-refresh-token-public-client-options.serializer.js";
6
7
  import { serializeAuthenticateWithTotpOptions } from "./authenticate-with-totp-options.serializer.js";
7
8
  import { deserializeAuthenticationEvent } from "./authentication-event.serializer.js";
8
9
  import { deserializeUser } from "./user.serializer.js";
@@ -22,4 +23,4 @@ import { serializeCreateUserOptions } from "./create-user-options.serializer.js"
22
23
  import { serializeUpdateUserOptions } from "./update-user-options.serializer.js";
23
24
  import { serializeUpdateUserPasswordOptions } from "./update-user-password-options.serializer.js";
24
25
 
25
- export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
26
+ export { deserializeAuthenticationEvent, deserializeAuthenticationResponse, deserializeEmailVerification, deserializeEmailVerificationEvent, deserializeFactor, deserializeFactorWithSecrets, deserializeInvitation, deserializeInvitationEvent, deserializeMagicAuth, deserializeMagicAuthEvent, deserializePasswordReset, deserializePasswordResetEvent, deserializeSession, deserializeUser, serializeAuthenticateWithCodeAndVerifierOptions, serializeAuthenticateWithCodeOptions, serializeAuthenticateWithMagicAuthOptions, serializeAuthenticateWithPasswordOptions, serializeAuthenticateWithRefreshTokenOptions, serializeAuthenticateWithRefreshTokenPublicClientOptions, serializeAuthenticateWithTotpOptions, serializeCreateMagicAuthOptions, serializeCreatePasswordResetOptions, serializeCreateUserOptions, serializeEnrollAuthFactorOptions, serializeListSessionsOptions, serializeResetPasswordOptions, serializeUpdateUserOptions, serializeUpdateUserPasswordOptions };
@@ -25,15 +25,7 @@ var CookieSession = class {
25
25
  authenticated: false,
26
26
  reason: require_user_management_interfaces_authenticate_with_session_cookie_interface.AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED
27
27
  };
28
- let session;
29
- try {
30
- session = await require_common_crypto_seal.unsealData(this.sessionData, { password: this.cookiePassword });
31
- } catch (e) {
32
- return {
33
- authenticated: false,
34
- reason: require_user_management_interfaces_authenticate_with_session_cookie_interface.AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE
35
- };
36
- }
28
+ const session = await require_common_crypto_seal.unsealData(this.sessionData, { password: this.cookiePassword });
37
29
  if (!session.accessToken) return {
38
30
  authenticated: false,
39
31
  reason: require_user_management_interfaces_authenticate_with_session_cookie_interface.AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE
@@ -136,7 +128,8 @@ var CookieSession = class {
136
128
  await jwtVerify(accessToken, jwks);
137
129
  return true;
138
130
  } catch (e) {
139
- return false;
131
+ if (e instanceof Error && "code" in e && typeof e.code === "string" && (e.code.startsWith("ERR_JWT_") || e.code.startsWith("ERR_JWS_"))) return false;
132
+ throw e;
140
133
  }
141
134
  }
142
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"session.cjs","names":["AuthenticateWithSessionCookieFailureReason","session: SessionCookieData","unsealData","getJose","RefreshSessionFailureReason","OauthException"],"sources":["../../src/user-management/session.ts"],"sourcesContent":["import { OauthException } from '../common/exceptions/oauth.exception';\nimport {\n AccessToken,\n AuthenticateWithSessionCookieFailedResponse,\n AuthenticateWithSessionCookieFailureReason,\n AuthenticateWithSessionCookieSuccessResponse,\n AuthenticationResponse,\n RefreshSessionFailureReason,\n RefreshSessionResponse,\n SessionCookieData,\n} from './interfaces';\nimport { UserManagement } from './user-management';\nimport { unsealData } from '../common/crypto/seal';\nimport { getJose } from '../utils/jose';\n\ntype RefreshOptions = {\n cookiePassword?: string;\n organizationId?: string;\n};\n\nexport class CookieSession {\n private userManagement: UserManagement;\n private cookiePassword: string;\n private sessionData: string;\n\n constructor(\n userManagement: UserManagement,\n sessionData: string,\n cookiePassword: string,\n ) {\n if (!cookiePassword) {\n throw new Error('cookiePassword is required');\n }\n\n this.userManagement = userManagement;\n this.cookiePassword = cookiePassword;\n this.sessionData = sessionData;\n }\n\n /**\n * Authenticates a user with a session cookie.\n *\n * @returns An object indicating whether the authentication was successful or not. If successful, it will include the user's session data.\n */\n async authenticate(): Promise<\n | AuthenticateWithSessionCookieSuccessResponse\n | AuthenticateWithSessionCookieFailedResponse\n > {\n if (!this.sessionData) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED,\n };\n }\n\n let session: SessionCookieData;\n\n try {\n session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n } catch (e) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!session.accessToken) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!(await this.isValidJwt(session.accessToken))) {\n return {\n authenticated: false,\n reason: AuthenticateWithSessionCookieFailureReason.INVALID_JWT,\n };\n }\n\n const { decodeJwt } = await getJose();\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(session.accessToken);\n\n return {\n authenticated: true,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n authenticationMethod: session.authenticationMethod,\n impersonator: session.impersonator,\n accessToken: session.accessToken,\n };\n }\n\n /**\n * Refreshes the user's session.\n *\n * @param options - Optional options for refreshing the session.\n * @param options.cookiePassword - The password to use for the new session cookie.\n * @param options.organizationId - The organization ID to use for the new session cookie.\n * @returns An object indicating whether the refresh was successful or not. If successful, it will include the new sealed session data.\n */\n async refresh(options: RefreshOptions = {}): Promise<RefreshSessionResponse> {\n const { decodeJwt } = await getJose();\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.refreshToken || !session.user) {\n return {\n authenticated: false,\n reason: RefreshSessionFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n const { org_id: organizationIdFromAccessToken } = decodeJwt<AccessToken>(\n session.accessToken,\n );\n\n try {\n const cookiePassword = options.cookiePassword ?? this.cookiePassword;\n\n const authenticationResponse =\n await this.userManagement.authenticateWithRefreshToken({\n clientId: this.userManagement.clientId as string,\n refreshToken: session.refreshToken,\n organizationId:\n options.organizationId ?? organizationIdFromAccessToken,\n session: {\n // We want to store the new sealed session in this class instance, so this always needs to be true\n sealSession: true,\n cookiePassword,\n },\n });\n\n // Update the password if a new one was provided\n if (options.cookiePassword) {\n this.cookiePassword = options.cookiePassword;\n }\n\n this.sessionData = authenticationResponse.sealedSession as string;\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(authenticationResponse.accessToken);\n\n // TODO: Returning `session` here means there's some duplicated data.\n // Slim down the return type in a future major version.\n return {\n authenticated: true,\n sealedSession: authenticationResponse.sealedSession,\n session: authenticationResponse as AuthenticationResponse,\n authenticationMethod: authenticationResponse.authenticationMethod,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n impersonator: session.impersonator,\n };\n } catch (error) {\n if (\n error instanceof OauthException &&\n // TODO: Add additional known errors and remove re-throw\n (error.error === RefreshSessionFailureReason.INVALID_GRANT ||\n error.error === RefreshSessionFailureReason.MFA_ENROLLMENT ||\n error.error === RefreshSessionFailureReason.SSO_REQUIRED)\n ) {\n return {\n authenticated: false,\n reason: error.error,\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Gets the URL to redirect the user to for logging out.\n *\n * @returns The URL to redirect the user to for logging out.\n */\n async getLogoutUrl({\n returnTo,\n }: { returnTo?: string } = {}): Promise<string> {\n const authenticationResponse = await this.authenticate();\n\n if (!authenticationResponse.authenticated) {\n const { reason } = authenticationResponse;\n throw new Error(`Failed to extract session ID for logout URL: ${reason}`);\n }\n\n return this.userManagement.getLogoutUrl({\n sessionId: authenticationResponse.sessionId,\n returnTo,\n });\n }\n\n private async isValidJwt(accessToken: string): Promise<boolean> {\n const { jwtVerify } = await getJose();\n const jwks = await this.userManagement.getJWKS();\n if (!jwks) {\n throw new Error(\n 'Missing client ID. Did you provide it when initializing WorkOS?',\n );\n }\n\n try {\n await jwtVerify(accessToken, jwks);\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.cjs","names":["AuthenticateWithSessionCookieFailureReason","unsealData","getJose","RefreshSessionFailureReason","OauthException"],"sources":["../../src/user-management/session.ts"],"sourcesContent":["import { OauthException } from '../common/exceptions/oauth.exception';\nimport {\n AccessToken,\n AuthenticateWithSessionCookieFailedResponse,\n AuthenticateWithSessionCookieFailureReason,\n AuthenticateWithSessionCookieSuccessResponse,\n AuthenticationResponse,\n RefreshSessionFailureReason,\n RefreshSessionResponse,\n SessionCookieData,\n} from './interfaces';\nimport { UserManagement } from './user-management';\nimport { unsealData } from '../common/crypto/seal';\nimport { getJose } from '../utils/jose';\n\ntype RefreshOptions = {\n cookiePassword?: string;\n organizationId?: string;\n};\n\nexport class CookieSession {\n private userManagement: UserManagement;\n private cookiePassword: string;\n private sessionData: string;\n\n constructor(\n userManagement: UserManagement,\n sessionData: string,\n cookiePassword: string,\n ) {\n if (!cookiePassword) {\n throw new Error('cookiePassword is required');\n }\n\n this.userManagement = userManagement;\n this.cookiePassword = cookiePassword;\n this.sessionData = sessionData;\n }\n\n /**\n * Authenticates a user with a session cookie.\n *\n * @returns An object indicating whether the authentication was successful or not. If successful, it will include the user's session data.\n */\n async authenticate(): Promise<\n | AuthenticateWithSessionCookieSuccessResponse\n | AuthenticateWithSessionCookieFailedResponse\n > {\n if (!this.sessionData) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED,\n };\n }\n\n // unsealData returns {} for known seal errors (expired, bad hmac, etc.)\n // Unknown errors propagate - don't catch them as \"invalid session\"\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.accessToken) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!(await this.isValidJwt(session.accessToken))) {\n return {\n authenticated: false,\n reason: AuthenticateWithSessionCookieFailureReason.INVALID_JWT,\n };\n }\n\n const { decodeJwt } = await getJose();\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(session.accessToken);\n\n return {\n authenticated: true,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n authenticationMethod: session.authenticationMethod,\n impersonator: session.impersonator,\n accessToken: session.accessToken,\n };\n }\n\n /**\n * Refreshes the user's session.\n *\n * @param options - Optional options for refreshing the session.\n * @param options.cookiePassword - The password to use for the new session cookie.\n * @param options.organizationId - The organization ID to use for the new session cookie.\n * @returns An object indicating whether the refresh was successful or not. If successful, it will include the new sealed session data.\n */\n async refresh(options: RefreshOptions = {}): Promise<RefreshSessionResponse> {\n const { decodeJwt } = await getJose();\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.refreshToken || !session.user) {\n return {\n authenticated: false,\n reason: RefreshSessionFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n const { org_id: organizationIdFromAccessToken } = decodeJwt<AccessToken>(\n session.accessToken,\n );\n\n try {\n const cookiePassword = options.cookiePassword ?? this.cookiePassword;\n\n const authenticationResponse =\n await this.userManagement.authenticateWithRefreshToken({\n clientId: this.userManagement.clientId as string,\n refreshToken: session.refreshToken,\n organizationId:\n options.organizationId ?? organizationIdFromAccessToken,\n session: {\n // We want to store the new sealed session in this class instance, so this always needs to be true\n sealSession: true,\n cookiePassword,\n },\n });\n\n // Update the password if a new one was provided\n if (options.cookiePassword) {\n this.cookiePassword = options.cookiePassword;\n }\n\n this.sessionData = authenticationResponse.sealedSession as string;\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(authenticationResponse.accessToken);\n\n // TODO: Returning `session` here means there's some duplicated data.\n // Slim down the return type in a future major version.\n return {\n authenticated: true,\n sealedSession: authenticationResponse.sealedSession,\n session: authenticationResponse as AuthenticationResponse,\n authenticationMethod: authenticationResponse.authenticationMethod,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n impersonator: session.impersonator,\n };\n } catch (error) {\n if (\n error instanceof OauthException &&\n // TODO: Add additional known errors and remove re-throw\n (error.error === RefreshSessionFailureReason.INVALID_GRANT ||\n error.error === RefreshSessionFailureReason.MFA_ENROLLMENT ||\n error.error === RefreshSessionFailureReason.SSO_REQUIRED)\n ) {\n return {\n authenticated: false,\n reason: error.error,\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Gets the URL to redirect the user to for logging out.\n *\n * @returns The URL to redirect the user to for logging out.\n */\n async getLogoutUrl({\n returnTo,\n }: { returnTo?: string } = {}): Promise<string> {\n const authenticationResponse = await this.authenticate();\n\n if (!authenticationResponse.authenticated) {\n const { reason } = authenticationResponse;\n throw new Error(`Failed to extract session ID for logout URL: ${reason}`);\n }\n\n return this.userManagement.getLogoutUrl({\n sessionId: authenticationResponse.sessionId,\n returnTo,\n });\n }\n\n private async isValidJwt(accessToken: string): Promise<boolean> {\n const { jwtVerify } = await getJose();\n const jwks = await this.userManagement.getJWKS();\n if (!jwks) {\n throw new Error(\n 'Missing client ID. Did you provide it when initializing WorkOS?',\n );\n }\n\n try {\n await jwtVerify(accessToken, jwks);\n return true;\n } catch (e) {\n // Only treat as invalid JWT if it's an actual JWT/JWS error from jose\n // Network errors, crypto failures, etc. should propagate\n if (\n e instanceof Error &&\n 'code' in e &&\n typeof e.code === 'string' &&\n (e.code.startsWith('ERR_JWT_') || e.code.startsWith('ERR_JWS_'))\n ) {\n return false;\n }\n throw e;\n }\n }\n}\n"],"mappings":"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"}
@@ -25,15 +25,7 @@ var CookieSession = class {
25
25
  authenticated: false,
26
26
  reason: AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED
27
27
  };
28
- let session;
29
- try {
30
- session = await unsealData(this.sessionData, { password: this.cookiePassword });
31
- } catch (e) {
32
- return {
33
- authenticated: false,
34
- reason: AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE
35
- };
36
- }
28
+ const session = await unsealData(this.sessionData, { password: this.cookiePassword });
37
29
  if (!session.accessToken) return {
38
30
  authenticated: false,
39
31
  reason: AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE
@@ -136,7 +128,8 @@ var CookieSession = class {
136
128
  await jwtVerify(accessToken, jwks);
137
129
  return true;
138
130
  } catch (e) {
139
- return false;
131
+ if (e instanceof Error && "code" in e && typeof e.code === "string" && (e.code.startsWith("ERR_JWT_") || e.code.startsWith("ERR_JWS_"))) return false;
132
+ throw e;
140
133
  }
141
134
  }
142
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":["session: SessionCookieData"],"sources":["../../src/user-management/session.ts"],"sourcesContent":["import { OauthException } from '../common/exceptions/oauth.exception';\nimport {\n AccessToken,\n AuthenticateWithSessionCookieFailedResponse,\n AuthenticateWithSessionCookieFailureReason,\n AuthenticateWithSessionCookieSuccessResponse,\n AuthenticationResponse,\n RefreshSessionFailureReason,\n RefreshSessionResponse,\n SessionCookieData,\n} from './interfaces';\nimport { UserManagement } from './user-management';\nimport { unsealData } from '../common/crypto/seal';\nimport { getJose } from '../utils/jose';\n\ntype RefreshOptions = {\n cookiePassword?: string;\n organizationId?: string;\n};\n\nexport class CookieSession {\n private userManagement: UserManagement;\n private cookiePassword: string;\n private sessionData: string;\n\n constructor(\n userManagement: UserManagement,\n sessionData: string,\n cookiePassword: string,\n ) {\n if (!cookiePassword) {\n throw new Error('cookiePassword is required');\n }\n\n this.userManagement = userManagement;\n this.cookiePassword = cookiePassword;\n this.sessionData = sessionData;\n }\n\n /**\n * Authenticates a user with a session cookie.\n *\n * @returns An object indicating whether the authentication was successful or not. If successful, it will include the user's session data.\n */\n async authenticate(): Promise<\n | AuthenticateWithSessionCookieSuccessResponse\n | AuthenticateWithSessionCookieFailedResponse\n > {\n if (!this.sessionData) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED,\n };\n }\n\n let session: SessionCookieData;\n\n try {\n session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n } catch (e) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!session.accessToken) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!(await this.isValidJwt(session.accessToken))) {\n return {\n authenticated: false,\n reason: AuthenticateWithSessionCookieFailureReason.INVALID_JWT,\n };\n }\n\n const { decodeJwt } = await getJose();\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(session.accessToken);\n\n return {\n authenticated: true,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n authenticationMethod: session.authenticationMethod,\n impersonator: session.impersonator,\n accessToken: session.accessToken,\n };\n }\n\n /**\n * Refreshes the user's session.\n *\n * @param options - Optional options for refreshing the session.\n * @param options.cookiePassword - The password to use for the new session cookie.\n * @param options.organizationId - The organization ID to use for the new session cookie.\n * @returns An object indicating whether the refresh was successful or not. If successful, it will include the new sealed session data.\n */\n async refresh(options: RefreshOptions = {}): Promise<RefreshSessionResponse> {\n const { decodeJwt } = await getJose();\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.refreshToken || !session.user) {\n return {\n authenticated: false,\n reason: RefreshSessionFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n const { org_id: organizationIdFromAccessToken } = decodeJwt<AccessToken>(\n session.accessToken,\n );\n\n try {\n const cookiePassword = options.cookiePassword ?? this.cookiePassword;\n\n const authenticationResponse =\n await this.userManagement.authenticateWithRefreshToken({\n clientId: this.userManagement.clientId as string,\n refreshToken: session.refreshToken,\n organizationId:\n options.organizationId ?? organizationIdFromAccessToken,\n session: {\n // We want to store the new sealed session in this class instance, so this always needs to be true\n sealSession: true,\n cookiePassword,\n },\n });\n\n // Update the password if a new one was provided\n if (options.cookiePassword) {\n this.cookiePassword = options.cookiePassword;\n }\n\n this.sessionData = authenticationResponse.sealedSession as string;\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(authenticationResponse.accessToken);\n\n // TODO: Returning `session` here means there's some duplicated data.\n // Slim down the return type in a future major version.\n return {\n authenticated: true,\n sealedSession: authenticationResponse.sealedSession,\n session: authenticationResponse as AuthenticationResponse,\n authenticationMethod: authenticationResponse.authenticationMethod,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n impersonator: session.impersonator,\n };\n } catch (error) {\n if (\n error instanceof OauthException &&\n // TODO: Add additional known errors and remove re-throw\n (error.error === RefreshSessionFailureReason.INVALID_GRANT ||\n error.error === RefreshSessionFailureReason.MFA_ENROLLMENT ||\n error.error === RefreshSessionFailureReason.SSO_REQUIRED)\n ) {\n return {\n authenticated: false,\n reason: error.error,\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Gets the URL to redirect the user to for logging out.\n *\n * @returns The URL to redirect the user to for logging out.\n */\n async getLogoutUrl({\n returnTo,\n }: { returnTo?: string } = {}): Promise<string> {\n const authenticationResponse = await this.authenticate();\n\n if (!authenticationResponse.authenticated) {\n const { reason } = authenticationResponse;\n throw new Error(`Failed to extract session ID for logout URL: ${reason}`);\n }\n\n return this.userManagement.getLogoutUrl({\n sessionId: authenticationResponse.sessionId,\n returnTo,\n });\n }\n\n private async isValidJwt(accessToken: string): Promise<boolean> {\n const { jwtVerify } = await getJose();\n const jwks = await this.userManagement.getJWKS();\n if (!jwks) {\n throw new Error(\n 'Missing client ID. Did you provide it when initializing WorkOS?',\n );\n }\n\n try {\n await jwtVerify(accessToken, jwks);\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":[],"sources":["../../src/user-management/session.ts"],"sourcesContent":["import { OauthException } from '../common/exceptions/oauth.exception';\nimport {\n AccessToken,\n AuthenticateWithSessionCookieFailedResponse,\n AuthenticateWithSessionCookieFailureReason,\n AuthenticateWithSessionCookieSuccessResponse,\n AuthenticationResponse,\n RefreshSessionFailureReason,\n RefreshSessionResponse,\n SessionCookieData,\n} from './interfaces';\nimport { UserManagement } from './user-management';\nimport { unsealData } from '../common/crypto/seal';\nimport { getJose } from '../utils/jose';\n\ntype RefreshOptions = {\n cookiePassword?: string;\n organizationId?: string;\n};\n\nexport class CookieSession {\n private userManagement: UserManagement;\n private cookiePassword: string;\n private sessionData: string;\n\n constructor(\n userManagement: UserManagement,\n sessionData: string,\n cookiePassword: string,\n ) {\n if (!cookiePassword) {\n throw new Error('cookiePassword is required');\n }\n\n this.userManagement = userManagement;\n this.cookiePassword = cookiePassword;\n this.sessionData = sessionData;\n }\n\n /**\n * Authenticates a user with a session cookie.\n *\n * @returns An object indicating whether the authentication was successful or not. If successful, it will include the user's session data.\n */\n async authenticate(): Promise<\n | AuthenticateWithSessionCookieSuccessResponse\n | AuthenticateWithSessionCookieFailedResponse\n > {\n if (!this.sessionData) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.NO_SESSION_COOKIE_PROVIDED,\n };\n }\n\n // unsealData returns {} for known seal errors (expired, bad hmac, etc.)\n // Unknown errors propagate - don't catch them as \"invalid session\"\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.accessToken) {\n return {\n authenticated: false,\n reason:\n AuthenticateWithSessionCookieFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n if (!(await this.isValidJwt(session.accessToken))) {\n return {\n authenticated: false,\n reason: AuthenticateWithSessionCookieFailureReason.INVALID_JWT,\n };\n }\n\n const { decodeJwt } = await getJose();\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(session.accessToken);\n\n return {\n authenticated: true,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n authenticationMethod: session.authenticationMethod,\n impersonator: session.impersonator,\n accessToken: session.accessToken,\n };\n }\n\n /**\n * Refreshes the user's session.\n *\n * @param options - Optional options for refreshing the session.\n * @param options.cookiePassword - The password to use for the new session cookie.\n * @param options.organizationId - The organization ID to use for the new session cookie.\n * @returns An object indicating whether the refresh was successful or not. If successful, it will include the new sealed session data.\n */\n async refresh(options: RefreshOptions = {}): Promise<RefreshSessionResponse> {\n const { decodeJwt } = await getJose();\n const session = await unsealData<SessionCookieData>(this.sessionData, {\n password: this.cookiePassword,\n });\n\n if (!session.refreshToken || !session.user) {\n return {\n authenticated: false,\n reason: RefreshSessionFailureReason.INVALID_SESSION_COOKIE,\n };\n }\n\n const { org_id: organizationIdFromAccessToken } = decodeJwt<AccessToken>(\n session.accessToken,\n );\n\n try {\n const cookiePassword = options.cookiePassword ?? this.cookiePassword;\n\n const authenticationResponse =\n await this.userManagement.authenticateWithRefreshToken({\n clientId: this.userManagement.clientId as string,\n refreshToken: session.refreshToken,\n organizationId:\n options.organizationId ?? organizationIdFromAccessToken,\n session: {\n // We want to store the new sealed session in this class instance, so this always needs to be true\n sealSession: true,\n cookiePassword,\n },\n });\n\n // Update the password if a new one was provided\n if (options.cookiePassword) {\n this.cookiePassword = options.cookiePassword;\n }\n\n this.sessionData = authenticationResponse.sealedSession as string;\n\n const {\n sid: sessionId,\n org_id: organizationId,\n role,\n roles,\n permissions,\n entitlements,\n feature_flags: featureFlags,\n } = decodeJwt<AccessToken>(authenticationResponse.accessToken);\n\n // TODO: Returning `session` here means there's some duplicated data.\n // Slim down the return type in a future major version.\n return {\n authenticated: true,\n sealedSession: authenticationResponse.sealedSession,\n session: authenticationResponse as AuthenticationResponse,\n authenticationMethod: authenticationResponse.authenticationMethod,\n sessionId,\n organizationId,\n role,\n roles,\n permissions,\n entitlements,\n featureFlags,\n user: session.user,\n impersonator: session.impersonator,\n };\n } catch (error) {\n if (\n error instanceof OauthException &&\n // TODO: Add additional known errors and remove re-throw\n (error.error === RefreshSessionFailureReason.INVALID_GRANT ||\n error.error === RefreshSessionFailureReason.MFA_ENROLLMENT ||\n error.error === RefreshSessionFailureReason.SSO_REQUIRED)\n ) {\n return {\n authenticated: false,\n reason: error.error,\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Gets the URL to redirect the user to for logging out.\n *\n * @returns The URL to redirect the user to for logging out.\n */\n async getLogoutUrl({\n returnTo,\n }: { returnTo?: string } = {}): Promise<string> {\n const authenticationResponse = await this.authenticate();\n\n if (!authenticationResponse.authenticated) {\n const { reason } = authenticationResponse;\n throw new Error(`Failed to extract session ID for logout URL: ${reason}`);\n }\n\n return this.userManagement.getLogoutUrl({\n sessionId: authenticationResponse.sessionId,\n returnTo,\n });\n }\n\n private async isValidJwt(accessToken: string): Promise<boolean> {\n const { jwtVerify } = await getJose();\n const jwks = await this.userManagement.getJWKS();\n if (!jwks) {\n throw new Error(\n 'Missing client ID. Did you provide it when initializing WorkOS?',\n );\n }\n\n try {\n await jwtVerify(accessToken, jwks);\n return true;\n } catch (e) {\n // Only treat as invalid JWT if it's an actual JWT/JWS error from jose\n // Network errors, crypto failures, etc. should propagate\n if (\n e instanceof Error &&\n 'code' in e &&\n typeof e.code === 'string' &&\n (e.code.startsWith('ERR_JWT_') || e.code.startsWith('ERR_JWS_'))\n ) {\n return false;\n }\n throw e;\n }\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- const require_client_user_management = require('../client/user-management.cjs');
1
+ const require_common_utils_pagination = require('../common/utils/pagination.cjs');
2
2
  const require_user_management_serializers_authenticate_with_code_options_serializer = require('./serializers/authenticate-with-code-options.serializer.cjs');
3
3
  const require_user_management_serializers_authenticate_with_code_and_verifier_options_serializer = require('./serializers/authenticate-with-code-and-verifier-options.serializer.cjs');
4
4
  const require_user_management_serializers_authenticate_with_magic_auth_options_serializer = require('./serializers/authenticate-with-magic-auth-options.serializer.cjs');
5
5
  const require_user_management_serializers_authenticate_with_password_options_serializer = require('./serializers/authenticate-with-password-options.serializer.cjs');
6
6
  const require_user_management_serializers_authenticate_with_refresh_token_options_serializer = require('./serializers/authenticate-with-refresh-token.options.serializer.cjs');
7
+ const require_user_management_serializers_authenticate_with_refresh_token_public_client_options_serializer = require('./serializers/authenticate-with-refresh-token-public-client-options.serializer.cjs');
7
8
  const require_user_management_serializers_authenticate_with_totp_options_serializer = require('./serializers/authenticate-with-totp-options.serializer.cjs');
8
9
  const require_user_management_serializers_user_serializer = require('./serializers/user.serializer.cjs');
9
10
  const require_user_management_serializers_authentication_response_serializer = require('./serializers/authentication-response.serializer.cjs');
@@ -21,9 +22,9 @@ const require_user_management_serializers_session_serializer = require('./serial
21
22
  const require_user_management_serializers_create_user_options_serializer = require('./serializers/create-user-options.serializer.cjs');
22
23
  const require_user_management_serializers_update_user_options_serializer = require('./serializers/update-user-options.serializer.cjs');
23
24
  const require_user_management_serializers_organization_membership_serializer = require('./serializers/organization-membership.serializer.cjs');
24
- const require_common_utils_pagination = require('../common/utils/pagination.cjs');
25
25
  const require_common_utils_fetch_and_deserialize = require('../common/utils/fetch-and-deserialize.cjs');
26
26
  const require_feature_flags_serializers_feature_flag_serializer = require('../feature-flags/serializers/feature-flag.serializer.cjs');
27
+ const require_common_utils_query_string = require('../common/utils/query-string.cjs');
27
28
  const require_mfa_serializers_challenge_serializer = require('../mfa/serializers/challenge.serializer.cjs');
28
29
  const require_common_crypto_seal = require('../common/crypto/seal.cjs');
29
30
  const require_common_utils_env = require('../common/utils/env.cjs');
@@ -50,6 +51,15 @@ var UserManagement = class {
50
51
  const { clientId } = workos.options;
51
52
  this.clientId = clientId;
52
53
  }
54
+ /**
55
+ * Resolve clientId from method options or fall back to constructor-provided value.
56
+ * @throws TypeError if clientId is not available from either source
57
+ */
58
+ resolveClientId(clientId) {
59
+ const resolved = clientId ?? this.clientId;
60
+ if (!resolved) throw new TypeError("clientId is required. Provide it in method options or when initializing WorkOS.");
61
+ return resolved;
62
+ }
53
63
  async getJWKS() {
54
64
  const { createRemoteJWKSet } = await require_utils_jose.getJose();
55
65
  if (!this.clientId) return;
@@ -83,9 +93,11 @@ var UserManagement = class {
83
93
  return require_user_management_serializers_user_serializer.deserializeUser(data);
84
94
  }
85
95
  async authenticateWithMagicAuth(payload) {
86
- const { session, ...remainingPayload } = payload;
96
+ const { session, clientId, ...remainingPayload } = payload;
97
+ const resolvedClientId = this.resolveClientId(clientId);
87
98
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_magic_auth_options_serializer.serializeAuthenticateWithMagicAuthOptions({
88
99
  ...remainingPayload,
100
+ clientId: resolvedClientId,
89
101
  clientSecret: this.workos.key
90
102
  }));
91
103
  return this.prepareAuthenticationResponse({
@@ -94,9 +106,11 @@ var UserManagement = class {
94
106
  });
95
107
  }
96
108
  async authenticateWithPassword(payload) {
97
- const { session, ...remainingPayload } = payload;
109
+ const { session, clientId, ...remainingPayload } = payload;
110
+ const resolvedClientId = this.resolveClientId(clientId);
98
111
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_password_options_serializer.serializeAuthenticateWithPasswordOptions({
99
112
  ...remainingPayload,
113
+ clientId: resolvedClientId,
100
114
  clientSecret: this.workos.key
101
115
  }));
102
116
  return this.prepareAuthenticationResponse({
@@ -104,40 +118,86 @@ var UserManagement = class {
104
118
  session
105
119
  });
106
120
  }
121
+ /**
122
+ * Exchange an authorization code for tokens.
123
+ *
124
+ * Auto-detects public vs confidential client mode:
125
+ * - If codeVerifier is provided: Uses PKCE flow (public client)
126
+ * - If no codeVerifier: Uses client_secret from API key (confidential client)
127
+ * - If both: Uses both client_secret AND codeVerifier (confidential client with PKCE)
128
+ *
129
+ * Using PKCE with confidential clients is recommended by OAuth 2.1 for defense
130
+ * in depth and provides additional CSRF protection on the authorization flow.
131
+ *
132
+ * @throws Error if neither codeVerifier nor API key is available
133
+ */
107
134
  async authenticateWithCode(payload) {
108
- const { session, ...remainingPayload } = payload;
135
+ const { session, clientId, codeVerifier, ...remainingPayload } = payload;
136
+ const resolvedClientId = this.resolveClientId(clientId);
137
+ if (codeVerifier !== void 0 && codeVerifier.trim() === "") throw new TypeError("codeVerifier cannot be an empty string. Generate a valid PKCE pair using workos.pkce.generate().");
138
+ const hasApiKey = !!this.workos.key;
139
+ if (!!!codeVerifier && !hasApiKey) throw new TypeError("authenticateWithCode requires either a codeVerifier (for public clients) or an API key configured on the WorkOS instance (for confidential clients).");
109
140
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_code_options_serializer.serializeAuthenticateWithCodeOptions({
110
141
  ...remainingPayload,
111
- clientSecret: this.workos.key
112
- }));
142
+ clientId: resolvedClientId,
143
+ codeVerifier,
144
+ clientSecret: hasApiKey ? this.workos.key : void 0
145
+ }), { skipApiKeyCheck: !hasApiKey });
113
146
  return this.prepareAuthenticationResponse({
114
147
  authenticationResponse: require_user_management_serializers_authentication_response_serializer.deserializeAuthenticationResponse(data),
115
148
  session
116
149
  });
117
150
  }
151
+ /**
152
+ * Exchange an authorization code for tokens using PKCE (public client flow).
153
+ * Use this instead of authenticateWithCode() when the client cannot securely
154
+ * store a client_secret (browser, mobile, CLI, desktop apps).
155
+ *
156
+ * @param payload.clientId - Your WorkOS client ID
157
+ * @param payload.code - The authorization code from the OAuth callback
158
+ * @param payload.codeVerifier - The PKCE code verifier used to generate the code challenge
159
+ */
118
160
  async authenticateWithCodeAndVerifier(payload) {
119
- const { session, ...remainingPayload } = payload;
120
- const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_code_and_verifier_options_serializer.serializeAuthenticateWithCodeAndVerifierOptions(remainingPayload));
161
+ const { session, clientId, ...remainingPayload } = payload;
162
+ const resolvedClientId = this.resolveClientId(clientId);
163
+ const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_code_and_verifier_options_serializer.serializeAuthenticateWithCodeAndVerifierOptions({
164
+ ...remainingPayload,
165
+ clientId: resolvedClientId
166
+ }), { skipApiKeyCheck: true });
121
167
  return this.prepareAuthenticationResponse({
122
168
  authenticationResponse: require_user_management_serializers_authentication_response_serializer.deserializeAuthenticationResponse(data),
123
169
  session
124
170
  });
125
171
  }
172
+ /**
173
+ * Refresh an access token using a refresh token.
174
+ * Automatically detects public client mode - if no API key is configured,
175
+ * omits client_secret from the request.
176
+ */
126
177
  async authenticateWithRefreshToken(payload) {
127
- const { session, ...remainingPayload } = payload;
128
- const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_refresh_token_options_serializer.serializeAuthenticateWithRefreshTokenOptions({
178
+ const { session, clientId, ...remainingPayload } = payload;
179
+ const resolvedClientId = this.resolveClientId(clientId);
180
+ const isPublicClient = !this.workos.key;
181
+ const body = isPublicClient ? require_user_management_serializers_authenticate_with_refresh_token_public_client_options_serializer.serializeAuthenticateWithRefreshTokenPublicClientOptions({
182
+ ...remainingPayload,
183
+ clientId: resolvedClientId
184
+ }) : require_user_management_serializers_authenticate_with_refresh_token_options_serializer.serializeAuthenticateWithRefreshTokenOptions({
129
185
  ...remainingPayload,
186
+ clientId: resolvedClientId,
130
187
  clientSecret: this.workos.key
131
- }));
188
+ });
189
+ const { data } = await this.workos.post("/user_management/authenticate", body, { skipApiKeyCheck: isPublicClient });
132
190
  return this.prepareAuthenticationResponse({
133
191
  authenticationResponse: require_user_management_serializers_authentication_response_serializer.deserializeAuthenticationResponse(data),
134
192
  session
135
193
  });
136
194
  }
137
195
  async authenticateWithTotp(payload) {
138
- const { session, ...remainingPayload } = payload;
196
+ const { session, clientId, ...remainingPayload } = payload;
197
+ const resolvedClientId = this.resolveClientId(clientId);
139
198
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_totp_options_serializer.serializeAuthenticateWithTotpOptions({
140
199
  ...remainingPayload,
200
+ clientId: resolvedClientId,
141
201
  clientSecret: this.workos.key
142
202
  }));
143
203
  return this.prepareAuthenticationResponse({
@@ -146,9 +206,11 @@ var UserManagement = class {
146
206
  });
147
207
  }
148
208
  async authenticateWithEmailVerification(payload) {
149
- const { session, ...remainingPayload } = payload;
209
+ const { session, clientId, ...remainingPayload } = payload;
210
+ const resolvedClientId = this.resolveClientId(clientId);
150
211
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_email_verification_serializer.serializeAuthenticateWithEmailVerificationOptions({
151
212
  ...remainingPayload,
213
+ clientId: resolvedClientId,
152
214
  clientSecret: this.workos.key
153
215
  }));
154
216
  return this.prepareAuthenticationResponse({
@@ -157,9 +219,11 @@ var UserManagement = class {
157
219
  });
158
220
  }
159
221
  async authenticateWithOrganizationSelection(payload) {
160
- const { session, ...remainingPayload } = payload;
222
+ const { session, clientId, ...remainingPayload } = payload;
223
+ const resolvedClientId = this.resolveClientId(clientId);
161
224
  const { data } = await this.workos.post("/user_management/authenticate", require_user_management_serializers_authenticate_with_organization_selection_options_serializer.serializeAuthenticateWithOrganizationSelectionOptions({
162
225
  ...remainingPayload,
226
+ clientId: resolvedClientId,
163
227
  clientSecret: this.workos.key
164
228
  }));
165
229
  return this.prepareAuthenticationResponse({
@@ -207,17 +271,21 @@ var UserManagement = class {
207
271
  await jwtVerify(accessToken, jwks);
208
272
  return true;
209
273
  } catch (e) {
210
- return false;
274
+ if (e instanceof Error && "code" in e && typeof e.code === "string" && (e.code.startsWith("ERR_JWT_") || e.code.startsWith("ERR_JWS_"))) return false;
275
+ throw e;
211
276
  }
212
277
  }
213
278
  async prepareAuthenticationResponse({ authenticationResponse, session }) {
214
- if (session?.sealSession) return {
215
- ...authenticationResponse,
216
- sealedSession: await this.sealSessionDataFromAuthenticationResponse({
217
- authenticationResponse,
218
- cookiePassword: session.cookiePassword
219
- })
220
- };
279
+ if (session?.sealSession) {
280
+ if (!this.workos.key) throw new Error("Session sealing requires server-side usage with an API key. Public clients should store tokens directly (e.g., secure storage on mobile, keychain on desktop).");
281
+ return {
282
+ ...authenticationResponse,
283
+ sealedSession: await this.sealSessionDataFromAuthenticationResponse({
284
+ authenticationResponse,
285
+ cookiePassword: session.cookiePassword
286
+ })
287
+ };
288
+ }
221
289
  return authenticationResponse;
222
290
  }
223
291
  async sealSessionDataFromAuthenticationResponse({ authenticationResponse, cookiePassword }) {
@@ -356,20 +424,107 @@ var UserManagement = class {
356
424
  async revokeSession(payload) {
357
425
  await this.workos.post("/user_management/sessions/revoke", require_user_management_interfaces_revoke_session_options_interface.serializeRevokeSessionOptions(payload));
358
426
  }
427
+ /**
428
+ * Generate an OAuth 2.0 authorization URL.
429
+ *
430
+ * For public clients (browser, mobile, CLI), include PKCE parameters:
431
+ * - Generate PKCE using workos.pkce.generate()
432
+ * - Pass codeChallenge and codeChallengeMethod here
433
+ * - Store codeVerifier and pass to authenticateWithCode() later
434
+ *
435
+ * Or use getAuthorizationUrlWithPKCE() which handles PKCE automatically.
436
+ */
359
437
  getAuthorizationUrl(options) {
360
- return require_client_user_management.getAuthorizationUrl({
361
- ...options,
362
- baseURL: this.workos.baseURL
438
+ const { connectionId, codeChallenge, codeChallengeMethod, clientId, domainHint, loginHint, organizationId, provider, providerQueryParams, providerScopes, prompt, redirectUri, state, screenHint } = options;
439
+ const resolvedClientId = this.resolveClientId(clientId);
440
+ if (!provider && !connectionId && !organizationId) throw new TypeError(`Incomplete arguments. Need to specify either a 'connectionId', 'organizationId', or 'provider'.`);
441
+ if (provider !== "authkit" && screenHint) throw new TypeError(`'screenHint' is only supported for 'authkit' provider`);
442
+ const query = require_common_utils_query_string.toQueryString({
443
+ connection_id: connectionId,
444
+ code_challenge: codeChallenge,
445
+ code_challenge_method: codeChallengeMethod,
446
+ organization_id: organizationId,
447
+ domain_hint: domainHint,
448
+ login_hint: loginHint,
449
+ provider,
450
+ provider_query_params: providerQueryParams,
451
+ provider_scopes: providerScopes,
452
+ prompt,
453
+ client_id: resolvedClientId,
454
+ redirect_uri: redirectUri,
455
+ response_type: "code",
456
+ state,
457
+ screen_hint: screenHint
363
458
  });
459
+ return `${this.workos.baseURL}/user_management/authorize?${query}`;
364
460
  }
365
- getLogoutUrl(options) {
366
- return require_client_user_management.getLogoutUrl({
367
- ...options,
368
- baseURL: this.workos.baseURL
461
+ /**
462
+ * Generate an OAuth 2.0 authorization URL with automatic PKCE.
463
+ *
464
+ * This method generates PKCE parameters internally and returns them along with
465
+ * the authorization URL. Use this for public clients (CLI apps, Electron, mobile)
466
+ * that cannot securely store a client secret.
467
+ *
468
+ * @returns Object containing url, state, and codeVerifier
469
+ *
470
+ * @example
471
+ * ```typescript
472
+ * const { url, state, codeVerifier } = await workos.userManagement.getAuthorizationUrlWithPKCE({
473
+ * provider: 'authkit',
474
+ * clientId: 'client_123',
475
+ * redirectUri: 'myapp://callback',
476
+ * });
477
+ *
478
+ * // Store state and codeVerifier securely, then redirect user to url
479
+ * // After callback, exchange the code:
480
+ * const response = await workos.userManagement.authenticateWithCode({
481
+ * code: authorizationCode,
482
+ * codeVerifier,
483
+ * clientId: 'client_123',
484
+ * });
485
+ * ```
486
+ */
487
+ async getAuthorizationUrlWithPKCE(options) {
488
+ const { clientId, connectionId, domainHint, loginHint, organizationId, provider, providerQueryParams, providerScopes, prompt, redirectUri, screenHint } = options;
489
+ const resolvedClientId = this.resolveClientId(clientId);
490
+ if (!provider && !connectionId && !organizationId) throw new TypeError(`Incomplete arguments. Need to specify either a 'connectionId', 'organizationId', or 'provider'.`);
491
+ if (provider !== "authkit" && screenHint) throw new TypeError(`'screenHint' is only supported for 'authkit' provider`);
492
+ const pkce = await this.workos.pkce.generate();
493
+ const state = this.workos.pkce.generateCodeVerifier(43);
494
+ const query = require_common_utils_query_string.toQueryString({
495
+ connection_id: connectionId,
496
+ code_challenge: pkce.codeChallenge,
497
+ code_challenge_method: "S256",
498
+ organization_id: organizationId,
499
+ domain_hint: domainHint,
500
+ login_hint: loginHint,
501
+ provider,
502
+ provider_query_params: providerQueryParams,
503
+ provider_scopes: providerScopes,
504
+ prompt,
505
+ client_id: resolvedClientId,
506
+ redirect_uri: redirectUri,
507
+ response_type: "code",
508
+ state,
509
+ screen_hint: screenHint
369
510
  });
511
+ return {
512
+ url: `${this.workos.baseURL}/user_management/authorize?${query}`,
513
+ state,
514
+ codeVerifier: pkce.codeVerifier
515
+ };
516
+ }
517
+ getLogoutUrl(options) {
518
+ const { sessionId, returnTo } = options;
519
+ if (!sessionId) throw new TypeError(`Incomplete arguments. Need to specify 'sessionId'.`);
520
+ const url = new URL("/user_management/sessions/logout", this.workos.baseURL);
521
+ url.searchParams.set("session_id", sessionId);
522
+ if (returnTo) url.searchParams.set("return_to", returnTo);
523
+ return url.toString();
370
524
  }
371
525
  getJwksUrl(clientId) {
372
- return require_client_user_management.getJwksUrl(clientId, this.workos.baseURL);
526
+ if (!clientId) throw new TypeError("clientId must be a valid clientId");
527
+ return `${this.workos.baseURL}/sso/jwks/${clientId}`;
373
528
  }
374
529
  };
375
530