@atlasauth/js 0.23.1 → 0.24.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 +4 -0
- package/dist/app-launcher.d.ts +11 -0
- package/dist/app-launcher.js +12 -0
- package/dist/app-launcher.js.map +1 -0
- package/dist/attempt.d.ts +52 -1
- package/dist/attempt.js +2 -0
- package/dist/attempt.js.map +1 -1
- package/dist/attestation.d.ts +52 -0
- package/dist/attestation.js +48 -0
- package/dist/attestation.js.map +1 -0
- package/dist/compat.d.ts +1 -0
- package/dist/compat.js +5 -1
- package/dist/compat.js.map +1 -1
- package/dist/connect.d.ts +6 -0
- package/dist/connect.js +22 -0
- package/dist/connect.js.map +1 -1
- package/dist/connections.d.ts +43 -0
- package/dist/connections.js +53 -0
- package/dist/connections.js.map +1 -0
- package/dist/credentials.d.ts +47 -0
- package/dist/credentials.js +95 -0
- package/dist/credentials.js.map +1 -0
- package/dist/custom-challenge.d.ts +13 -0
- package/dist/custom-challenge.js +27 -0
- package/dist/custom-challenge.js.map +1 -0
- package/dist/delegated-ui.d.ts +93 -0
- package/dist/delegated-ui.js +62 -0
- package/dist/delegated-ui.js.map +1 -0
- package/dist/dev-browser.d.ts +9 -0
- package/dist/dev-browser.js +21 -1
- package/dist/dev-browser.js.map +1 -1
- package/dist/device-key.d.ts +65 -0
- package/dist/device-key.js +64 -0
- package/dist/device-key.js.map +1 -0
- package/dist/email-addresses.d.ts +24 -0
- package/dist/email-addresses.js +36 -0
- package/dist/email-addresses.js.map +1 -0
- package/dist/environment.d.ts +8 -0
- package/dist/environment.js +6 -0
- package/dist/environment.js.map +1 -1
- package/dist/external-passkeys.d.ts +34 -0
- package/dist/external-passkeys.js +31 -0
- package/dist/external-passkeys.js.map +1 -0
- package/dist/fapi.d.ts +36 -0
- package/dist/fapi.js +75 -4
- package/dist/fapi.js.map +1 -1
- package/dist/identity-verification.d.ts +40 -0
- package/dist/identity-verification.js +40 -0
- package/dist/identity-verification.js.map +1 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/journey-redirect.d.ts +8 -0
- package/dist/journey-redirect.js +32 -0
- package/dist/journey-redirect.js.map +1 -0
- package/dist/marketing.d.ts +81 -0
- package/dist/marketing.js +162 -0
- package/dist/marketing.js.map +1 -0
- package/dist/mfa-enrollment.d.ts +2 -0
- package/dist/mfa-enrollment.js +1 -0
- package/dist/mfa-enrollment.js.map +1 -1
- package/dist/mfa-factors.d.ts +109 -0
- package/dist/mfa-factors.js +98 -0
- package/dist/mfa-factors.js.map +1 -0
- package/dist/migration-browser-sessions.d.ts +118 -0
- package/dist/migration-browser-sessions.js +404 -0
- package/dist/migration-browser-sessions.js.map +1 -0
- package/dist/organization-admin.d.ts +192 -0
- package/dist/organization-admin.js +53 -0
- package/dist/organization-admin.js.map +1 -0
- package/dist/passkey.d.ts +71 -2
- package/dist/passkey.js +97 -0
- package/dist/passkey.js.map +1 -1
- package/dist/password-reset.d.ts +16 -1
- package/dist/password-reset.js +19 -4
- package/dist/password-reset.js.map +1 -1
- package/dist/pricing.d.ts +80 -0
- package/dist/pricing.js +71 -0
- package/dist/pricing.js.map +1 -0
- package/dist/profile.d.ts +73 -1
- package/dist/profile.js +23 -0
- package/dist/profile.js.map +1 -1
- package/dist/redirect.js +1 -1
- package/dist/redirect.js.map +1 -1
- package/dist/telegram.d.ts +23 -0
- package/dist/telegram.js +8 -0
- package/dist/telegram.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.looksLikeYubicoOtp = void 0;
|
|
4
|
+
exports.startHotp = startHotp;
|
|
5
|
+
exports.verifyHotp = verifyHotp;
|
|
6
|
+
exports.resyncHotp = resyncHotp;
|
|
7
|
+
exports.enrollYubikey = enrollYubikey;
|
|
8
|
+
exports.startDuoEnrollment = startDuoEnrollment;
|
|
9
|
+
exports.finishDuoEnrollment = finishDuoEnrollment;
|
|
10
|
+
exports.prepareDuo = prepareDuo;
|
|
11
|
+
exports.pollDuo = pollDuo;
|
|
12
|
+
exports.getSecurityQuestions = getSecurityQuestions;
|
|
13
|
+
exports.setSecurityQuestions = setSecurityQuestions;
|
|
14
|
+
exports.removeSecurityQuestions = removeSecurityQuestions;
|
|
15
|
+
exports.getResetSecurityQuestions = getResetSecurityQuestions;
|
|
16
|
+
exports.signInWithSmartCard = signInWithSmartCard;
|
|
17
|
+
/** Start HOTP enrolment: returns the secret and URI once. Confirm with {@link verifyHotp}. */
|
|
18
|
+
function startHotp(client) {
|
|
19
|
+
return client.post('/v1/client/me/mfa/hotp');
|
|
20
|
+
}
|
|
21
|
+
/** Confirm HOTP enrolment with the token's next code; the response carries the recovery codes once. */
|
|
22
|
+
function verifyHotp(client, factorId, code) {
|
|
23
|
+
return client.post(`/v1/client/me/mfa/hotp/${encodeURIComponent(factorId)}/verify`, { code });
|
|
24
|
+
}
|
|
25
|
+
/** Re-synchronise a token whose counter ran far ahead, from two consecutive codes. */
|
|
26
|
+
function resyncHotp(client, factorId, codes) {
|
|
27
|
+
return client.post(`/v1/client/me/mfa/hotp/${encodeURIComponent(factorId)}/resync`, { codes });
|
|
28
|
+
}
|
|
29
|
+
/** Enrol a YubiKey: the user touches the key into a field and you pass the typed OTP. */
|
|
30
|
+
function enrollYubikey(client, otp) {
|
|
31
|
+
return client.post(`/v1/client/me/mfa/yubikey`, { otp });
|
|
32
|
+
}
|
|
33
|
+
/** A string a YubiKey could have typed (modhex, 32 to 48 characters). Handy to route a field's input. */
|
|
34
|
+
const looksLikeYubicoOtp = (value) => /^[cbdefghijklnrtuv]{32,48}$/i.test(value.trim());
|
|
35
|
+
exports.looksLikeYubicoOtp = looksLikeYubicoOtp;
|
|
36
|
+
/** Begin Duo enrolment. After the redirect back, call {@link finishDuoEnrollment} with the returned `factorId`. */
|
|
37
|
+
function startDuoEnrollment(client, opts = {}) {
|
|
38
|
+
return client.post('/v1/client/me/mfa/duo', opts.returnUrl ? { return_url: opts.returnUrl } : {});
|
|
39
|
+
}
|
|
40
|
+
/** Complete Duo enrolment after the user approved Duo's prompt. Answers 400 until Duo has confirmed. */
|
|
41
|
+
function finishDuoEnrollment(client, factorId) {
|
|
42
|
+
return client.post(`/v1/client/me/mfa/duo/${encodeURIComponent(factorId)}/verify`);
|
|
43
|
+
}
|
|
44
|
+
/** At the second-factor step: get Duo's authorization URL for this sign-in attempt. */
|
|
45
|
+
async function prepareDuo(client, attemptId, opts = {}) {
|
|
46
|
+
const response = await client.post(`/v1/client/sign_ins/${encodeURIComponent(attemptId)}/prepare_second_factor`, { strategy: 'duo', ...(opts.returnUrl ? { return_url: opts.returnUrl } : {}) });
|
|
47
|
+
return { prompt: response.ok && response.data ? { authorizationUrl: response.data.authorization_url } : null, response };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Poll the sign-in after sending the user to Duo. Returns the attempt as it stands: the
|
|
51
|
+
* status stays `needs_second_factor` until Duo's callback has recorded an approval for this
|
|
52
|
+
* attempt, then `complete`.
|
|
53
|
+
*/
|
|
54
|
+
function pollDuo(client, attemptId) {
|
|
55
|
+
return client.post(`/v1/client/sign_ins/${encodeURIComponent(attemptId)}/attempt_second_factor`, { strategy: 'duo' });
|
|
56
|
+
}
|
|
57
|
+
const questionsFrom = (w) => ({
|
|
58
|
+
enabled: w.enabled,
|
|
59
|
+
required: w.required,
|
|
60
|
+
availableQuestions: w.available_questions,
|
|
61
|
+
answeredQuestions: w.answered_questions,
|
|
62
|
+
});
|
|
63
|
+
/** The offered questions and the signed-in user's chosen ones. */
|
|
64
|
+
async function getSecurityQuestions(client) {
|
|
65
|
+
const res = await client.get('/v1/client/me/security_questions');
|
|
66
|
+
return res.ok && res.data ? questionsFrom(res.data) : null;
|
|
67
|
+
}
|
|
68
|
+
/** Set (replace) the answers. `answers` has exactly `required` distinct questions from the offered list. */
|
|
69
|
+
async function setSecurityQuestions(client, answers) {
|
|
70
|
+
const response = await client.request('/v1/client/me/security_questions', {
|
|
71
|
+
method: 'PUT',
|
|
72
|
+
body: JSON.stringify({ answers }),
|
|
73
|
+
});
|
|
74
|
+
return { questions: response.ok && response.data ? questionsFrom(response.data) : null, response };
|
|
75
|
+
}
|
|
76
|
+
function removeSecurityQuestions(client) {
|
|
77
|
+
return client.request('/v1/client/me/security_questions', { method: 'DELETE' });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* During a password reset, once the emailed code (and any second factor) is accepted: the
|
|
81
|
+
* questions the user must answer before choosing a password. Send the answers as
|
|
82
|
+
* `security_answers` with `set_new_password`.
|
|
83
|
+
*/
|
|
84
|
+
async function getResetSecurityQuestions(client, resetId) {
|
|
85
|
+
const res = await client.get(`/v1/client/password_resets/${encodeURIComponent(resetId)}/security_questions`);
|
|
86
|
+
return res.ok && res.data ? { required: res.data.required, questions: res.data.questions } : null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Smart card / PIV / CAC sign-in. The browser presents the card's certificate in the TLS
|
|
90
|
+
* handshake to a Frontend API host that requests client certificates; your proxy forwards the
|
|
91
|
+
* result and Atlas signs the user in. Resolves like a passkey sign-in: a completed attempt
|
|
92
|
+
* (`status: "complete"`, with the session set), or `needs_second_factor` when the account's
|
|
93
|
+
* MFA is still owed.
|
|
94
|
+
*/
|
|
95
|
+
function signInWithSmartCard(client) {
|
|
96
|
+
return client.post('/v1/client/sign_ins/smart_card');
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=mfa-factors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfa-factors.js","sourceRoot":"","sources":["../src/mfa-factors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moving to Atlas without signing anyone out, BROWSER SIDE, for vendors whose
|
|
3
|
+
* SDK keeps the session in browser storage rather than in a cookie a server
|
|
4
|
+
* middleware could read: Firebase (IndexedDB), AWS Amplify / Cognito
|
|
5
|
+
* (localStorage), MSAL for Azure AD B2C / Entra External ID (session or local
|
|
6
|
+
* storage), Supabase SPAs (localStorage), Appwrite (its localStorage cookie
|
|
7
|
+
* fallback), PocketBase (localStorage) and Nhost
|
|
8
|
+
* (localStorage).
|
|
9
|
+
*
|
|
10
|
+
* A reader finds the old token on this page; {@link exchangeMigrationBrowserSession}
|
|
11
|
+
* sends it ONCE to `POST /v1/client/migrations/{source}/exchange` with cookie
|
|
12
|
+
* delivery, so Atlas sets its session exactly as a sign-in does, and then
|
|
13
|
+
* clears the old storage. Atlas verifies the token (against the vendor's keys,
|
|
14
|
+
* or the sessions imported in the migration bundle) — nothing here is trusted.
|
|
15
|
+
*
|
|
16
|
+
* const found = await readFirebaseBrowserSession();
|
|
17
|
+
* if (found) await exchangeMigrationBrowserSession(client, { source: 'firebase', ...found });
|
|
18
|
+
*
|
|
19
|
+
* Where the vendor allows a public refresh (Firebase's securetoken endpoint
|
|
20
|
+
* with the project's web API key, Cognito's REFRESH_TOKEN_AUTH with a public
|
|
21
|
+
* client id), an expired token is refreshed first, so the exchange presents a
|
|
22
|
+
* live one.
|
|
23
|
+
*/
|
|
24
|
+
import type { FapiClient } from './fapi';
|
|
25
|
+
/** A token found on this page, and how to remove the old session once exchanged. */
|
|
26
|
+
export interface BrowserSessionToken {
|
|
27
|
+
token: string;
|
|
28
|
+
/** Remove the old vendor session from this browser. */
|
|
29
|
+
clear: () => void | Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export type MigrationBrowserExchangeOutcome = {
|
|
32
|
+
status: 'none';
|
|
33
|
+
} | {
|
|
34
|
+
status: 'complete';
|
|
35
|
+
sessionId: string;
|
|
36
|
+
userId: string;
|
|
37
|
+
jwt: string;
|
|
38
|
+
} | {
|
|
39
|
+
status: 'needs_second_factor' | 'needs_mfa_enrollment';
|
|
40
|
+
attemptId: string;
|
|
41
|
+
} | {
|
|
42
|
+
status: 'refused';
|
|
43
|
+
outcome: string;
|
|
44
|
+
};
|
|
45
|
+
export declare function migrationBrowserExchangePath(source: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Exchange an old vendor session found on this page for an Atlas session.
|
|
48
|
+
* Never throws. On success (or a final refusal) the old session is cleared.
|
|
49
|
+
*/
|
|
50
|
+
export declare function exchangeMigrationBrowserSession(client: FapiClient, input: {
|
|
51
|
+
source: string;
|
|
52
|
+
token?: string;
|
|
53
|
+
clear?: () => void | Promise<void>;
|
|
54
|
+
remember?: boolean;
|
|
55
|
+
}): Promise<MigrationBrowserExchangeOutcome>;
|
|
56
|
+
type StorageLike = Pick<Storage, 'getItem' | 'removeItem' | 'key' | 'length'> & {
|
|
57
|
+
setItem?(key: string, value: string): void;
|
|
58
|
+
};
|
|
59
|
+
/** The unverified payload of a JWT (only to read `exp` / `iss` before choosing to refresh). */
|
|
60
|
+
export declare function peekJwtPayload(token: string): Record<string, unknown> | null;
|
|
61
|
+
export interface FirebaseBrowserSessionOptions {
|
|
62
|
+
/** Only this project's web API key (default: the first signed-in Firebase app on the page). */
|
|
63
|
+
apiKey?: string;
|
|
64
|
+
/** Refresh an expired ID token with the securetoken endpoint first (default true). */
|
|
65
|
+
refresh?: boolean;
|
|
66
|
+
indexedDB?: IDBFactory;
|
|
67
|
+
storage?: StorageLike[];
|
|
68
|
+
fetchImpl?: typeof fetch;
|
|
69
|
+
}
|
|
70
|
+
/** Firebase's public token refresh (the web SDK's own call): a fresh ID token, or undefined. */
|
|
71
|
+
export declare function refreshFirebaseIdToken(apiKey: string, refreshToken: string, fetchImpl?: typeof fetch): Promise<string | undefined>;
|
|
72
|
+
/** The Firebase ID token this page is signed in with (IndexedDB, else local/session storage persistence). */
|
|
73
|
+
export declare function readFirebaseBrowserSession(options?: FirebaseBrowserSessionOptions): Promise<BrowserSessionToken | undefined>;
|
|
74
|
+
export interface AmplifyBrowserSessionOptions {
|
|
75
|
+
/** The app client id (default: the first one with a signed-in user). */
|
|
76
|
+
clientId?: string;
|
|
77
|
+
/** Refresh an expired ID token with REFRESH_TOKEN_AUTH first (default true; public clients only). */
|
|
78
|
+
refresh?: boolean;
|
|
79
|
+
storage?: StorageLike[];
|
|
80
|
+
fetchImpl?: typeof fetch;
|
|
81
|
+
}
|
|
82
|
+
/** Cognito's public refresh: a fresh ID token for a client without a secret, or undefined. */
|
|
83
|
+
export declare function refreshCognitoIdToken(idToken: string, clientId: string, refreshToken: string, fetchImpl?: typeof fetch): Promise<string | undefined>;
|
|
84
|
+
/** The Cognito ID token Amplify (v5/v6) or amazon-cognito-identity-js keeps for this page. */
|
|
85
|
+
export declare function readAmplifyBrowserSession(options?: AmplifyBrowserSessionOptions): Promise<BrowserSessionToken | undefined>;
|
|
86
|
+
/**
|
|
87
|
+
* The ID token in an msal-browser v2/v3 cache (sessionStorage by default,
|
|
88
|
+
* localStorage when the app chose it). msal-browser v4 encrypts its cache, so
|
|
89
|
+
* nothing is found there: those apps rely on lazy migration.
|
|
90
|
+
*/
|
|
91
|
+
export declare function readMsalBrowserSession(options?: {
|
|
92
|
+
clientId?: string;
|
|
93
|
+
storage?: StorageLike[];
|
|
94
|
+
}): Promise<BrowserSessionToken | undefined>;
|
|
95
|
+
/** The access token supabase-js keeps in `sb-<ref>-auth-token` (an SPA; SSR apps use the server middleware). */
|
|
96
|
+
export declare function readSupabaseBrowserSession(options?: {
|
|
97
|
+
storageKey?: string;
|
|
98
|
+
storage?: StorageLike[];
|
|
99
|
+
}): Promise<BrowserSessionToken | undefined>;
|
|
100
|
+
/**
|
|
101
|
+
* The session the Appwrite Web SDK keeps in localStorage `cookieFallback`
|
|
102
|
+
* (`{"a_session_<projectId>": "<session>"}`) when third-party cookies are
|
|
103
|
+
* blocked. Atlas checks it with Appwrite (the `appwrite` remote bridge preset).
|
|
104
|
+
*/
|
|
105
|
+
export declare function readAppwriteBrowserSession(options?: {
|
|
106
|
+
projectId?: string;
|
|
107
|
+
storage?: StorageLike[];
|
|
108
|
+
}): Promise<BrowserSessionToken | undefined>;
|
|
109
|
+
/** The auth token the PocketBase JS SDK keeps in `pocketbase_auth`. */
|
|
110
|
+
export declare function readPocketBaseBrowserSession(options?: {
|
|
111
|
+
storageKey?: string;
|
|
112
|
+
storage?: StorageLike[];
|
|
113
|
+
}): Promise<BrowserSessionToken | undefined>;
|
|
114
|
+
/** The refresh token nhost-js v2/v3 keeps in `nhostRefreshToken` (matched against the sessions in the bundle). */
|
|
115
|
+
export declare function readNhostBrowserSession(options?: {
|
|
116
|
+
storage?: StorageLike[];
|
|
117
|
+
}): Promise<BrowserSessionToken | undefined>;
|
|
118
|
+
export {};
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrationBrowserExchangePath = migrationBrowserExchangePath;
|
|
4
|
+
exports.exchangeMigrationBrowserSession = exchangeMigrationBrowserSession;
|
|
5
|
+
exports.peekJwtPayload = peekJwtPayload;
|
|
6
|
+
exports.refreshFirebaseIdToken = refreshFirebaseIdToken;
|
|
7
|
+
exports.readFirebaseBrowserSession = readFirebaseBrowserSession;
|
|
8
|
+
exports.refreshCognitoIdToken = refreshCognitoIdToken;
|
|
9
|
+
exports.readAmplifyBrowserSession = readAmplifyBrowserSession;
|
|
10
|
+
exports.readMsalBrowserSession = readMsalBrowserSession;
|
|
11
|
+
exports.readSupabaseBrowserSession = readSupabaseBrowserSession;
|
|
12
|
+
exports.readAppwriteBrowserSession = readAppwriteBrowserSession;
|
|
13
|
+
exports.readPocketBaseBrowserSession = readPocketBaseBrowserSession;
|
|
14
|
+
exports.readNhostBrowserSession = readNhostBrowserSession;
|
|
15
|
+
function migrationBrowserExchangePath(source) {
|
|
16
|
+
return `/v1/client/migrations/${encodeURIComponent(source)}/exchange`;
|
|
17
|
+
}
|
|
18
|
+
/** Refusals after which the old session will never exchange: it is cleared. */
|
|
19
|
+
const FINAL = new Set(['invalid', 'signature_invalid', 'expired', 'reused', 'user_unavailable', 'user_unknown']);
|
|
20
|
+
/**
|
|
21
|
+
* Exchange an old vendor session found on this page for an Atlas session.
|
|
22
|
+
* Never throws. On success (or a final refusal) the old session is cleared.
|
|
23
|
+
*/
|
|
24
|
+
async function exchangeMigrationBrowserSession(client, input) {
|
|
25
|
+
if (!input.token)
|
|
26
|
+
return { status: 'none' };
|
|
27
|
+
const clear = async () => {
|
|
28
|
+
try {
|
|
29
|
+
await input.clear?.();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Clearing is best-effort: the exchange already happened (or never will).
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
let response;
|
|
36
|
+
try {
|
|
37
|
+
response = await client.post(migrationBrowserExchangePath(input.source), { token: input.token, delivery: 'cookie', ...(input.remember === false ? { remember: false } : {}) });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return { status: 'refused', outcome: 'error' };
|
|
41
|
+
}
|
|
42
|
+
const data = response.data;
|
|
43
|
+
if (response.ok && data?.object === 'session' && data.id && data.jwt) {
|
|
44
|
+
await clear();
|
|
45
|
+
return { status: 'complete', sessionId: data.id, userId: data.user_id ?? '', jwt: data.jwt };
|
|
46
|
+
}
|
|
47
|
+
if (response.ok && data?.object === 'sign_in_attempt' && data.id && (data.status === 'needs_second_factor' || data.status === 'needs_mfa_enrollment')) {
|
|
48
|
+
await clear();
|
|
49
|
+
return { status: data.status, attemptId: data.id };
|
|
50
|
+
}
|
|
51
|
+
const outcome = response.errors[0]?.meta?.bridge_outcome;
|
|
52
|
+
const reason = typeof outcome === 'string' ? outcome : 'error';
|
|
53
|
+
if (FINAL.has(reason))
|
|
54
|
+
await clear();
|
|
55
|
+
return { status: 'refused', outcome: reason };
|
|
56
|
+
}
|
|
57
|
+
function storages(given) {
|
|
58
|
+
if (given)
|
|
59
|
+
return given;
|
|
60
|
+
const out = [];
|
|
61
|
+
try {
|
|
62
|
+
if (typeof localStorage !== 'undefined')
|
|
63
|
+
out.push(localStorage);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Storage access can throw (privacy modes, sandboxed frames).
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
if (typeof sessionStorage !== 'undefined')
|
|
70
|
+
out.push(sessionStorage);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// As above.
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
function keysOf(s) {
|
|
78
|
+
const keys = [];
|
|
79
|
+
for (let i = 0; i < s.length; i++) {
|
|
80
|
+
const k = s.key(i);
|
|
81
|
+
if (k !== null)
|
|
82
|
+
keys.push(k);
|
|
83
|
+
}
|
|
84
|
+
return keys;
|
|
85
|
+
}
|
|
86
|
+
function json(text) {
|
|
87
|
+
if (!text)
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const v = JSON.parse(text);
|
|
91
|
+
return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** The unverified payload of a JWT (only to read `exp` / `iss` before choosing to refresh). */
|
|
98
|
+
function peekJwtPayload(token) {
|
|
99
|
+
const part = token.split('.')[1];
|
|
100
|
+
if (!part)
|
|
101
|
+
return null;
|
|
102
|
+
try {
|
|
103
|
+
const b64 = part.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(part.length / 4) * 4, '=');
|
|
104
|
+
const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
|
|
105
|
+
return json(new TextDecoder().decode(bytes));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function expired(token, skewSeconds = 30) {
|
|
112
|
+
const exp = peekJwtPayload(token)?.exp;
|
|
113
|
+
return typeof exp === 'number' && exp * 1000 <= Date.now() + skewSeconds * 1000;
|
|
114
|
+
}
|
|
115
|
+
const str = (v) => (typeof v === 'string' && v ? v : undefined);
|
|
116
|
+
const FIREBASE_DB = 'firebaseLocalStorageDb';
|
|
117
|
+
const FIREBASE_STORE = 'firebaseLocalStorage';
|
|
118
|
+
const FIREBASE_KEY = /^firebase:authUser:([^:]+):/;
|
|
119
|
+
function firebaseRecord(key, value) {
|
|
120
|
+
const m = FIREBASE_KEY.exec(key);
|
|
121
|
+
if (!m)
|
|
122
|
+
return null;
|
|
123
|
+
const v = (typeof value === 'string' ? json(value) : value);
|
|
124
|
+
const sts = v && typeof v.stsTokenManager === 'object' ? v.stsTokenManager : null;
|
|
125
|
+
if (!sts)
|
|
126
|
+
return null;
|
|
127
|
+
return { key, apiKey: m[1], accessToken: str(sts.accessToken), refreshToken: str(sts.refreshToken) };
|
|
128
|
+
}
|
|
129
|
+
function idbAll(factory) {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
let request;
|
|
132
|
+
try {
|
|
133
|
+
request = factory.open(FIREBASE_DB);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
resolve([]);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
request.onerror = () => resolve([]);
|
|
140
|
+
request.onupgradeneeded = () => {
|
|
141
|
+
// The database did not exist: abort the creation, there is no session.
|
|
142
|
+
request.transaction?.abort();
|
|
143
|
+
resolve([]);
|
|
144
|
+
};
|
|
145
|
+
request.onsuccess = () => {
|
|
146
|
+
const db = request.result;
|
|
147
|
+
try {
|
|
148
|
+
if (!db.objectStoreNames.contains(FIREBASE_STORE)) {
|
|
149
|
+
db.close();
|
|
150
|
+
resolve([]);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const all = db.transaction(FIREBASE_STORE, 'readonly').objectStore(FIREBASE_STORE).getAll();
|
|
154
|
+
all.onsuccess = () => {
|
|
155
|
+
db.close();
|
|
156
|
+
resolve((all.result ?? []));
|
|
157
|
+
};
|
|
158
|
+
all.onerror = () => {
|
|
159
|
+
db.close();
|
|
160
|
+
resolve([]);
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
db.close();
|
|
165
|
+
resolve([]);
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function idbDelete(factory, key) {
|
|
171
|
+
return new Promise((resolve) => {
|
|
172
|
+
const request = factory.open(FIREBASE_DB);
|
|
173
|
+
request.onerror = () => resolve();
|
|
174
|
+
request.onsuccess = () => {
|
|
175
|
+
const db = request.result;
|
|
176
|
+
try {
|
|
177
|
+
const tx = db.transaction(FIREBASE_STORE, 'readwrite');
|
|
178
|
+
tx.objectStore(FIREBASE_STORE).delete(key);
|
|
179
|
+
tx.oncomplete = () => {
|
|
180
|
+
db.close();
|
|
181
|
+
resolve();
|
|
182
|
+
};
|
|
183
|
+
tx.onerror = () => {
|
|
184
|
+
db.close();
|
|
185
|
+
resolve();
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
db.close();
|
|
190
|
+
resolve();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/** Firebase's public token refresh (the web SDK's own call): a fresh ID token, or undefined. */
|
|
196
|
+
async function refreshFirebaseIdToken(apiKey, refreshToken, fetchImpl = fetch) {
|
|
197
|
+
try {
|
|
198
|
+
const res = await fetchImpl(`https://securetoken.googleapis.com/v1/token?key=${encodeURIComponent(apiKey)}`, {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
201
|
+
body: new URLSearchParams({ grant_type: 'refresh_token', refresh_token: refreshToken }).toString(),
|
|
202
|
+
});
|
|
203
|
+
if (!res.ok)
|
|
204
|
+
return undefined;
|
|
205
|
+
const body = (await res.json());
|
|
206
|
+
return str(body.id_token);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** The Firebase ID token this page is signed in with (IndexedDB, else local/session storage persistence). */
|
|
213
|
+
async function readFirebaseBrowserSession(options = {}) {
|
|
214
|
+
const factory = options.indexedDB ?? (typeof indexedDB !== 'undefined' ? indexedDB : undefined);
|
|
215
|
+
const candidates = [];
|
|
216
|
+
if (factory) {
|
|
217
|
+
for (const row of await idbAll(factory)) {
|
|
218
|
+
const key = str(row.fbase_key);
|
|
219
|
+
const rec = key ? firebaseRecord(key, row.value) : null;
|
|
220
|
+
if (rec)
|
|
221
|
+
candidates.push({ ...rec, remove: () => idbDelete(factory, rec.key) });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
for (const s of storages(options.storage)) {
|
|
225
|
+
for (const key of keysOf(s)) {
|
|
226
|
+
const rec = firebaseRecord(key, s.getItem(key));
|
|
227
|
+
if (rec)
|
|
228
|
+
candidates.push({ ...rec, remove: () => s.removeItem(key) });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const found = candidates.find((c) => !options.apiKey || c.apiKey === options.apiKey);
|
|
232
|
+
if (!found?.accessToken)
|
|
233
|
+
return undefined;
|
|
234
|
+
let token = found.accessToken;
|
|
235
|
+
if (expired(token) && options.refresh !== false && found.refreshToken) {
|
|
236
|
+
token = (await refreshFirebaseIdToken(found.apiKey, found.refreshToken, options.fetchImpl)) ?? token;
|
|
237
|
+
}
|
|
238
|
+
return { token, clear: found.remove };
|
|
239
|
+
}
|
|
240
|
+
const AMPLIFY_LAST_USER = /^CognitoIdentityServiceProvider\.([^.]+)\.LastAuthUser$/;
|
|
241
|
+
/** Cognito's public refresh: a fresh ID token for a client without a secret, or undefined. */
|
|
242
|
+
async function refreshCognitoIdToken(idToken, clientId, refreshToken, fetchImpl = fetch) {
|
|
243
|
+
const iss = str(peekJwtPayload(idToken)?.iss);
|
|
244
|
+
const region = iss?.match(/^https:\/\/cognito-idp\.([a-z0-9-]+)\.amazonaws\.com\//)?.[1];
|
|
245
|
+
if (!region)
|
|
246
|
+
return undefined;
|
|
247
|
+
try {
|
|
248
|
+
const res = await fetchImpl(`https://cognito-idp.${region}.amazonaws.com/`, {
|
|
249
|
+
method: 'POST',
|
|
250
|
+
headers: { 'content-type': 'application/x-amz-json-1.1', 'x-amz-target': 'AWSCognitoIdentityProviderService.InitiateAuth' },
|
|
251
|
+
body: JSON.stringify({ AuthFlow: 'REFRESH_TOKEN_AUTH', ClientId: clientId, AuthParameters: { REFRESH_TOKEN: refreshToken } }),
|
|
252
|
+
});
|
|
253
|
+
if (!res.ok)
|
|
254
|
+
return undefined;
|
|
255
|
+
const body = (await res.json());
|
|
256
|
+
return str(body.AuthenticationResult?.IdToken);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/** The Cognito ID token Amplify (v5/v6) or amazon-cognito-identity-js keeps for this page. */
|
|
263
|
+
async function readAmplifyBrowserSession(options = {}) {
|
|
264
|
+
for (const s of storages(options.storage)) {
|
|
265
|
+
for (const key of keysOf(s)) {
|
|
266
|
+
const m = AMPLIFY_LAST_USER.exec(key);
|
|
267
|
+
if (!m || (options.clientId && m[1] !== options.clientId))
|
|
268
|
+
continue;
|
|
269
|
+
const clientId = m[1];
|
|
270
|
+
const username = s.getItem(key);
|
|
271
|
+
if (!username)
|
|
272
|
+
continue;
|
|
273
|
+
const prefix = `CognitoIdentityServiceProvider.${clientId}.${username}`;
|
|
274
|
+
let token = s.getItem(`${prefix}.idToken`);
|
|
275
|
+
if (!token)
|
|
276
|
+
continue;
|
|
277
|
+
const refreshToken = s.getItem(`${prefix}.refreshToken`);
|
|
278
|
+
if (expired(token) && options.refresh !== false && refreshToken) {
|
|
279
|
+
token = (await refreshCognitoIdToken(token, clientId, refreshToken, options.fetchImpl)) ?? token;
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
token,
|
|
283
|
+
clear: () => {
|
|
284
|
+
for (const k of keysOf(s))
|
|
285
|
+
if (k.startsWith(`CognitoIdentityServiceProvider.${clientId}.`))
|
|
286
|
+
s.removeItem(k);
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
// ── MSAL (Azure AD B2C / Entra External ID) ──────────────────────────────────
|
|
294
|
+
/**
|
|
295
|
+
* The ID token in an msal-browser v2/v3 cache (sessionStorage by default,
|
|
296
|
+
* localStorage when the app chose it). msal-browser v4 encrypts its cache, so
|
|
297
|
+
* nothing is found there: those apps rely on lazy migration.
|
|
298
|
+
*/
|
|
299
|
+
async function readMsalBrowserSession(options = {}) {
|
|
300
|
+
for (const s of storages(options.storage)) {
|
|
301
|
+
for (const key of keysOf(s)) {
|
|
302
|
+
const v = json(s.getItem(key));
|
|
303
|
+
if (!v || v.credentialType !== 'IdToken')
|
|
304
|
+
continue;
|
|
305
|
+
if (options.clientId && v.clientId !== options.clientId)
|
|
306
|
+
continue;
|
|
307
|
+
const token = str(v.secret);
|
|
308
|
+
if (!token || token.split('.').length !== 3)
|
|
309
|
+
continue;
|
|
310
|
+
const clientId = str(v.clientId);
|
|
311
|
+
return {
|
|
312
|
+
token,
|
|
313
|
+
clear: () => {
|
|
314
|
+
for (const k of keysOf(s)) {
|
|
315
|
+
if (k.startsWith('msal.') || (clientId && k.includes(clientId)))
|
|
316
|
+
s.removeItem(k);
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
// ── Supabase SPA (localStorage) ──────────────────────────────────────────────
|
|
325
|
+
/** The access token supabase-js keeps in `sb-<ref>-auth-token` (an SPA; SSR apps use the server middleware). */
|
|
326
|
+
async function readSupabaseBrowserSession(options = {}) {
|
|
327
|
+
for (const s of storages(options.storage)) {
|
|
328
|
+
for (const key of keysOf(s)) {
|
|
329
|
+
if (options.storageKey ? key !== options.storageKey : !/^sb-[^.]+-auth-token$/.test(key))
|
|
330
|
+
continue;
|
|
331
|
+
const v = json(s.getItem(key));
|
|
332
|
+
const nested = v && typeof v.currentSession === 'object' ? v.currentSession : null;
|
|
333
|
+
const token = str(v?.access_token) ?? str(nested?.access_token);
|
|
334
|
+
if (!token)
|
|
335
|
+
continue;
|
|
336
|
+
return { token, clear: () => s.removeItem(key) };
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
// ── Appwrite (localStorage cookie fallback) ──────────────────────────────────
|
|
342
|
+
/**
|
|
343
|
+
* The session the Appwrite Web SDK keeps in localStorage `cookieFallback`
|
|
344
|
+
* (`{"a_session_<projectId>": "<session>"}`) when third-party cookies are
|
|
345
|
+
* blocked. Atlas checks it with Appwrite (the `appwrite` remote bridge preset).
|
|
346
|
+
*/
|
|
347
|
+
async function readAppwriteBrowserSession(options = {}) {
|
|
348
|
+
for (const s of storages(options.storage)) {
|
|
349
|
+
const v = json(s.getItem('cookieFallback'));
|
|
350
|
+
if (!v)
|
|
351
|
+
continue;
|
|
352
|
+
for (const [key, value] of Object.entries(v)) {
|
|
353
|
+
if (options.projectId ? key !== `a_session_${options.projectId}` : !key.startsWith('a_session_') || key.endsWith('_legacy'))
|
|
354
|
+
continue;
|
|
355
|
+
const token = str(value);
|
|
356
|
+
if (!token)
|
|
357
|
+
continue;
|
|
358
|
+
return {
|
|
359
|
+
token,
|
|
360
|
+
clear: () => {
|
|
361
|
+
const rest = { ...v };
|
|
362
|
+
delete rest[key];
|
|
363
|
+
delete rest[`${key}_legacy`];
|
|
364
|
+
if (Object.keys(rest).length && s.setItem)
|
|
365
|
+
s.setItem('cookieFallback', JSON.stringify(rest));
|
|
366
|
+
else
|
|
367
|
+
s.removeItem('cookieFallback');
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
// ── PocketBase (localStorage) ─────────────────────────────────────────────────
|
|
375
|
+
/** The auth token the PocketBase JS SDK keeps in `pocketbase_auth`. */
|
|
376
|
+
async function readPocketBaseBrowserSession(options = {}) {
|
|
377
|
+
const name = options.storageKey ?? 'pocketbase_auth';
|
|
378
|
+
for (const s of storages(options.storage)) {
|
|
379
|
+
const token = str(json(s.getItem(name))?.token);
|
|
380
|
+
if (token)
|
|
381
|
+
return { token, clear: () => s.removeItem(name) };
|
|
382
|
+
}
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
// ── Nhost (localStorage) ──────────────────────────────────────────────────────
|
|
386
|
+
/** The refresh token nhost-js v2/v3 keeps in `nhostRefreshToken` (matched against the sessions in the bundle). */
|
|
387
|
+
async function readNhostBrowserSession(options = {}) {
|
|
388
|
+
for (const s of storages(options.storage)) {
|
|
389
|
+
const v4 = json(s.getItem('nhostSession'));
|
|
390
|
+
const token = s.getItem('nhostRefreshToken') ?? str(v4?.refreshToken);
|
|
391
|
+
if (token) {
|
|
392
|
+
return {
|
|
393
|
+
token,
|
|
394
|
+
clear: () => {
|
|
395
|
+
s.removeItem('nhostRefreshToken');
|
|
396
|
+
s.removeItem('nhostRefreshTokenExpiresAt');
|
|
397
|
+
s.removeItem('nhostSession');
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return undefined;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=migration-browser-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-browser-sessions.js","sourceRoot":"","sources":["../src/migration-browser-sessions.ts"],"names":[],"mappings":"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"}
|