@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
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrationExchangePath = migrationExchangePath;
|
|
4
|
+
exports.migrationBapiExchangePath = migrationBapiExchangePath;
|
|
5
|
+
exports.exchangeMigrationSession = exchangeMigrationSession;
|
|
6
|
+
exports.parseCookieHeader = parseCookieHeader;
|
|
7
|
+
exports.readPocketBaseCookieToken = readPocketBaseCookieToken;
|
|
8
|
+
exports.readSupabaseAccessToken = readSupabaseAccessToken;
|
|
9
|
+
exports.readSupabaseRefreshToken = readSupabaseRefreshToken;
|
|
10
|
+
exports.bridgeCookieConfig = bridgeCookieConfig;
|
|
11
|
+
exports.createMigrationBridge = createMigrationBridge;
|
|
12
|
+
const migration_presets_1 = require("./migration-presets");
|
|
13
|
+
/**
|
|
14
|
+
* Moving to Atlas from ANY auth vendor without signing anyone out — the
|
|
15
|
+
* vendor-neutral zero-logout bridge (Better Auth's `betterAuthBridge` is now an
|
|
16
|
+
* alias of this with `source: 'better_auth'`).
|
|
17
|
+
*
|
|
18
|
+
* During the migration window a returning user still carries the old vendor's
|
|
19
|
+
* session cookie (or bearer token). The bridge reads it, exchanges it ONCE with
|
|
20
|
+
* Atlas (`POST /v1/migrations/{source}/exchange` with the secret key, or the
|
|
21
|
+
* Frontend API twin `POST /v1/client/migrations/{source}/exchange`), sets the
|
|
22
|
+
* Atlas session as your own first-party cookies and clears the old ones. Atlas
|
|
23
|
+
* verifies the old token (a JWT against the vendor's keys, or an opaque token
|
|
24
|
+
* against the sessions you imported) and runs the normal sign-in path on it —
|
|
25
|
+
* MFA policy included.
|
|
26
|
+
*
|
|
27
|
+
* Framework-neutral: {@link createMigrationBridge} returns a decision with the
|
|
28
|
+
* cookies to set and clear; the Next.js middleware and the Express / Fastify /
|
|
29
|
+
* Hono adapters render it (`migrationBridge({ source })`).
|
|
30
|
+
*/
|
|
31
|
+
/** Default Backend API origin. */
|
|
32
|
+
const DEFAULT_BAPI_URL = 'https://api.atlasauth.net';
|
|
33
|
+
/** The Frontend API exchange path for a source. */
|
|
34
|
+
function migrationExchangePath(source) {
|
|
35
|
+
return `/v1/client/migrations/${encodeURIComponent(source)}/exchange`;
|
|
36
|
+
}
|
|
37
|
+
/** The Backend API (secret-key) exchange path for a source. */
|
|
38
|
+
function migrationBapiExchangePath(source) {
|
|
39
|
+
return `/v1/migrations/${encodeURIComponent(source)}/exchange`;
|
|
40
|
+
}
|
|
41
|
+
const KNOWN_REFUSALS = ['closed', 'invalid', 'signature_invalid', 'expired', 'reused', 'user_unavailable', 'user_unknown', 'rate_limited'];
|
|
42
|
+
/**
|
|
43
|
+
* Exchange an old vendor session for an Atlas session, server to server
|
|
44
|
+
* (`delivery: "body"`). Never throws: a transport failure is
|
|
45
|
+
* `{ kind: 'refused', outcome: 'unavailable' }`, so the caller keeps the old
|
|
46
|
+
* cookie and tries again on a later request.
|
|
47
|
+
*/
|
|
48
|
+
async function exchangeMigrationSession(options) {
|
|
49
|
+
const doFetch = options.fetchImpl ?? fetch;
|
|
50
|
+
const viaSecretKey = Boolean(options.secretKey);
|
|
51
|
+
const url = viaSecretKey
|
|
52
|
+
? `${(options.bapiBaseUrl ?? DEFAULT_BAPI_URL).replace(/\/+$/, '')}${migrationBapiExchangePath(options.source)}`
|
|
53
|
+
: new URL(migrationExchangePath(options.source), options.fapiOrigin).toString();
|
|
54
|
+
const headers = { 'content-type': 'application/json' };
|
|
55
|
+
if (viaSecretKey) {
|
|
56
|
+
headers.authorization = `Bearer ${options.secretKey}`;
|
|
57
|
+
if (options.clientIp)
|
|
58
|
+
headers['x-atlas-client-ip'] = options.clientIp;
|
|
59
|
+
if (options.userAgent)
|
|
60
|
+
headers['x-atlas-client-user-agent'] = options.userAgent;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
headers['x-publishable-key'] = options.publishableKey;
|
|
64
|
+
if (options.userAgent)
|
|
65
|
+
headers['user-agent'] = options.userAgent;
|
|
66
|
+
}
|
|
67
|
+
let res;
|
|
68
|
+
try {
|
|
69
|
+
res = await doFetch(url, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers,
|
|
72
|
+
body: JSON.stringify({
|
|
73
|
+
token: options.token,
|
|
74
|
+
...(viaSecretKey ? {} : { delivery: 'body' }),
|
|
75
|
+
...(options.remember === false ? { remember: false } : {}),
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return { kind: 'refused', outcome: 'unavailable', status: 0 };
|
|
81
|
+
}
|
|
82
|
+
const data = (await res.json().catch(() => null));
|
|
83
|
+
if (res.ok && data?.object === 'session_tokens' && data.jwt && data.refresh_token) {
|
|
84
|
+
return { kind: 'session', jwt: data.jwt, refreshToken: data.refresh_token, sessionId: data.session_id ?? '', userId: data.user_id ?? '', expiresIn: data.expires_in ?? 0 };
|
|
85
|
+
}
|
|
86
|
+
if (res.ok && data?.object === 'sign_in_attempt' && data.id && (data.status === 'needs_second_factor' || data.status === 'needs_mfa_enrollment')) {
|
|
87
|
+
return { kind: 'needs_mfa', attemptId: data.id, status: data.status };
|
|
88
|
+
}
|
|
89
|
+
if (res.status === 429)
|
|
90
|
+
return { kind: 'refused', outcome: 'rate_limited', status: 429 };
|
|
91
|
+
const outcome = data?.errors?.[0]?.meta?.bridge_outcome;
|
|
92
|
+
if (outcome && KNOWN_REFUSALS.includes(outcome))
|
|
93
|
+
return { kind: 'refused', outcome: outcome, status: res.status };
|
|
94
|
+
// Anything else (a 5xx, a guard refusal, an unparsable body) is not a verdict on the old session: keep it.
|
|
95
|
+
return { kind: 'refused', outcome: 'unavailable', status: res.status };
|
|
96
|
+
}
|
|
97
|
+
/** Refusals that say the old session will never exchange: its cookies are cleared. */
|
|
98
|
+
const FINAL = ['invalid', 'signature_invalid', 'expired', 'reused', 'user_unavailable', 'user_unknown'];
|
|
99
|
+
function header(headers, name) {
|
|
100
|
+
if (typeof headers.get === 'function')
|
|
101
|
+
return headers.get(name) ?? undefined;
|
|
102
|
+
const record = headers;
|
|
103
|
+
const value = record[name] ?? record[name.toLowerCase()];
|
|
104
|
+
return Array.isArray(value) ? value.join('; ') : value;
|
|
105
|
+
}
|
|
106
|
+
/** Parse a Cookie header into name → raw value (first occurrence wins). */
|
|
107
|
+
function parseCookieHeader(cookieHeader) {
|
|
108
|
+
const out = {};
|
|
109
|
+
if (!cookieHeader)
|
|
110
|
+
return out;
|
|
111
|
+
for (const part of cookieHeader.split(';')) {
|
|
112
|
+
const i = part.indexOf('=');
|
|
113
|
+
if (i <= 0)
|
|
114
|
+
continue;
|
|
115
|
+
const name = part.slice(0, i).trim();
|
|
116
|
+
if (name && !(name in out))
|
|
117
|
+
out[name] = part.slice(i + 1).trim();
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
/** The unverified `iss` of a compact JWT (routing only; Atlas verifies). */
|
|
122
|
+
function peekIss(token) {
|
|
123
|
+
const parts = token.split('.');
|
|
124
|
+
if (parts.length !== 3)
|
|
125
|
+
return undefined;
|
|
126
|
+
try {
|
|
127
|
+
const json = JSON.parse(decodeBase64Url(parts[1]));
|
|
128
|
+
return typeof json.iss === 'string' ? json.iss : undefined;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function decodeBase64Url(s) {
|
|
135
|
+
const b64 = s.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(s.length / 4) * 4, '=');
|
|
136
|
+
const bin = atob(b64);
|
|
137
|
+
const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));
|
|
138
|
+
return new TextDecoder().decode(bytes);
|
|
139
|
+
}
|
|
140
|
+
/** The token in the PocketBase JS SDK's `authStore.exportToCookie()` cookie (`pb_auth`: JSON `{ token, record }`). */
|
|
141
|
+
function readPocketBaseCookieToken(raw) {
|
|
142
|
+
if (!raw)
|
|
143
|
+
return undefined;
|
|
144
|
+
try {
|
|
145
|
+
const v = JSON.parse(raw.startsWith('%7B') || raw.startsWith('%7b') ? decodeURIComponent(raw) : raw);
|
|
146
|
+
return typeof v?.token === 'string' && v.token ? v.token : undefined;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Supabase SSR cookie: `sb-<ref>-auth-token` (or chunks `.0`, `.1`, … joined in
|
|
154
|
+
* order), the value JSON or `base64-` + base64url(JSON), holding `access_token`.
|
|
155
|
+
*/
|
|
156
|
+
function readSupabaseAccessToken(cookies, baseName) {
|
|
157
|
+
return readSupabaseCookieField(cookies, baseName, 'access_token');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The refresh token in the same cookie (`refresh_token`, or the second entry
|
|
161
|
+
* of the older auth-helpers array): what the `supabase_refresh_token`
|
|
162
|
+
* session-table preset looks up among the sessions a dump of
|
|
163
|
+
* auth.refresh_tokens imported.
|
|
164
|
+
*/
|
|
165
|
+
function readSupabaseRefreshToken(cookies, baseName) {
|
|
166
|
+
return readSupabaseCookieField(cookies, baseName, 'refresh_token');
|
|
167
|
+
}
|
|
168
|
+
function readSupabaseCookieField(cookies, baseName, field) {
|
|
169
|
+
let raw = cookies[baseName];
|
|
170
|
+
if (raw === undefined) {
|
|
171
|
+
const chunks = [];
|
|
172
|
+
for (let i = 0; cookies[`${baseName}.${i}`] !== undefined; i++)
|
|
173
|
+
chunks.push(cookies[`${baseName}.${i}`]);
|
|
174
|
+
if (!chunks.length)
|
|
175
|
+
return undefined;
|
|
176
|
+
raw = chunks.join('');
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
let text = decodeURIComponent(raw);
|
|
180
|
+
if (text.startsWith('base64-'))
|
|
181
|
+
text = decodeBase64Url(text.slice('base64-'.length));
|
|
182
|
+
const parsed = JSON.parse(text);
|
|
183
|
+
const token = Array.isArray(parsed) ? parsed[field === 'access_token' ? 0 : 1] : parsed?.[field];
|
|
184
|
+
return typeof token === 'string' && token ? token : undefined;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Resolve the cookie names / format / bearer flag the bridge uses for its source. */
|
|
191
|
+
function bridgeCookieConfig(options) {
|
|
192
|
+
const presetId = options.preset ?? ((0, migration_presets_1.getMigrationBridgePreset)(options.source) ? options.source : undefined);
|
|
193
|
+
let cookies = [];
|
|
194
|
+
let clear = [];
|
|
195
|
+
let format = 'raw';
|
|
196
|
+
let bearer = false;
|
|
197
|
+
let sharesAtlasCookie = false;
|
|
198
|
+
let issuer = null;
|
|
199
|
+
if (presetId) {
|
|
200
|
+
try {
|
|
201
|
+
const r = (0, migration_presets_1.resolveMigrationBridgePreset)(presetId, options.presetVars ?? {});
|
|
202
|
+
cookies = r.cookies;
|
|
203
|
+
clear = r.clearCookies;
|
|
204
|
+
format = r.tokenFormat;
|
|
205
|
+
bearer = r.bearer;
|
|
206
|
+
sharesAtlasCookie = r.sharesAtlasCookie;
|
|
207
|
+
issuer = r.issuer;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// A preset whose cookie names need variables the app did not pass: only explicit names work.
|
|
211
|
+
const p = (0, migration_presets_1.getMigrationBridgePreset)(presetId);
|
|
212
|
+
cookies = (p?.cookies ?? []).filter((c) => !c.includes('{'));
|
|
213
|
+
clear = (p?.clearCookies ?? p?.cookies ?? []).filter((c) => !c.includes('{'));
|
|
214
|
+
format = p?.tokenFormat ?? 'raw';
|
|
215
|
+
bearer = p?.bearer === true;
|
|
216
|
+
sharesAtlasCookie = p?.sharesAtlasCookie === true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (options.cookieNames)
|
|
220
|
+
cookies = options.cookieNames;
|
|
221
|
+
if (options.clearCookieNames)
|
|
222
|
+
clear = options.clearCookieNames;
|
|
223
|
+
else if (options.cookieNames)
|
|
224
|
+
clear = options.cookieNames;
|
|
225
|
+
return {
|
|
226
|
+
cookies,
|
|
227
|
+
clear,
|
|
228
|
+
format: options.tokenFormat ?? format,
|
|
229
|
+
bearer: options.bearer ?? bearer,
|
|
230
|
+
sharesAtlasCookie: sharesAtlasCookie || cookies.includes('__session'),
|
|
231
|
+
issuer,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The bridge as a function of a request's headers. Call it from middleware
|
|
236
|
+
* before your normal auth check; it does nothing (no network) for a request
|
|
237
|
+
* without an old session, or with an Atlas session already present.
|
|
238
|
+
*/
|
|
239
|
+
function createMigrationBridge(options) {
|
|
240
|
+
const secure = options.secure !== false;
|
|
241
|
+
const config = bridgeCookieConfig(options);
|
|
242
|
+
const clearOld = (present) => {
|
|
243
|
+
const names = new Set();
|
|
244
|
+
for (const pattern of config.clear) {
|
|
245
|
+
if (!pattern.includes('*')) {
|
|
246
|
+
names.add(pattern);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
for (const name of Object.keys(present))
|
|
250
|
+
if ((0, migration_presets_1.cookieNameMatches)(pattern, name))
|
|
251
|
+
names.add(name);
|
|
252
|
+
}
|
|
253
|
+
return [...names].map((name) => ({
|
|
254
|
+
name,
|
|
255
|
+
value: '',
|
|
256
|
+
options: {
|
|
257
|
+
path: '/',
|
|
258
|
+
maxAge: 0,
|
|
259
|
+
...(options.oldCookieDomain ? { domain: options.oldCookieDomain } : {}),
|
|
260
|
+
...(name.startsWith('__Secure-') || name.startsWith('__Host-') ? { secure: true } : {}),
|
|
261
|
+
},
|
|
262
|
+
}));
|
|
263
|
+
};
|
|
264
|
+
const readToken = async (request, cookies) => {
|
|
265
|
+
if (options.extractToken) {
|
|
266
|
+
const t = await options.extractToken({ cookies, headers: request.headers });
|
|
267
|
+
return t ? { token: t, fromAtlasCookie: false } : undefined;
|
|
268
|
+
}
|
|
269
|
+
for (const pattern of config.cookies) {
|
|
270
|
+
const names = pattern.includes('*') ? Object.keys(cookies).filter((n) => (0, migration_presets_1.cookieNameMatches)(pattern, n)).sort() : [pattern];
|
|
271
|
+
for (const name of names) {
|
|
272
|
+
const token = config.format === 'supabase' ? readSupabaseAccessToken(cookies, name) : config.format === 'supabase_refresh' ? readSupabaseRefreshToken(cookies, name) : config.format === 'pocketbase' ? readPocketBaseCookieToken(cookies[name]) : cookies[name];
|
|
273
|
+
if (token)
|
|
274
|
+
return { token, fromAtlasCookie: name === '__session' };
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (config.bearer) {
|
|
278
|
+
const auth = header(request.headers, 'authorization');
|
|
279
|
+
const m = auth ? /^Bearer\s+(.+)$/i.exec(auth.trim()) : null;
|
|
280
|
+
if (m && config.issuer && peekIss(m[1]) === config.issuer)
|
|
281
|
+
return { token: m[1], fromAtlasCookie: false };
|
|
282
|
+
}
|
|
283
|
+
return undefined;
|
|
284
|
+
};
|
|
285
|
+
return async function bridge(request) {
|
|
286
|
+
const cookies = parseCookieHeader(header(request.headers, 'cookie'));
|
|
287
|
+
const found = await readToken(request, cookies);
|
|
288
|
+
if (!found)
|
|
289
|
+
return { action: 'none' };
|
|
290
|
+
// Already on Atlas: an Atlas refresh cookie means the switch happened.
|
|
291
|
+
if (cookies.__atlas_rt)
|
|
292
|
+
return { action: 'none' };
|
|
293
|
+
// `__session` is Atlas's own cookie name, and a few vendors (Clerk, Firebase
|
|
294
|
+
// Hosting, nextjs-auth0) use it too. A token read from it is the vendor's
|
|
295
|
+
// only when it carries the vendor's issuer (which needs the preset's
|
|
296
|
+
// variables); otherwise an Atlas session (a JWT with another issuer) means
|
|
297
|
+
// the user is already on Atlas.
|
|
298
|
+
if (found.fromAtlasCookie) {
|
|
299
|
+
if (!config.issuer || peekIss(found.token) !== config.issuer)
|
|
300
|
+
return { action: 'none' };
|
|
301
|
+
}
|
|
302
|
+
else if (cookies.__session) {
|
|
303
|
+
const iss = peekIss(cookies.__session);
|
|
304
|
+
const atlasSession = !config.sharesAtlasCookie || (iss !== undefined && iss !== config.issuer);
|
|
305
|
+
if (atlasSession)
|
|
306
|
+
return { action: 'none' };
|
|
307
|
+
}
|
|
308
|
+
const result = await exchangeMigrationSession({
|
|
309
|
+
source: options.source,
|
|
310
|
+
fapiOrigin: options.fapiOrigin,
|
|
311
|
+
publishableKey: options.publishableKey,
|
|
312
|
+
token: found.token,
|
|
313
|
+
fetchImpl: options.fetchImpl,
|
|
314
|
+
userAgent: header(request.headers, 'user-agent'),
|
|
315
|
+
secretKey: options.secretKey,
|
|
316
|
+
bapiBaseUrl: options.bapiBaseUrl,
|
|
317
|
+
clientIp: request.ip ?? clientIpFrom(request.headers),
|
|
318
|
+
});
|
|
319
|
+
if (result.kind === 'session') {
|
|
320
|
+
const old = clearOld(cookies).filter((c) => c.name !== '__session');
|
|
321
|
+
return {
|
|
322
|
+
action: 'signed_in',
|
|
323
|
+
session: result,
|
|
324
|
+
cookies: [
|
|
325
|
+
{ name: '__session', value: result.jwt, options: { path: '/', sameSite: 'lax', secure } },
|
|
326
|
+
{ name: '__atlas_rt', value: result.refreshToken, options: { path: '/', httpOnly: true, sameSite: 'lax', secure } },
|
|
327
|
+
...old,
|
|
328
|
+
],
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
if (result.kind === 'needs_mfa') {
|
|
332
|
+
return {
|
|
333
|
+
action: 'needs_mfa',
|
|
334
|
+
attemptId: result.attemptId,
|
|
335
|
+
status: result.status,
|
|
336
|
+
cookies: clearOld(cookies),
|
|
337
|
+
continuationUrl: (url) => {
|
|
338
|
+
const next = new URL(url);
|
|
339
|
+
next.searchParams.set('__atlas_attempt', result.attemptId);
|
|
340
|
+
next.searchParams.set('__atlas_status', result.status);
|
|
341
|
+
return next.toString();
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
return { action: 'refused', outcome: result.outcome, cookies: FINAL.includes(result.outcome) ? clearOld(cookies) : [] };
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** The client IP a proxy in front of your server recorded (first X-Forwarded-For hop, or X-Real-IP). */
|
|
349
|
+
function clientIpFrom(headers) {
|
|
350
|
+
const xff = header(headers, 'x-forwarded-for');
|
|
351
|
+
const first = xff?.split(',')[0]?.trim();
|
|
352
|
+
return first || header(headers, 'x-real-ip')?.trim() || undefined;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=migration-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-bridge.js","sourceRoot":"","sources":["../src/migration-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.G3_BRIDGE_PRESETS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Bridge presets for Firebase / Identity Platform, Supabase, Amazon Cognito,
|
|
6
|
+
* Azure AD B2C, Entra External ID, Appwrite, PocketBase and Nhost, checked against each vendor's
|
|
7
|
+
* token documentation. Registered (replacing the starters) at the end of
|
|
8
|
+
* migration-presets.ts; only a type is imported from there, so there is no
|
|
9
|
+
* import cycle at runtime.
|
|
10
|
+
*
|
|
11
|
+
* A vendor whose browser SDK keeps the session in localStorage / IndexedDB
|
|
12
|
+
* (Firebase, Amplify, MSAL, Supabase SPA, Nhost) has no cookie for a server
|
|
13
|
+
* middleware to read: the browser helpers in `@atlasauth/js`
|
|
14
|
+
* (`exchangeMigrationBrowserSession` with the vendor readers) pick the token up
|
|
15
|
+
* there and call the Frontend API exchange.
|
|
16
|
+
*/
|
|
17
|
+
/** Short-lived vendor tokens nobody refreshes after the switch: accept them (once) for a week past `exp`. */
|
|
18
|
+
const WEEK = 7 * 24 * 3600;
|
|
19
|
+
exports.G3_BRIDGE_PRESETS = [
|
|
20
|
+
{
|
|
21
|
+
id: 'firebase',
|
|
22
|
+
label: 'Firebase Authentication / Identity Platform (ID tokens)',
|
|
23
|
+
mode: 'jwt',
|
|
24
|
+
vars: { project_id: 'Firebase / Google Cloud project id' },
|
|
25
|
+
jwt: {
|
|
26
|
+
issuer: 'https://securetoken.google.com/{project_id}',
|
|
27
|
+
keysUrl: 'https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com',
|
|
28
|
+
audience: ['{project_id}'],
|
|
29
|
+
algorithms: ['RS256'],
|
|
30
|
+
// `sub` and `user_id` both carry the uid. Firebase ID tokens have no jti:
|
|
31
|
+
// the whole token is spent in the single-use ledger.
|
|
32
|
+
claims: { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name' },
|
|
33
|
+
// ID tokens live an hour and the Firebase SDK refreshes them; after the switch nothing does.
|
|
34
|
+
expiredGraceSeconds: WEEK,
|
|
35
|
+
},
|
|
36
|
+
// Firebase keeps sessions in IndexedDB; `__session` is the cookie apps behind
|
|
37
|
+
// Firebase Hosting conventionally copy the ID token into.
|
|
38
|
+
cookies: ['__session'],
|
|
39
|
+
sharesAtlasCookie: true,
|
|
40
|
+
bearer: true,
|
|
41
|
+
notes: 'Identity Platform tenants sign with the same issuer (the tenant is the firebase.tenant claim); export each tenant into its own organization. Browser sessions (IndexedDB) are exchanged with readFirebaseBrowserSession from @atlasauth/js.',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'firebase_session_cookie',
|
|
45
|
+
label: 'Firebase session cookies (Admin SDK createSessionCookie)',
|
|
46
|
+
mode: 'jwt',
|
|
47
|
+
vars: { project_id: 'Firebase / Google Cloud project id' },
|
|
48
|
+
defaults: { cookie_name: 'session' },
|
|
49
|
+
jwt: {
|
|
50
|
+
issuer: 'https://session.firebase.google.com/{project_id}',
|
|
51
|
+
keysUrl: 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys',
|
|
52
|
+
keysFormat: 'x509',
|
|
53
|
+
audience: ['{project_id}'],
|
|
54
|
+
algorithms: ['RS256'],
|
|
55
|
+
claims: { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name' },
|
|
56
|
+
},
|
|
57
|
+
cookies: ['{cookie_name}', '__session'],
|
|
58
|
+
sharesAtlasCookie: true,
|
|
59
|
+
notes: 'Session cookies live up to two weeks and verify against the x509 key map; set cookie_name when your app named it something else.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'supabase',
|
|
63
|
+
label: 'Supabase Auth (hosted)',
|
|
64
|
+
mode: 'jwt',
|
|
65
|
+
vars: { project_ref: 'Project ref (the subdomain of <ref>.supabase.co)' },
|
|
66
|
+
jwt: {
|
|
67
|
+
issuer: 'https://{project_ref}.supabase.co/auth/v1',
|
|
68
|
+
keysUrl: 'https://{project_ref}.supabase.co/auth/v1/.well-known/jwks.json',
|
|
69
|
+
audience: ['authenticated'],
|
|
70
|
+
// ES256/RS256 with the new signing keys; HS256 with the legacy JWT secret (stored in the bridge settings).
|
|
71
|
+
algorithms: ['ES256', 'RS256', 'HS256'],
|
|
72
|
+
// `amr` is a list of { method, timestamp } objects and `aal` a level, so
|
|
73
|
+
// the second factor is not mapped: Atlas applies its own MFA policy.
|
|
74
|
+
claims: { subject: 'sub', email: 'email', sessionKey: 'session_id' },
|
|
75
|
+
expiredGraceSeconds: WEEK,
|
|
76
|
+
allowSharedSecret: true,
|
|
77
|
+
},
|
|
78
|
+
cookies: ['sb-{project_ref}-auth-token'],
|
|
79
|
+
tokenFormat: 'supabase',
|
|
80
|
+
clearCookies: ['sb-{project_ref}-auth-token', 'sb-{project_ref}-auth-token.*', 'sb-{project_ref}-auth-token-code-verifier'],
|
|
81
|
+
bearer: true,
|
|
82
|
+
notes: 'Anonymous users (is_anonymous) are refused like any user the import did not create.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'supabase_refresh_token',
|
|
86
|
+
label: 'Supabase Auth (refresh tokens from a dump)',
|
|
87
|
+
mode: 'session_table',
|
|
88
|
+
vars: { project_ref: 'Project ref (the subdomain of <ref>.supabase.co)' },
|
|
89
|
+
// The export keys each live auth.refresh_tokens row by sha256(token): the
|
|
90
|
+
// refresh token in the SSR cookie finds it however long the user was away
|
|
91
|
+
// (the supabase JWT preset covers access tokens up to a week past expiry).
|
|
92
|
+
cookies: ['sb-{project_ref}-auth-token'],
|
|
93
|
+
tokenFormat: 'supabase_refresh',
|
|
94
|
+
clearCookies: ['sb-{project_ref}-auth-token', 'sb-{project_ref}-auth-token.*', 'sb-{project_ref}-auth-token-code-verifier'],
|
|
95
|
+
notes: 'Needs a dump of auth.refresh_tokens taken close to cutover. Refresh tokens Supabase issued after the dump are not known: keep the supabase preset for those, or re-import.',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: 'supabase_self_hosted',
|
|
99
|
+
label: 'Supabase Auth (self-hosted or custom domain)',
|
|
100
|
+
mode: 'jwt',
|
|
101
|
+
vars: { auth_url: 'The Auth URL (https://db.example.com/auth/v1)', cookie_name: 'The SSR cookie name (sb-<first label of the host>-auth-token)' },
|
|
102
|
+
jwt: {
|
|
103
|
+
issuer: '{auth_url}',
|
|
104
|
+
keysUrl: '{auth_url}/.well-known/jwks.json',
|
|
105
|
+
audience: ['authenticated'],
|
|
106
|
+
algorithms: ['ES256', 'RS256', 'HS256'],
|
|
107
|
+
claims: { subject: 'sub', email: 'email', sessionKey: 'session_id' },
|
|
108
|
+
expiredGraceSeconds: WEEK,
|
|
109
|
+
allowSharedSecret: true,
|
|
110
|
+
},
|
|
111
|
+
cookies: ['{cookie_name}'],
|
|
112
|
+
tokenFormat: 'supabase',
|
|
113
|
+
clearCookies: ['{cookie_name}', '{cookie_name}.*'],
|
|
114
|
+
bearer: true,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 'cognito',
|
|
118
|
+
label: 'Amazon Cognito (ID tokens)',
|
|
119
|
+
mode: 'jwt',
|
|
120
|
+
vars: { region: 'AWS region (us-east-1)', user_pool_id: 'User pool id (us-east-1_AbCdEf)', client_id: 'App client id' },
|
|
121
|
+
jwt: {
|
|
122
|
+
issuer: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}',
|
|
123
|
+
keysUrl: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json',
|
|
124
|
+
// ID tokens carry aud = the app client id (access tokens carry client_id and no aud).
|
|
125
|
+
audience: ['{client_id}'],
|
|
126
|
+
algorithms: ['RS256'],
|
|
127
|
+
claims: { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'origin_jti' },
|
|
128
|
+
// ID tokens live an hour by default; Amplify refreshed them.
|
|
129
|
+
expiredGraceSeconds: WEEK,
|
|
130
|
+
},
|
|
131
|
+
// @aws-amplify/adapter-nextjs keeps the tokens in cookies named like Amplify's localStorage keys.
|
|
132
|
+
cookies: ['CognitoIdentityServiceProvider.{client_id}.*.idToken'],
|
|
133
|
+
clearCookies: ['CognitoIdentityServiceProvider.{client_id}.*'],
|
|
134
|
+
bearer: true,
|
|
135
|
+
notes: 'Users are matched on sub (the export keys users by sub). SPA sessions in localStorage are exchanged with readAmplifyBrowserSession from @atlasauth/js.',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: 'azure_ad_b2c',
|
|
139
|
+
label: 'Azure AD B2C (ID tokens)',
|
|
140
|
+
mode: 'jwt',
|
|
141
|
+
vars: {
|
|
142
|
+
tenant: 'Tenant name (contoso for contoso.b2clogin.com)',
|
|
143
|
+
tenant_id: 'Directory (tenant) id GUID',
|
|
144
|
+
policy: 'The user flow / custom policy that issued the tokens (B2C_1_signupsignin)',
|
|
145
|
+
client_id: 'Application (client) id',
|
|
146
|
+
},
|
|
147
|
+
jwt: {
|
|
148
|
+
issuer: 'https://{tenant}.b2clogin.com/{tenant_id}/v2.0/',
|
|
149
|
+
keysUrl: 'https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/discovery/v2.0/keys',
|
|
150
|
+
audience: ['{client_id}'],
|
|
151
|
+
algorithms: ['RS256'],
|
|
152
|
+
// B2C's sub is the user's object id by default, which the Graph export uses as the user id.
|
|
153
|
+
claims: { subject: 'sub', name: 'name' },
|
|
154
|
+
expiredGraceSeconds: WEEK,
|
|
155
|
+
},
|
|
156
|
+
cookies: [],
|
|
157
|
+
bearer: true,
|
|
158
|
+
notes: 'Keys are published per policy: run one bridge per user flow that issued tokens. MSAL keeps tokens in browser storage (encrypted from msal-browser v4): exchange v2/v3 caches with readMsalBrowserSession from @atlasauth/js; v4 apps rely on lazy migration.',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'entra_external_id',
|
|
162
|
+
label: 'Microsoft Entra External ID (ID tokens)',
|
|
163
|
+
mode: 'jwt',
|
|
164
|
+
vars: {
|
|
165
|
+
tenant: 'Tenant subdomain (contoso for contoso.ciamlogin.com)',
|
|
166
|
+
tenant_id: 'Directory (tenant) id GUID',
|
|
167
|
+
client_id: 'Application (client) id',
|
|
168
|
+
},
|
|
169
|
+
jwt: {
|
|
170
|
+
issuer: 'https://{tenant_id}.ciamlogin.com/{tenant_id}/v2.0',
|
|
171
|
+
keysUrl: 'https://{tenant}.ciamlogin.com/{tenant_id}/discovery/v2.0/keys',
|
|
172
|
+
audience: ['{client_id}'],
|
|
173
|
+
algorithms: ['RS256'],
|
|
174
|
+
// `sub` differs per application; `oid` is the directory object id the Graph export keys users by.
|
|
175
|
+
claims: { subject: 'oid', email: 'email', name: 'name', sessionKey: 'uti' },
|
|
176
|
+
expiredGraceSeconds: WEEK,
|
|
177
|
+
},
|
|
178
|
+
cookies: [],
|
|
179
|
+
bearer: true,
|
|
180
|
+
notes: 'MSAL keeps tokens in browser storage (encrypted from msal-browser v4): exchange v2/v3 caches with readMsalBrowserSession from @atlasauth/js.',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: 'appwrite',
|
|
184
|
+
label: 'Appwrite (session cookie, checked with Appwrite)',
|
|
185
|
+
mode: 'remote',
|
|
186
|
+
vars: { endpoint_url: 'API endpoint including /v1 (https://cloud.appwrite.io/v1, or your own)', project_id: 'Project id' },
|
|
187
|
+
// Appwrite keeps only a hash of each session secret, so sessions cannot be
|
|
188
|
+
// exported or verified offline: Atlas asks Appwrite who the session is. The
|
|
189
|
+
// cookie value (base64 of {id, secret}) is what X-Appwrite-Session takes.
|
|
190
|
+
remote: {
|
|
191
|
+
url: '{endpoint_url}/account',
|
|
192
|
+
method: 'GET',
|
|
193
|
+
headers: { 'x-appwrite-project': '{project_id}', 'x-appwrite-session': '{token}' },
|
|
194
|
+
subjectPath: '$id',
|
|
195
|
+
emailPath: 'email',
|
|
196
|
+
emailVerifiedPath: 'emailVerification',
|
|
197
|
+
namePath: 'name',
|
|
198
|
+
},
|
|
199
|
+
// a_session_<project id, lowercased> and its _legacy twin.
|
|
200
|
+
cookies: ['a_session_*'],
|
|
201
|
+
notes: 'The browser must send the Appwrite cookie to your app, so this works when Appwrite is on a subdomain of your app (custom domain) or your app does SSR with the session secret in its own cookie (pass its name as cookieNames). Client-only apps keep the session in localStorage (cookieFallback): exchange it with readAppwriteBrowserSession from @atlasauth/js. Keep the Appwrite project running for the bridge window.',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
id: 'pocketbase',
|
|
205
|
+
label: 'PocketBase (auth token, checked with PocketBase)',
|
|
206
|
+
mode: 'remote',
|
|
207
|
+
vars: { url: 'PocketBase URL (https://pb.example.com)' },
|
|
208
|
+
defaults: { collection: 'users' },
|
|
209
|
+
// Tokens are signed with a per-user tokenKey plus a per-collection secret, so
|
|
210
|
+
// nothing outside PocketBase can verify one: auth-refresh vouches for it.
|
|
211
|
+
remote: {
|
|
212
|
+
url: '{url}/api/collections/{collection}/auth-refresh',
|
|
213
|
+
method: 'POST',
|
|
214
|
+
headers: { authorization: '{token}' },
|
|
215
|
+
subjectPath: 'record.id',
|
|
216
|
+
emailPath: 'record.email',
|
|
217
|
+
emailVerifiedPath: 'record.verified',
|
|
218
|
+
namePath: 'record.name',
|
|
219
|
+
},
|
|
220
|
+
// pb_auth is the cookie the JS SDK's authStore.exportToCookie() writes (JSON with the token).
|
|
221
|
+
cookies: ['pb_auth'],
|
|
222
|
+
tokenFormat: 'pocketbase',
|
|
223
|
+
notes: 'Client-only apps keep the token in localStorage (pocketbase_auth): exchange it with readPocketBaseBrowserSession from @atlasauth/js. Keep PocketBase running for the bridge window.',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: 'nhost',
|
|
227
|
+
label: 'Nhost (refresh tokens)',
|
|
228
|
+
mode: 'session_table',
|
|
229
|
+
// The export stores sha256(refresh token) — exactly what auth.refresh_tokens keeps.
|
|
230
|
+
cookies: ['nhostRefreshToken'],
|
|
231
|
+
clearCookies: ['nhostRefreshToken', 'nhostRefreshTokenExpiresAt', 'nhostSession'],
|
|
232
|
+
notes: 'SPA sessions keep the refresh token in localStorage (nhostRefreshToken): exchange them with readNhostBrowserSession from @atlasauth/js.',
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: 'nhost_jwt',
|
|
236
|
+
label: 'Nhost (access tokens)',
|
|
237
|
+
mode: 'jwt',
|
|
238
|
+
vars: { auth_url: 'The Auth URL (https://<subdomain>.auth.<region>.nhost.run/v1)' },
|
|
239
|
+
// Legacy Hasura Auth signs with iss "hasura-auth"; current versions use the server URL.
|
|
240
|
+
defaults: { issuer: 'hasura-auth' },
|
|
241
|
+
jwt: {
|
|
242
|
+
issuer: '{issuer}',
|
|
243
|
+
keysUrl: '{auth_url}/.well-known/jwks.json',
|
|
244
|
+
algorithms: ['RS256', 'HS256', 'HS512'],
|
|
245
|
+
claims: { subject: 'sub', sessionKey: 'jti' },
|
|
246
|
+
expiredGraceSeconds: WEEK,
|
|
247
|
+
// Most projects sign with the shared HASURA_GRAPHQL_JWT_SECRET key.
|
|
248
|
+
allowSharedSecret: true,
|
|
249
|
+
},
|
|
250
|
+
cookies: [],
|
|
251
|
+
bearer: true,
|
|
252
|
+
},
|
|
253
|
+
];
|
|
254
|
+
//# sourceMappingURL=migration-presets-g3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-presets-g3.js","sourceRoot":"","sources":["../src/migration-presets-g3.ts"],"names":[],"mappings":"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"}
|