@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.
- package/README.md +54 -0
- package/lib/api-keys/api-keys.cjs +3 -0
- package/lib/api-keys/api-keys.cjs.map +1 -1
- package/lib/api-keys/api-keys.d.cts +2 -1
- package/lib/api-keys/api-keys.d.ts +2 -1
- package/lib/api-keys/api-keys.js +3 -0
- package/lib/api-keys/api-keys.js.map +1 -1
- package/lib/api-keys/interfaces/create-organization-api-key-options.interface.cjs +0 -0
- package/lib/api-keys/interfaces/create-organization-api-key-options.interface.d.cts +16 -0
- package/lib/api-keys/interfaces/create-organization-api-key-options.interface.d.ts +16 -0
- package/lib/api-keys/interfaces/create-organization-api-key-options.interface.js +1 -0
- package/lib/api-keys/interfaces/created-api-key.interface.cjs +0 -0
- package/lib/api-keys/interfaces/created-api-key.interface.d.cts +34 -0
- package/lib/api-keys/interfaces/created-api-key.interface.d.ts +34 -0
- package/lib/api-keys/interfaces/created-api-key.interface.js +1 -0
- package/lib/api-keys/interfaces/index.cjs +0 -0
- package/lib/api-keys/interfaces/index.d.cts +6 -0
- package/lib/api-keys/interfaces/index.d.ts +6 -0
- package/lib/api-keys/interfaces/index.js +1 -0
- package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.cjs +0 -0
- package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.d.cts +9 -0
- package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.d.ts +9 -0
- package/lib/api-keys/interfaces/list-organization-api-keys-options.interface.js +1 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.cjs +12 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.cjs.map +1 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.d.cts +7 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.d.ts +7 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.js +11 -0
- package/lib/api-keys/serializers/create-organization-api-key-options.serializer.js.map +1 -0
- package/lib/api-keys/serializers/created-api-key.serializer.cjs +20 -0
- package/lib/api-keys/serializers/created-api-key.serializer.cjs.map +1 -0
- package/lib/api-keys/serializers/created-api-key.serializer.d.cts +7 -0
- package/lib/api-keys/serializers/created-api-key.serializer.d.ts +7 -0
- package/lib/api-keys/serializers/created-api-key.serializer.js +19 -0
- package/lib/api-keys/serializers/created-api-key.serializer.js.map +1 -0
- package/lib/api-keys/serializers/index.cjs +9 -0
- package/lib/api-keys/serializers/index.d.cts +5 -0
- package/lib/api-keys/serializers/index.d.ts +5 -0
- package/lib/api-keys/serializers/index.js +6 -0
- package/lib/common/crypto/seal.cjs +7 -7
- package/lib/common/crypto/seal.cjs.map +1 -1
- package/lib/common/crypto/seal.js +1 -1
- package/lib/common/exceptions/api-key-required.exception.cjs +15 -0
- package/lib/common/exceptions/api-key-required.exception.cjs.map +1 -0
- package/lib/common/exceptions/api-key-required.exception.d.cts +10 -0
- package/lib/common/exceptions/api-key-required.exception.d.ts +10 -0
- package/lib/common/exceptions/api-key-required.exception.js +14 -0
- package/lib/common/exceptions/api-key-required.exception.js.map +1 -0
- package/lib/common/exceptions/index.cjs +2 -0
- package/lib/common/exceptions/index.d.cts +2 -1
- package/lib/common/exceptions/index.d.ts +2 -1
- package/lib/common/exceptions/index.js +2 -1
- package/lib/common/interfaces/event.interface.d.cts +28 -3
- package/lib/common/interfaces/event.interface.d.ts +28 -3
- package/lib/common/interfaces/get-options.interface.d.cts +2 -0
- package/lib/common/interfaces/get-options.interface.d.ts +2 -0
- package/lib/common/interfaces/index.d.cts +2 -2
- package/lib/common/interfaces/index.d.ts +2 -2
- package/lib/common/interfaces/post-options.interface.d.cts +2 -0
- package/lib/common/interfaces/post-options.interface.d.ts +2 -0
- package/lib/common/interfaces/put-options.interface.d.cts +2 -0
- package/lib/common/interfaces/put-options.interface.d.ts +2 -0
- package/lib/common/interfaces/workos-options.interface.d.cts +1 -0
- package/lib/common/interfaces/workos-options.interface.d.ts +1 -0
- package/lib/common/net/http-client.cjs.map +1 -1
- package/lib/common/net/http-client.js.map +1 -1
- package/lib/common/serializers/event.serializer.cjs +13 -5
- package/lib/common/serializers/event.serializer.cjs.map +1 -1
- package/lib/common/serializers/event.serializer.js +13 -5
- package/lib/common/serializers/event.serializer.js.map +1 -1
- package/lib/directory-sync/directory-sync.cjs +1 -1
- package/lib/directory-sync/directory-sync.js +1 -1
- package/lib/factory.cjs +10 -0
- package/lib/factory.cjs.map +1 -0
- package/lib/factory.d.cts +83 -0
- package/lib/factory.d.ts +83 -0
- package/lib/factory.js +10 -0
- package/lib/factory.js.map +1 -0
- package/lib/feature-flags/feature-flags.cjs +37 -0
- package/lib/feature-flags/feature-flags.cjs.map +1 -0
- package/lib/feature-flags/feature-flags.d.cts +21 -0
- package/lib/feature-flags/feature-flags.d.ts +21 -0
- package/lib/feature-flags/feature-flags.js +37 -0
- package/lib/feature-flags/feature-flags.js.map +1 -0
- package/lib/feature-flags/interfaces/add-flag-target-options.interface.cjs +0 -0
- package/lib/feature-flags/interfaces/add-flag-target-options.interface.d.cts +8 -0
- package/lib/feature-flags/interfaces/add-flag-target-options.interface.d.ts +8 -0
- package/lib/feature-flags/interfaces/add-flag-target-options.interface.js +1 -0
- package/lib/feature-flags/interfaces/feature-flag.interface.d.cts +8 -2
- package/lib/feature-flags/interfaces/feature-flag.interface.d.ts +8 -2
- package/lib/feature-flags/interfaces/index.d.cts +4 -1
- package/lib/feature-flags/interfaces/index.d.ts +4 -1
- package/lib/feature-flags/interfaces/list-feature-flags-options.interface.cjs +0 -0
- package/lib/feature-flags/interfaces/list-feature-flags-options.interface.d.cts +7 -0
- package/lib/feature-flags/interfaces/list-feature-flags-options.interface.d.ts +7 -0
- package/lib/feature-flags/interfaces/list-feature-flags-options.interface.js +1 -0
- package/lib/feature-flags/interfaces/remove-flag-target-options.interface.cjs +0 -0
- package/lib/feature-flags/interfaces/remove-flag-target-options.interface.d.cts +8 -0
- package/lib/feature-flags/interfaces/remove-flag-target-options.interface.d.ts +8 -0
- package/lib/feature-flags/interfaces/remove-flag-target-options.interface.js +1 -0
- package/lib/feature-flags/serializers/feature-flag.serializer.cjs +3 -0
- package/lib/feature-flags/serializers/feature-flag.serializer.cjs.map +1 -1
- package/lib/feature-flags/serializers/feature-flag.serializer.js +3 -0
- package/lib/feature-flags/serializers/feature-flag.serializer.js.map +1 -1
- package/lib/feature-flags/serializers/index.cjs +3 -0
- package/lib/feature-flags/serializers/index.d.cts +2 -0
- package/lib/feature-flags/serializers/index.d.ts +2 -0
- package/lib/feature-flags/serializers/index.js +3 -0
- package/lib/fga/serializers/query-result.serializer.cjs.map +1 -1
- package/lib/fga/serializers/query-result.serializer.js.map +1 -1
- package/lib/index.cjs +18 -9
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -5
- package/lib/index.d.ts +18 -5
- package/lib/index.js +16 -10
- package/lib/index.js.map +1 -1
- package/lib/index.worker.cjs +15 -9
- package/lib/index.worker.cjs.map +1 -1
- package/lib/index.worker.d.cts +10 -5
- package/lib/index.worker.d.ts +10 -5
- package/lib/index.worker.js +13 -10
- package/lib/index.worker.js.map +1 -1
- package/lib/node_modules/iron-webcrypto/index.cjs +218 -0
- package/lib/node_modules/iron-webcrypto/index.cjs.map +1 -0
- package/lib/node_modules/iron-webcrypto/index.js +216 -0
- package/lib/node_modules/iron-webcrypto/index.js.map +1 -0
- package/lib/node_modules/uint8array-extras/index.cjs +55 -0
- package/lib/node_modules/uint8array-extras/index.cjs.map +1 -0
- package/lib/node_modules/uint8array-extras/index.js +52 -0
- package/lib/node_modules/uint8array-extras/index.js.map +1 -0
- package/lib/organizations/organizations.cjs +14 -2
- package/lib/organizations/organizations.cjs.map +1 -1
- package/lib/organizations/organizations.d.cts +6 -0
- package/lib/organizations/organizations.d.ts +6 -0
- package/lib/organizations/organizations.js +14 -2
- package/lib/organizations/organizations.js.map +1 -1
- package/lib/organizations/serializers/index.cjs +1 -1
- package/lib/organizations/serializers/index.js +1 -1
- package/lib/pkce/pkce.cjs +54 -0
- package/lib/pkce/pkce.cjs.map +1 -0
- package/lib/pkce/pkce.d.cts +38 -0
- package/lib/pkce/pkce.d.ts +38 -0
- package/lib/pkce/pkce.js +53 -0
- package/lib/pkce/pkce.js.map +1 -0
- package/lib/sso/interfaces/authorization-url-options.interface.d.cts +34 -8
- package/lib/sso/interfaces/authorization-url-options.interface.d.ts +34 -8
- package/lib/sso/interfaces/get-profile-and-token-options.interface.d.cts +6 -0
- package/lib/sso/interfaces/get-profile-and-token-options.interface.d.ts +6 -0
- package/lib/sso/interfaces/index.d.cts +2 -2
- package/lib/sso/interfaces/index.d.ts +2 -2
- package/lib/sso/sso.cjs +90 -8
- package/lib/sso/sso.cjs.map +1 -1
- package/lib/sso/sso.d.cts +41 -2
- package/lib/sso/sso.d.ts +41 -2
- package/lib/sso/sso.js +90 -8
- package/lib/sso/sso.js.map +1 -1
- package/lib/user-management/interfaces/authenticate-with-code-and-verifier-options.interface.d.cts +2 -2
- package/lib/user-management/interfaces/authenticate-with-code-and-verifier-options.interface.d.ts +2 -2
- package/lib/user-management/interfaces/authenticate-with-options-base.interface.d.cts +19 -3
- package/lib/user-management/interfaces/authenticate-with-options-base.interface.d.ts +19 -3
- package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.cjs +0 -0
- package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.d.cts +16 -0
- package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.d.ts +16 -0
- package/lib/user-management/interfaces/authenticate-with-refresh-token-public-client-options.interface.js +1 -0
- package/lib/user-management/interfaces/authorization-url-options.interface.d.cts +30 -5
- package/lib/user-management/interfaces/authorization-url-options.interface.d.ts +30 -5
- package/lib/user-management/interfaces/index.d.cts +5 -3
- package/lib/user-management/interfaces/index.d.ts +5 -3
- package/lib/user-management/interfaces/logout-url-options.interface.cjs +0 -0
- package/lib/user-management/interfaces/logout-url-options.interface.d.cts +8 -0
- package/lib/user-management/interfaces/logout-url-options.interface.d.ts +8 -0
- package/lib/user-management/interfaces/logout-url-options.interface.js +1 -0
- package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-code-and-verifier-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-code-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-code-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-code-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-code-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-email-verification.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-email-verification.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-email-verification.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-email-verification.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-magic-auth-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-organization-selection-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-password-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-password-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-password-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-password-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.cjs +14 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.cjs.map +1 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.d.cts +8 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.d.ts +8 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.js +13 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token-public-client-options.serializer.js.map +1 -0
- package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-refresh-token.options.serializer.js.map +1 -1
- package/lib/user-management/serializers/authenticate-with-totp-options.serializer.cjs.map +1 -1
- package/lib/user-management/serializers/authenticate-with-totp-options.serializer.d.cts +2 -1
- package/lib/user-management/serializers/authenticate-with-totp-options.serializer.d.ts +2 -1
- package/lib/user-management/serializers/authenticate-with-totp-options.serializer.js.map +1 -1
- package/lib/user-management/serializers/index.cjs +2 -0
- package/lib/user-management/serializers/index.d.cts +2 -1
- package/lib/user-management/serializers/index.d.ts +2 -1
- package/lib/user-management/serializers/index.js +2 -1
- package/lib/user-management/session.cjs +3 -10
- package/lib/user-management/session.cjs.map +1 -1
- package/lib/user-management/session.js +3 -10
- package/lib/user-management/session.js.map +1 -1
- package/lib/user-management/user-management.cjs +186 -31
- package/lib/user-management/user-management.cjs.map +1 -1
- package/lib/user-management/user-management.d.cts +71 -2
- package/lib/user-management/user-management.d.ts +71 -2
- package/lib/user-management/user-management.js +186 -31
- package/lib/user-management/user-management.js.map +1 -1
- package/lib/vault/vault.cjs +4 -0
- package/lib/vault/vault.cjs.map +1 -1
- package/lib/vault/vault.d.cts +1 -0
- package/lib/vault/vault.d.ts +1 -0
- package/lib/vault/vault.js +4 -0
- package/lib/vault/vault.js.map +1 -1
- package/lib/webhooks/webhooks.cjs +1 -1
- package/lib/webhooks/webhooks.js +1 -1
- package/lib/workos.cjs +68 -26
- package/lib/workos.cjs.map +1 -1
- package/lib/workos.d.cts +37 -8
- package/lib/workos.d.ts +37 -8
- package/lib/workos.js +68 -26
- package/lib/workos.js.map +1 -1
- package/package.json +4 -21
- package/lib/_virtual/rolldown_runtime.cjs +0 -19
- package/lib/_virtual/rolldown_runtime.js +0 -18
- package/lib/client/index.cjs +0 -15
- package/lib/client/index.d.cts +0 -3
- package/lib/client/index.d.ts +0 -3
- package/lib/client/index.js +0 -4
- package/lib/client/sso.cjs +0 -40
- package/lib/client/sso.cjs.map +0 -1
- package/lib/client/sso.d.cts +0 -21
- package/lib/client/sso.d.ts +0 -21
- package/lib/client/sso.js +0 -34
- package/lib/client/sso.js.map +0 -1
- package/lib/client/user-management.cjs +0 -80
- package/lib/client/user-management.cjs.map +0 -1
- package/lib/client/user-management.d.cts +0 -58
- package/lib/client/user-management.d.ts +0 -58
- package/lib/client/user-management.js +0 -72
- package/lib/client/user-management.js.map +0 -1
- package/lib/index.client.cjs +0 -15
- package/lib/index.client.d.cts +0 -3
- package/lib/index.client.d.ts +0 -3
- 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
|
|
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
|
-
|
|
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","
|
|
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
|
-
|
|
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":[
|
|
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":";;;;;;;AAoBA,IAAa,gBAAb,MAA2B;CACzB,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,gBACA,aACA,gBACA;AACA,MAAI,CAAC,eACH,OAAM,IAAI,MAAM,6BAA6B;AAG/C,OAAK,iBAAiB;AACtB,OAAK,iBAAiB;AACtB,OAAK,cAAc;;;;;;;CAQrB,MAAM,eAGJ;AACA,MAAI,CAAC,KAAK,YACR,QAAO;GACL,eAAe;GACf,QACE,2CAA2C;GAC9C;EAKH,MAAM,UAAU,MAAM,WAA8B,KAAK,aAAa,EACpE,UAAU,KAAK,gBAChB,CAAC;AAEF,MAAI,CAAC,QAAQ,YACX,QAAO;GACL,eAAe;GACf,QACE,2CAA2C;GAC9C;AAGH,MAAI,CAAE,MAAM,KAAK,WAAW,QAAQ,YAAY,CAC9C,QAAO;GACL,eAAe;GACf,QAAQ,2CAA2C;GACpD;EAGH,MAAM,EAAE,cAAc,MAAM,SAAS;EAErC,MAAM,EACJ,KAAK,WACL,QAAQ,gBACR,MACA,OACA,aACA,cACA,eAAe,iBACb,UAAuB,QAAQ,YAAY;AAE/C,SAAO;GACL,eAAe;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM,QAAQ;GACd,sBAAsB,QAAQ;GAC9B,cAAc,QAAQ;GACtB,aAAa,QAAQ;GACtB;;;;;;;;;;CAWH,MAAM,QAAQ,UAA0B,EAAE,EAAmC;EAC3E,MAAM,EAAE,cAAc,MAAM,SAAS;EACrC,MAAM,UAAU,MAAM,WAA8B,KAAK,aAAa,EACpE,UAAU,KAAK,gBAChB,CAAC;AAEF,MAAI,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,KACpC,QAAO;GACL,eAAe;GACf,QAAQ,4BAA4B;GACrC;EAGH,MAAM,EAAE,QAAQ,kCAAkC,UAChD,QAAQ,YACT;AAED,MAAI;GACF,MAAM,iBAAiB,QAAQ,kBAAkB,KAAK;GAEtD,MAAM,yBACJ,MAAM,KAAK,eAAe,6BAA6B;IACrD,UAAU,KAAK,eAAe;IAC9B,cAAc,QAAQ;IACtB,gBACE,QAAQ,kBAAkB;IAC5B,SAAS;KAEP,aAAa;KACb;KACD;IACF,CAAC;AAGJ,OAAI,QAAQ,eACV,MAAK,iBAAiB,QAAQ;AAGhC,QAAK,cAAc,uBAAuB;GAE1C,MAAM,EACJ,KAAK,WACL,QAAQ,gBACR,MACA,OACA,aACA,cACA,eAAe,iBACb,UAAuB,uBAAuB,YAAY;AAI9D,UAAO;IACL,eAAe;IACf,eAAe,uBAAuB;IACtC,SAAS;IACT,sBAAsB,uBAAuB;IAC7C;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAM,QAAQ;IACd,cAAc,QAAQ;IACvB;WACM,OAAO;AACd,OACE,iBAAiB,mBAEhB,MAAM,UAAU,4BAA4B,iBAC3C,MAAM,UAAU,4BAA4B,kBAC5C,MAAM,UAAU,4BAA4B,cAE9C,QAAO;IACL,eAAe;IACf,QAAQ,MAAM;IACf;AAGH,SAAM;;;;;;;;CASV,MAAM,aAAa,EACjB,aACyB,EAAE,EAAmB;EAC9C,MAAM,yBAAyB,MAAM,KAAK,cAAc;AAExD,MAAI,CAAC,uBAAuB,eAAe;GACzC,MAAM,EAAE,WAAW;AACnB,SAAM,IAAI,MAAM,gDAAgD,SAAS;;AAG3E,SAAO,KAAK,eAAe,aAAa;GACtC,WAAW,uBAAuB;GAClC;GACD,CAAC;;CAGJ,MAAc,WAAW,aAAuC;EAC9D,MAAM,EAAE,cAAc,MAAM,SAAS;EACrC,MAAM,OAAO,MAAM,KAAK,eAAe,SAAS;AAChD,MAAI,CAAC,KACH,OAAM,IAAI,MACR,kEACD;AAGH,MAAI;AACF,SAAM,UAAU,aAAa,KAAK;AAClC,UAAO;WACA,GAAG;AAGV,OACE,aAAa,SACb,UAAU,KACV,OAAO,EAAE,SAAS,aACjB,EAAE,KAAK,WAAW,WAAW,IAAI,EAAE,KAAK,WAAW,WAAW,EAE/D,QAAO;AAET,SAAM"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
|
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)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
authenticationResponse,
|
|
218
|
-
|
|
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
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
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
|
|