@atlasauth/backend 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/auth0-session.d.ts +23 -0
- package/dist/auth0-session.js +80 -0
- package/dist/auth0-session.js.map +1 -0
- package/dist/better-auth.d.ts +4 -8
- package/dist/better-auth.js +42 -150
- package/dist/better-auth.js.map +1 -1
- package/dist/client/abac.d.ts +132 -0
- package/dist/client/abac.js +48 -0
- package/dist/client/abac.js.map +1 -0
- package/dist/client/access-policies.d.ts +100 -0
- package/dist/client/access-policies.js +29 -0
- package/dist/client/access-policies.js.map +1 -0
- package/dist/client/action-gallery.d.ts +1 -1
- package/dist/client/action-gallery.js.map +1 -1
- package/dist/client/actions.d.ts +129 -6
- package/dist/client/actions.js +4 -0
- package/dist/client/actions.js.map +1 -1
- package/dist/client/analytics-reports.d.ts +215 -0
- package/dist/client/analytics-reports.js +56 -0
- package/dist/client/analytics-reports.js.map +1 -0
- package/dist/client/app-catalog.d.ts +74 -0
- package/dist/client/app-catalog.js +30 -0
- package/dist/client/app-catalog.js.map +1 -0
- package/dist/client/attack-protection.d.ts +10 -0
- package/dist/client/attack-protection.js +8 -0
- package/dist/client/attack-protection.js.map +1 -1
- package/dist/client/audit-events.d.ts +71 -0
- package/dist/client/audit-events.js +28 -0
- package/dist/client/audit-events.js.map +1 -1
- package/dist/client/credentials.d.ts +8 -0
- package/dist/client/credentials.js.map +1 -1
- package/dist/client/delegated-ui-proxy.d.ts +25 -0
- package/dist/client/delegated-ui-proxy.js +46 -0
- package/dist/client/delegated-ui-proxy.js.map +1 -0
- package/dist/client/devices.d.ts +44 -0
- package/dist/client/devices.js +26 -0
- package/dist/client/devices.js.map +1 -0
- package/dist/client/email-templates.d.ts +1 -1
- package/dist/client/email-templates.js.map +1 -1
- package/dist/client/flags.d.ts +101 -0
- package/dist/client/flags.js +104 -0
- package/dist/client/flags.js.map +1 -0
- package/dist/client/groups.d.ts +146 -0
- package/dist/client/groups.js +67 -0
- package/dist/client/groups.js.map +1 -0
- package/dist/client/identity-verification.d.ts +62 -0
- package/dist/client/identity-verification.js +39 -0
- package/dist/client/identity-verification.js.map +1 -0
- package/dist/client/index.d.ts +997 -2
- package/dist/client/index.js +77 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/journeys.d.ts +108 -0
- package/dist/client/journeys.js +35 -0
- package/dist/client/journeys.js.map +1 -0
- package/dist/client/log-streams.d.ts +1 -1
- package/dist/client/marketing.d.ts +67 -0
- package/dist/client/marketing.js +26 -0
- package/dist/client/marketing.js.map +1 -0
- package/dist/client/mcp-gateways.d.ts +54 -0
- package/dist/client/mcp-gateways.js +25 -0
- package/dist/client/mcp-gateways.js.map +1 -0
- package/dist/client/messaging.d.ts +14 -3
- package/dist/client/messaging.js.map +1 -1
- package/dist/client/mfa-factors.d.ts +120 -0
- package/dist/client/mfa-factors.js +73 -0
- package/dist/client/mfa-factors.js.map +1 -0
- package/dist/client/migrations.d.ts +286 -0
- package/dist/client/migrations.js +103 -0
- package/dist/client/migrations.js.map +1 -0
- package/dist/client/network-acls.d.ts +6 -1
- package/dist/client/network-acls.js.map +1 -1
- package/dist/client/network-zones.d.ts +56 -0
- package/dist/client/network-zones.js +29 -0
- package/dist/client/network-zones.js.map +1 -0
- package/dist/client/notifications.d.ts +1 -1
- package/dist/client/notifications.js.map +1 -1
- package/dist/client/oauth-clients.d.ts +183 -3
- package/dist/client/oauth-clients.js +64 -0
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/org-role-grants.d.ts +57 -0
- package/dist/client/org-role-grants.js +40 -0
- package/dist/client/org-role-grants.js.map +1 -0
- package/dist/client/organizations.d.ts +52 -0
- package/dist/client/organizations.js +44 -0
- package/dist/client/organizations.js.map +1 -1
- package/dist/client/page-templates.d.ts +78 -0
- package/dist/client/page-templates.js +31 -0
- package/dist/client/page-templates.js.map +1 -0
- package/dist/client/passkey-api.d.ts +73 -0
- package/dist/client/passkey-api.js +34 -0
- package/dist/client/passkey-api.js.map +1 -0
- package/dist/client/resources.d.ts +149 -0
- package/dist/client/resources.js +73 -0
- package/dist/client/resources.js.map +1 -0
- package/dist/client/risk-based-mfa.d.ts +147 -0
- package/dist/client/risk-based-mfa.js +30 -0
- package/dist/client/risk-based-mfa.js.map +1 -1
- package/dist/client/roles.d.ts +4 -0
- package/dist/client/roles.js.map +1 -1
- package/dist/client/service-connectors.d.ts +83 -0
- package/dist/client/service-connectors.js +33 -0
- package/dist/client/service-connectors.js.map +1 -0
- package/dist/client/ssf.d.ts +111 -0
- package/dist/client/ssf.js +49 -0
- package/dist/client/ssf.js.map +1 -0
- package/dist/client/sso-onboarding.d.ts +6 -0
- package/dist/client/sso-onboarding.js.map +1 -1
- package/dist/client/users.d.ts +302 -0
- package/dist/client/users.js +125 -0
- package/dist/client/users.js.map +1 -1
- package/dist/client/vault.d.ts +85 -0
- package/dist/client/vault.js +50 -0
- package/dist/client/vault.js.map +1 -0
- package/dist/client/vc.d.ts +128 -0
- package/dist/client/vc.js +43 -0
- package/dist/client/vc.js.map +1 -0
- package/dist/client/webhooks.d.ts +31 -2
- package/dist/client/webhooks.js.map +1 -1
- package/dist/client/workflows.d.ts +131 -0
- package/dist/client/workflows.js +36 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/framework-bridge.d.ts +98 -0
- package/dist/framework-bridge.js +264 -0
- package/dist/framework-bridge.js.map +1 -0
- package/dist/framework-sessions.d.ts +147 -0
- package/dist/framework-sessions.js +544 -0
- package/dist/framework-sessions.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy-issuer-presets.d.ts +85 -0
- package/dist/legacy-issuer-presets.js +165 -0
- package/dist/legacy-issuer-presets.js.map +1 -0
- package/dist/legacy-issuers.d.ts +16 -2
- package/dist/legacy-issuers.js +16 -1
- package/dist/legacy-issuers.js.map +1 -1
- package/dist/legacy-verify.d.ts +103 -0
- package/dist/legacy-verify.js +244 -0
- package/dist/legacy-verify.js.map +1 -0
- package/dist/magic-did.d.ts +5 -0
- package/dist/magic-did.js +49 -0
- package/dist/magic-did.js.map +1 -0
- package/dist/migration-bridge.d.ts +162 -0
- package/dist/migration-bridge.js +354 -0
- package/dist/migration-bridge.js.map +1 -0
- package/dist/migration-presets-g3.d.ts +2 -0
- package/dist/migration-presets-g3.js +254 -0
- package/dist/migration-presets-g3.js.map +1 -0
- package/dist/migration-presets-g4/authentik.d.ts +14 -0
- package/dist/migration-presets-g4/authentik.js +37 -0
- package/dist/migration-presets-g4/authentik.js.map +1 -0
- package/dist/migration-presets-g4/fusionauth.d.ts +2 -0
- package/dist/migration-presets-g4/fusionauth.js +52 -0
- package/dist/migration-presets-g4/fusionauth.js.map +1 -0
- package/dist/migration-presets-g4/hanko.d.ts +12 -0
- package/dist/migration-presets-g4/hanko.js +46 -0
- package/dist/migration-presets-g4/hanko.js.map +1 -0
- package/dist/migration-presets-g4/keycloak.d.ts +16 -0
- package/dist/migration-presets-g4/keycloak.js +37 -0
- package/dist/migration-presets-g4/keycloak.js.map +1 -0
- package/dist/migration-presets-g4/logto.d.ts +12 -0
- package/dist/migration-presets-g4/logto.js +35 -0
- package/dist/migration-presets-g4/logto.js.map +1 -0
- package/dist/migration-presets-g4/ory.d.ts +2 -0
- package/dist/migration-presets-g4/ory.js +67 -0
- package/dist/migration-presets-g4/ory.js.map +1 -0
- package/dist/migration-presets-g4/supertokens.d.ts +13 -0
- package/dist/migration-presets-g4/supertokens.js +35 -0
- package/dist/migration-presets-g4/supertokens.js.map +1 -0
- package/dist/migration-presets-g4/zitadel.d.ts +2 -0
- package/dist/migration-presets-g4/zitadel.js +36 -0
- package/dist/migration-presets-g4/zitadel.js.map +1 -0
- package/dist/migration-presets-g4.d.ts +10 -0
- package/dist/migration-presets-g4.js +30 -0
- package/dist/migration-presets-g4.js.map +1 -0
- package/dist/migration-presets.d.ts +156 -0
- package/dist/migration-presets.js +536 -0
- package/dist/migration-presets.js.map +1 -0
- package/dist/request-auth.d.ts +32 -0
- package/dist/request-auth.js +72 -0
- package/dist/request-auth.js.map +1 -0
- package/dist/verify.d.ts +2 -0
- package/dist/verify.js.map +1 -1
- package/dist/workos-session.d.ts +30 -0
- package/dist/workos-session.js +123 -0
- package/dist/workos-session.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,gDAA8B;AAC9B,mDAAiC;AACjC,8CAA4B;AAC5B,2FAA2F;AAC3F,gDAA8B;AAC9B,mDAAoE;AAA3D,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { LegacyIssuer } from './legacy-issuers';
|
|
2
|
+
/**
|
|
3
|
+
* `legacyIssuers` presets for the JWT-issuing auth vendors, so a cutover only
|
|
4
|
+
* names the old tenant and the end of the window:
|
|
5
|
+
*
|
|
6
|
+
* new AtlasBackend({
|
|
7
|
+
* ...,
|
|
8
|
+
* legacyIssuers: [
|
|
9
|
+
* ...clerkLegacyIssuer({ publishableKey: process.env.CLERK_PUBLISHABLE_KEY!, until: '2027-01-31' }),
|
|
10
|
+
* ],
|
|
11
|
+
* });
|
|
12
|
+
*
|
|
13
|
+
* Each preset returns an array (Descope tokens carry one of two `iss` shapes)
|
|
14
|
+
* of entries with the vendor's issuer, key-set URL, algorithms and subject
|
|
15
|
+
* claim filled in. The old user id maps to the Atlas user through
|
|
16
|
+
* `external_id`, which every Atlas importer sets to the vendor's user id.
|
|
17
|
+
*/
|
|
18
|
+
type Window = Pick<LegacyIssuer, 'until' | 'resolveSubject'>;
|
|
19
|
+
/** `example.com` / `https://example.com/` → `https://example.com`. */
|
|
20
|
+
export declare function httpsOrigin(domainOrUrl: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* The Frontend API host a Clerk publishable key encodes: `pk_(test|live)_` +
|
|
23
|
+
* base64(`<host>$`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function clerkFrontendApiFromPublishableKey(publishableKey: string): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Clerk session tokens (the `__session` cookie / `getToken()`): RS256, `iss` =
|
|
28
|
+
* the Frontend API origin, keys at `<iss>/.well-known/jwks.json`, `sub` = the
|
|
29
|
+
* Clerk user id (`user_…`). `authorizedParties` checks `azp` like Clerk's own
|
|
30
|
+
* `authorizedParties`; a pending session (`sts: "pending"`) is refused.
|
|
31
|
+
*/
|
|
32
|
+
export declare function clerkLegacyIssuer(opts: Window & ({
|
|
33
|
+
publishableKey: string;
|
|
34
|
+
} | {
|
|
35
|
+
frontendApi: string;
|
|
36
|
+
}) & {
|
|
37
|
+
authorizedParties?: readonly string[];
|
|
38
|
+
}): LegacyIssuer[];
|
|
39
|
+
/**
|
|
40
|
+
* Auth0 (and Okta Customer Identity Cloud) access or ID tokens: `iss` =
|
|
41
|
+
* `https://<tenant domain>/` WITH the trailing slash, keys at
|
|
42
|
+
* `/.well-known/jwks.json`, `sub` = the Auth0 user id (`auth0|…`,
|
|
43
|
+
* `google-oauth2|…`). `audience` is the API identifier (access tokens) or the
|
|
44
|
+
* client id (ID tokens) — required, since an Auth0 tenant mints tokens for many.
|
|
45
|
+
*/
|
|
46
|
+
export declare function auth0LegacyIssuer(opts: Window & {
|
|
47
|
+
domain: string;
|
|
48
|
+
audience: string | readonly string[];
|
|
49
|
+
algorithms?: readonly string[];
|
|
50
|
+
}): LegacyIssuer[];
|
|
51
|
+
/**
|
|
52
|
+
* Okta (Workforce Identity Cloud, Customer Identity Solution) tokens from a
|
|
53
|
+
* CUSTOM authorization server: `iss` = `https://<okta domain>/oauth2/<id>`
|
|
54
|
+
* (`default` unless set), keys at `<iss>/v1/keys`. Access tokens put the login
|
|
55
|
+
* in `sub` and the Okta user id in `uid`; ID tokens put the user id in `sub`.
|
|
56
|
+
* Tokens from the org authorization server (`iss` = the bare domain) are not
|
|
57
|
+
* meant for resource servers and are not accepted here.
|
|
58
|
+
*/
|
|
59
|
+
export declare function oktaLegacyIssuer(opts: Window & {
|
|
60
|
+
domain: string;
|
|
61
|
+
authorizationServerId?: string;
|
|
62
|
+
/** Access tokens: `api://default` unless the server says otherwise. ID tokens: the client id. */
|
|
63
|
+
audience?: string | readonly string[];
|
|
64
|
+
token?: 'access' | 'id';
|
|
65
|
+
}): LegacyIssuer[];
|
|
66
|
+
/**
|
|
67
|
+
* Kinde access or ID tokens: `iss` = `https://<business>.kinde.com` (or the
|
|
68
|
+
* custom domain), keys at `/.well-known/jwks`, `sub` = the Kinde user id
|
|
69
|
+
* (`kp_…`). Set `audience` when the app registered an API audience.
|
|
70
|
+
*/
|
|
71
|
+
export declare function kindeLegacyIssuer(opts: Window & {
|
|
72
|
+
issuerUrl: string;
|
|
73
|
+
audience?: string | readonly string[];
|
|
74
|
+
}): LegacyIssuer[];
|
|
75
|
+
/**
|
|
76
|
+
* Descope session tokens (the `DS` cookie / `sessionToken`): RS256, keys at
|
|
77
|
+
* `<base>/v2/keys/<project id>`, `sub` = the Descope user id. Projects issue
|
|
78
|
+
* either `https://api.descope.com/<project id>` or the bare project id as
|
|
79
|
+
* `iss`, so both are accepted. Refresh tokens (`drn: "DSR"`) are refused.
|
|
80
|
+
*/
|
|
81
|
+
export declare function descopeLegacyIssuer(opts: Window & {
|
|
82
|
+
projectId: string;
|
|
83
|
+
baseUrl?: string;
|
|
84
|
+
}): LegacyIssuer[];
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpsOrigin = httpsOrigin;
|
|
4
|
+
exports.clerkFrontendApiFromPublishableKey = clerkFrontendApiFromPublishableKey;
|
|
5
|
+
exports.clerkLegacyIssuer = clerkLegacyIssuer;
|
|
6
|
+
exports.auth0LegacyIssuer = auth0LegacyIssuer;
|
|
7
|
+
exports.oktaLegacyIssuer = oktaLegacyIssuer;
|
|
8
|
+
exports.kindeLegacyIssuer = kindeLegacyIssuer;
|
|
9
|
+
exports.descopeLegacyIssuer = descopeLegacyIssuer;
|
|
10
|
+
const RSA_ALGS = ['RS256'];
|
|
11
|
+
function stripSlash(url) {
|
|
12
|
+
return url.replace(/\/+$/, '');
|
|
13
|
+
}
|
|
14
|
+
/** `example.com` / `https://example.com/` → `https://example.com`. */
|
|
15
|
+
function httpsOrigin(domainOrUrl) {
|
|
16
|
+
const raw = domainOrUrl.trim();
|
|
17
|
+
const url = new URL(/^[a-z]+:\/\//i.test(raw) ? raw : `https://${raw}`);
|
|
18
|
+
if (url.protocol !== 'https:')
|
|
19
|
+
throw new Error(`legacyIssuers: ${domainOrUrl} must be https.`);
|
|
20
|
+
return `https://${url.host}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The Frontend API host a Clerk publishable key encodes: `pk_(test|live)_` +
|
|
24
|
+
* base64(`<host>$`).
|
|
25
|
+
*/
|
|
26
|
+
function clerkFrontendApiFromPublishableKey(publishableKey) {
|
|
27
|
+
const m = /^pk_(?:test|live)_([A-Za-z0-9+/=_-]+)$/.exec(publishableKey.trim());
|
|
28
|
+
if (!m)
|
|
29
|
+
return null;
|
|
30
|
+
let decoded;
|
|
31
|
+
try {
|
|
32
|
+
decoded = Buffer.from(m[1].replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8');
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (!decoded.endsWith('$'))
|
|
38
|
+
return null;
|
|
39
|
+
const host = decoded.slice(0, -1);
|
|
40
|
+
return /^[a-z0-9.-]+(?::\d+)?$/i.test(host) ? host : null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Clerk session tokens (the `__session` cookie / `getToken()`): RS256, `iss` =
|
|
44
|
+
* the Frontend API origin, keys at `<iss>/.well-known/jwks.json`, `sub` = the
|
|
45
|
+
* Clerk user id (`user_…`). `authorizedParties` checks `azp` like Clerk's own
|
|
46
|
+
* `authorizedParties`; a pending session (`sts: "pending"`) is refused.
|
|
47
|
+
*/
|
|
48
|
+
function clerkLegacyIssuer(opts) {
|
|
49
|
+
const host = 'publishableKey' in opts ? clerkFrontendApiFromPublishableKey(opts.publishableKey) : opts.frontendApi;
|
|
50
|
+
if (!host)
|
|
51
|
+
throw new Error('clerkLegacyIssuer: the publishable key does not encode a Frontend API host.');
|
|
52
|
+
const issuer = httpsOrigin(host);
|
|
53
|
+
const parties = opts.authorizedParties?.map((p) => stripSlash(p));
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
kind: 'clerk',
|
|
57
|
+
issuer,
|
|
58
|
+
jwksUrl: `${issuer}/.well-known/jwks.json`,
|
|
59
|
+
algorithms: RSA_ALGS,
|
|
60
|
+
until: opts.until,
|
|
61
|
+
resolveSubject: opts.resolveSubject,
|
|
62
|
+
checkClaims: (claims) => {
|
|
63
|
+
if (claims.sts === 'pending')
|
|
64
|
+
return false;
|
|
65
|
+
if (parties && parties.length > 0 && typeof claims.azp === 'string' && !parties.includes(stripSlash(claims.azp))) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Auth0 (and Okta Customer Identity Cloud) access or ID tokens: `iss` =
|
|
75
|
+
* `https://<tenant domain>/` WITH the trailing slash, keys at
|
|
76
|
+
* `/.well-known/jwks.json`, `sub` = the Auth0 user id (`auth0|…`,
|
|
77
|
+
* `google-oauth2|…`). `audience` is the API identifier (access tokens) or the
|
|
78
|
+
* client id (ID tokens) — required, since an Auth0 tenant mints tokens for many.
|
|
79
|
+
*/
|
|
80
|
+
function auth0LegacyIssuer(opts) {
|
|
81
|
+
const origin = httpsOrigin(opts.domain);
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
kind: 'auth0',
|
|
85
|
+
issuer: `${origin}/`,
|
|
86
|
+
jwksUrl: `${origin}/.well-known/jwks.json`,
|
|
87
|
+
audience: opts.audience,
|
|
88
|
+
algorithms: opts.algorithms ?? ['RS256', 'PS256'],
|
|
89
|
+
until: opts.until,
|
|
90
|
+
resolveSubject: opts.resolveSubject,
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Okta (Workforce Identity Cloud, Customer Identity Solution) tokens from a
|
|
96
|
+
* CUSTOM authorization server: `iss` = `https://<okta domain>/oauth2/<id>`
|
|
97
|
+
* (`default` unless set), keys at `<iss>/v1/keys`. Access tokens put the login
|
|
98
|
+
* in `sub` and the Okta user id in `uid`; ID tokens put the user id in `sub`.
|
|
99
|
+
* Tokens from the org authorization server (`iss` = the bare domain) are not
|
|
100
|
+
* meant for resource servers and are not accepted here.
|
|
101
|
+
*/
|
|
102
|
+
function oktaLegacyIssuer(opts) {
|
|
103
|
+
const server = opts.authorizationServerId ?? 'default';
|
|
104
|
+
if (!/^[A-Za-z0-9_-]+$/.test(server))
|
|
105
|
+
throw new Error('oktaLegacyIssuer: authorizationServerId is not an Okta id.');
|
|
106
|
+
const issuer = `${httpsOrigin(opts.domain)}/oauth2/${server}`;
|
|
107
|
+
const token = opts.token ?? 'access';
|
|
108
|
+
if (token === 'id' && !opts.audience)
|
|
109
|
+
throw new Error('oktaLegacyIssuer: ID tokens need audience (the client id).');
|
|
110
|
+
return [
|
|
111
|
+
{
|
|
112
|
+
kind: 'okta',
|
|
113
|
+
issuer,
|
|
114
|
+
jwksUrl: `${issuer}/v1/keys`,
|
|
115
|
+
audience: opts.audience ?? (server === 'default' ? 'api://default' : undefined),
|
|
116
|
+
algorithms: RSA_ALGS,
|
|
117
|
+
subjectClaim: token === 'access' ? 'uid' : 'sub',
|
|
118
|
+
until: opts.until,
|
|
119
|
+
resolveSubject: opts.resolveSubject,
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Kinde access or ID tokens: `iss` = `https://<business>.kinde.com` (or the
|
|
125
|
+
* custom domain), keys at `/.well-known/jwks`, `sub` = the Kinde user id
|
|
126
|
+
* (`kp_…`). Set `audience` when the app registered an API audience.
|
|
127
|
+
*/
|
|
128
|
+
function kindeLegacyIssuer(opts) {
|
|
129
|
+
const issuer = httpsOrigin(opts.issuerUrl);
|
|
130
|
+
return [
|
|
131
|
+
{
|
|
132
|
+
kind: 'kinde',
|
|
133
|
+
issuer,
|
|
134
|
+
jwksUrl: `${issuer}/.well-known/jwks`,
|
|
135
|
+
audience: opts.audience,
|
|
136
|
+
algorithms: RSA_ALGS,
|
|
137
|
+
until: opts.until,
|
|
138
|
+
resolveSubject: opts.resolveSubject,
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Descope session tokens (the `DS` cookie / `sessionToken`): RS256, keys at
|
|
144
|
+
* `<base>/v2/keys/<project id>`, `sub` = the Descope user id. Projects issue
|
|
145
|
+
* either `https://api.descope.com/<project id>` or the bare project id as
|
|
146
|
+
* `iss`, so both are accepted. Refresh tokens (`drn: "DSR"`) are refused.
|
|
147
|
+
*/
|
|
148
|
+
function descopeLegacyIssuer(opts) {
|
|
149
|
+
if (!/^P[A-Za-z0-9]{20,40}$/.test(opts.projectId))
|
|
150
|
+
throw new Error('descopeLegacyIssuer: projectId is not a Descope project id.');
|
|
151
|
+
const base = httpsOrigin(opts.baseUrl ?? 'https://api.descope.com');
|
|
152
|
+
const shared = {
|
|
153
|
+
kind: 'descope',
|
|
154
|
+
jwksUrl: `${base}/v2/keys/${opts.projectId}`,
|
|
155
|
+
algorithms: RSA_ALGS,
|
|
156
|
+
until: opts.until,
|
|
157
|
+
resolveSubject: opts.resolveSubject,
|
|
158
|
+
checkClaims: (claims) => claims.drn === undefined || claims.drn === 'DS',
|
|
159
|
+
};
|
|
160
|
+
return [
|
|
161
|
+
{ ...shared, issuer: `${base}/${opts.projectId}` },
|
|
162
|
+
{ ...shared, issuer: opts.projectId },
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=legacy-issuer-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-issuer-presets.js","sourceRoot":"","sources":["../src/legacy-issuer-presets.ts"],"names":[],"mappings":"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"}
|
package/dist/legacy-issuers.d.ts
CHANGED
|
@@ -12,8 +12,11 @@ import { type Jwks } from './jwks-cache';
|
|
|
12
12
|
* After `until`, those tokens are refused like any other foreign token.
|
|
13
13
|
*/
|
|
14
14
|
export interface LegacyIssuer {
|
|
15
|
-
/**
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* The old provider: `better_auth`, or one of the JWT vendors with a preset
|
|
17
|
+
* in legacy-issuer-presets.ts (`clerk`, `auth0`, `okta`, `kinde`, `descope`).
|
|
18
|
+
*/
|
|
19
|
+
kind?: LegacyIssuerKind;
|
|
17
20
|
/** The `iss` the old tokens carry (Better Auth: its `baseURL`, unless `jwt.issuer` was set). */
|
|
18
21
|
issuer: string;
|
|
19
22
|
/** The imported key set. Exactly one of `jwks` / `jwksUrl`. */
|
|
@@ -32,7 +35,18 @@ export interface LegacyIssuer {
|
|
|
32
35
|
* on the backend), cached in memory. Return null to refuse the token.
|
|
33
36
|
*/
|
|
34
37
|
resolveSubject?: (legacySub: string, claims: Record<string, unknown>) => Promise<string | null> | string | null;
|
|
38
|
+
/**
|
|
39
|
+
* The claim that carries the old provider's user id. Default `sub`. Okta
|
|
40
|
+
* access tokens put the login in `sub` and the user id in `uid`.
|
|
41
|
+
*/
|
|
42
|
+
subjectClaim?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Extra vendor checks on the verified claims (Clerk's `azp` against the
|
|
45
|
+
* authorized parties, say). Return false to refuse the token.
|
|
46
|
+
*/
|
|
47
|
+
checkClaims?: (claims: Record<string, unknown>) => boolean;
|
|
35
48
|
}
|
|
49
|
+
export type LegacyIssuerKind = 'better_auth' | 'clerk' | 'auth0' | 'okta' | 'kinde' | 'descope';
|
|
36
50
|
/** Better Auth's `jwt` plugin key algorithms. */
|
|
37
51
|
export declare const BETTER_AUTH_JWT_ALGS: string[];
|
|
38
52
|
export interface LegacyVerifierDeps {
|
package/dist/legacy-issuers.js
CHANGED
|
@@ -20,6 +20,14 @@ function peekIssuer(token) {
|
|
|
20
20
|
return undefined;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
function safeCheck(check, claims) {
|
|
24
|
+
try {
|
|
25
|
+
return check(claims) === true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
23
31
|
function untilMs(until) {
|
|
24
32
|
const t = until instanceof Date ? until.getTime() : typeof until === 'number' ? until : Date.parse(until);
|
|
25
33
|
return Number.isFinite(t) ? t : 0;
|
|
@@ -84,7 +92,14 @@ class LegacyIssuerVerifier {
|
|
|
84
92
|
// A legacy token without an expiry would outlive the window it is accepted in.
|
|
85
93
|
if (typeof payload.exp !== 'number')
|
|
86
94
|
return { ok: false, reason: 'invalid' };
|
|
87
|
-
|
|
95
|
+
if (entry.checkClaims && !safeCheck(entry.checkClaims, payload))
|
|
96
|
+
return { ok: false, reason: 'invalid' };
|
|
97
|
+
const subject = payload[entry.subjectClaim ?? 'sub'];
|
|
98
|
+
const legacySub = typeof subject === 'string' && subject
|
|
99
|
+
? subject
|
|
100
|
+
: !entry.subjectClaim && typeof payload.id === 'string'
|
|
101
|
+
? payload.id
|
|
102
|
+
: '';
|
|
88
103
|
if (!legacySub)
|
|
89
104
|
return { ok: false, reason: 'invalid' };
|
|
90
105
|
const atlasId = await this.resolve(legacySub, payload, entry);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-issuers.js","sourceRoot":"","sources":["../src/legacy-issuers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"legacy-issuers.js","sourceRoot":"","sources":["../src/legacy-issuers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LAZY MIGRATION, the half that runs on YOUR server.
|
|
3
|
+
*
|
|
4
|
+
* With a legacy-auth connection enabled, Atlas asks your `verify_url` whether
|
|
5
|
+
* an unknown identifier + password is valid in the old system, then creates
|
|
6
|
+
* the user with that password on success. This module is that endpoint for
|
|
7
|
+
* the vendors that will not export password hashes (or whose hashes you chose
|
|
8
|
+
* not to move): it checks Atlas's signature, asks the OLD vendor with YOUR
|
|
9
|
+
* vendor credentials and answers with the profile. Vendor credentials stay on
|
|
10
|
+
* your server; Atlas never sees them.
|
|
11
|
+
*
|
|
12
|
+
* const verify = oktaPasswordVerifier({ domain: 'acme.okta.com' });
|
|
13
|
+
* app.post('/atlas/legacy-verify', express.text({ type: '*\/*' }), async (req, res) => {
|
|
14
|
+
* const out = await handleLegacyVerify({ body: req.body, headers: req.headers, secret, verify });
|
|
15
|
+
* res.status(out.status).json(out.body);
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* Every verifier FAILS CLOSED: a transport error, a timeout or an answer it
|
|
19
|
+
* does not recognise is "not verified", never "verified".
|
|
20
|
+
*/
|
|
21
|
+
/** What Atlas needs to create the user. `external_id` keeps the old id for token bridges. */
|
|
22
|
+
export interface LegacyVerifiedProfile {
|
|
23
|
+
email: string;
|
|
24
|
+
email_verified?: boolean;
|
|
25
|
+
name?: string;
|
|
26
|
+
external_id?: string;
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export type LegacyPasswordVerifier = (input: {
|
|
30
|
+
identifier: string;
|
|
31
|
+
password: string;
|
|
32
|
+
}) => Promise<LegacyVerifiedProfile | null>;
|
|
33
|
+
interface VerifierTransport {
|
|
34
|
+
fetchImpl?: typeof fetch;
|
|
35
|
+
/** Per-call budget; Atlas's own call times out at the connection's `timeout_ms`. */
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check Atlas's signature on the request and run `verify`. Returns the status
|
|
40
|
+
* and JSON body to send: 200 `{ user }` on a valid credential, 401 when the
|
|
41
|
+
* old system rejected it, 400 on a bad signature or body.
|
|
42
|
+
*/
|
|
43
|
+
export declare function handleLegacyVerify(input: {
|
|
44
|
+
body: string | Buffer;
|
|
45
|
+
headers: Headers | Record<string, string | string[] | undefined>;
|
|
46
|
+
secret: string;
|
|
47
|
+
verify: LegacyPasswordVerifier;
|
|
48
|
+
now?: Date;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
status: number;
|
|
51
|
+
body: Record<string, unknown>;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Okta (Workforce Identity Cloud / Customer Identity Solution): the Authn API,
|
|
55
|
+
* `POST /api/v1/authn`, needs no API token. A primary-authentication result of
|
|
56
|
+
* SUCCESS, or any state that is only reached after a correct password
|
|
57
|
+
* (MFA_REQUIRED, MFA_ENROLL, PASSWORD_WARN, PASSWORD_EXPIRED), counts as
|
|
58
|
+
* verified; 401 (E0000004) and LOCKED_OUT do not.
|
|
59
|
+
*
|
|
60
|
+
* Orgs where the Authn API is turned off can verify with the resource-owner
|
|
61
|
+
* password grant of an app that allows it: pass `passwordGrant`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function oktaPasswordVerifier(opts: VerifierTransport & {
|
|
64
|
+
domain: string;
|
|
65
|
+
passwordGrant?: {
|
|
66
|
+
authorizationServerId?: string;
|
|
67
|
+
clientId: string;
|
|
68
|
+
clientSecret?: string;
|
|
69
|
+
};
|
|
70
|
+
}): LegacyPasswordVerifier;
|
|
71
|
+
/**
|
|
72
|
+
* Auth0 (and Okta Customer Identity Cloud): the resource-owner password grant
|
|
73
|
+
* against ONE database connection (`realm`), from an application with the
|
|
74
|
+
* Password grant enabled. `mfa_required` means the password was right (Auth0
|
|
75
|
+
* only asks for the second factor after it). Use a dedicated application for
|
|
76
|
+
* this and keep its secret on your server.
|
|
77
|
+
*/
|
|
78
|
+
export declare function auth0PasswordVerifier(opts: VerifierTransport & {
|
|
79
|
+
domain: string;
|
|
80
|
+
clientId: string;
|
|
81
|
+
clientSecret?: string;
|
|
82
|
+
realm: string;
|
|
83
|
+
audience?: string;
|
|
84
|
+
}): LegacyPasswordVerifier;
|
|
85
|
+
/**
|
|
86
|
+
* Descope: `POST /v1/auth/password/signin` with the project id (public — no
|
|
87
|
+
* management key). A 200 with a `user` means the password is right.
|
|
88
|
+
*/
|
|
89
|
+
export declare function descopePasswordVerifier(opts: VerifierTransport & {
|
|
90
|
+
projectId: string;
|
|
91
|
+
baseUrl?: string;
|
|
92
|
+
}): LegacyPasswordVerifier;
|
|
93
|
+
/**
|
|
94
|
+
* Clerk exports bcrypt digests, so most moves need no lazy step. For users
|
|
95
|
+
* whose digest could not move (a peppered or Cognito-backed hasher), look the
|
|
96
|
+
* user up by email and call `POST /v1/users/{id}/verify_password` with your
|
|
97
|
+
* Clerk secret key.
|
|
98
|
+
*/
|
|
99
|
+
export declare function clerkPasswordVerifier(opts: VerifierTransport & {
|
|
100
|
+
secretKey: string;
|
|
101
|
+
apiUrl?: string;
|
|
102
|
+
}): LegacyPasswordVerifier;
|
|
103
|
+
export {};
|