@atlasauth/backend 0.23.0 → 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 +7 -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/index.d.ts +54 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -1
- 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/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 +8 -1
- package/dist/index.js +11 -0
- 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/migration-bridge.d.ts +153 -0
- package/dist/migration-bridge.js +328 -0
- package/dist/migration-bridge.js.map +1 -0
- package/dist/migration-presets.d.ts +150 -0
- package/dist/migration-presets.js +440 -0
- package/dist/migration-presets.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ZERO-LOGOUT BRIDGE PRESETS — per vendor, how an old session is recognised.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the Atlas API (which verifies the token and resolves the user) and
|
|
6
|
+
* the SDK middleware (which knows which cookie / header carries it), so both
|
|
7
|
+
* read one table. Pure data plus a few string templates: safe on every runtime.
|
|
8
|
+
*
|
|
9
|
+
* Three modes:
|
|
10
|
+
* - `jwt`: the vendor's session (or a token inside it) is a JWT. Atlas
|
|
11
|
+
* verifies it against the vendor's issuer and keys (JWKS, or an X.509 map
|
|
12
|
+
* like Firebase session cookies use), maps `claims.subject` to the imported
|
|
13
|
+
* user (`external_id` = the source user id), and spends `claims.sessionKey`
|
|
14
|
+
* (`jti` / `sid`, falling back to the whole token) in the single-use ledger.
|
|
15
|
+
* - `session_table`: an opaque token; Atlas looks up sha256(token) among the
|
|
16
|
+
* sessions imported in the migration bundle.
|
|
17
|
+
* - `remote`: the vendor's session can only be checked by asking the vendor
|
|
18
|
+
* with the user's own token (Appwrite, PocketBase): Atlas calls
|
|
19
|
+
* `remote.url` with the token filled into `{token}` and reads the subject
|
|
20
|
+
* (and profile) from the JSON answer by dot path.
|
|
21
|
+
*
|
|
22
|
+
* Templates use `{var}` placeholders filled from the bridge settings'
|
|
23
|
+
* `preset_vars` (e.g. `{domain}`, `{region}`); {@link resolveMigrationBridgePreset}
|
|
24
|
+
* refuses a template with a missing variable.
|
|
25
|
+
*
|
|
26
|
+
* Vendor tracks register their preset (or refine the starter below) with
|
|
27
|
+
* {@link registerMigrationBridgePreset}; a test checks every preset resolves.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.PresetVariableError = void 0;
|
|
31
|
+
exports.registerMigrationBridgePreset = registerMigrationBridgePreset;
|
|
32
|
+
exports.getMigrationBridgePreset = getMigrationBridgePreset;
|
|
33
|
+
exports.listMigrationBridgePresets = listMigrationBridgePresets;
|
|
34
|
+
exports.resolveMigrationBridgePreset = resolveMigrationBridgePreset;
|
|
35
|
+
exports.cookieNameMatches = cookieNameMatches;
|
|
36
|
+
const OIDC_ALGS = ['RS256', 'RS384', 'RS512', 'PS256', 'ES256', 'ES384', 'EdDSA'];
|
|
37
|
+
const presets = new Map();
|
|
38
|
+
function registerMigrationBridgePreset(preset, options = {}) {
|
|
39
|
+
if (!/^[a-z0-9_]+$/.test(preset.id))
|
|
40
|
+
throw new Error(`Invalid bridge preset id "${preset.id}".`);
|
|
41
|
+
if (presets.has(preset.id) && !options.replace)
|
|
42
|
+
throw new Error(`Bridge preset "${preset.id}" is already registered.`);
|
|
43
|
+
if (preset.mode === 'jwt' && !preset.jwt)
|
|
44
|
+
throw new Error(`Bridge preset "${preset.id}" is mode jwt but has no jwt settings.`);
|
|
45
|
+
if (preset.mode === 'remote' && !preset.remote)
|
|
46
|
+
throw new Error(`Bridge preset "${preset.id}" is mode remote but has no remote settings.`);
|
|
47
|
+
presets.set(preset.id, preset);
|
|
48
|
+
}
|
|
49
|
+
function getMigrationBridgePreset(id) {
|
|
50
|
+
return presets.get(id);
|
|
51
|
+
}
|
|
52
|
+
function listMigrationBridgePresets() {
|
|
53
|
+
return [...presets.values()];
|
|
54
|
+
}
|
|
55
|
+
class PresetVariableError extends Error {
|
|
56
|
+
variable;
|
|
57
|
+
constructor(variable, message) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.variable = variable;
|
|
60
|
+
this.name = 'PresetVariableError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.PresetVariableError = PresetVariableError;
|
|
64
|
+
/** A preset variable must be a plain value: no scheme, path tricks or whitespace sneak into a URL. */
|
|
65
|
+
const VAR_VALUE = /^[A-Za-z0-9._:\-/]{1,253}$/;
|
|
66
|
+
function fill(template, vars) {
|
|
67
|
+
return template.replace(/\{([a-z_]+)\}/g, (match, name) => {
|
|
68
|
+
// `{token}` is the presented session token, filled by the server at call time.
|
|
69
|
+
if (name === 'token')
|
|
70
|
+
return match;
|
|
71
|
+
const v = vars[name];
|
|
72
|
+
if (v === undefined || v === '')
|
|
73
|
+
throw new PresetVariableError(name, `The preset needs "${name}".`);
|
|
74
|
+
return v;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fill a preset's templates. Throws {@link PresetVariableError} for a missing or
|
|
79
|
+
* malformed variable. Values are trimmed; a trailing slash on a URL-ish value
|
|
80
|
+
* is removed (`https://example.com/` → `https://example.com`).
|
|
81
|
+
*/
|
|
82
|
+
function resolveMigrationBridgePreset(id, rawVars = {}) {
|
|
83
|
+
const p = presets.get(id);
|
|
84
|
+
if (!p)
|
|
85
|
+
throw new PresetVariableError('preset', `Unknown bridge preset "${id}".`);
|
|
86
|
+
const vars = { ...(p.defaults ?? {}) };
|
|
87
|
+
for (const [k, v] of Object.entries(rawVars)) {
|
|
88
|
+
if (typeof v !== 'string')
|
|
89
|
+
continue;
|
|
90
|
+
const value = v.trim().replace(/\/+$/, '');
|
|
91
|
+
if (!value)
|
|
92
|
+
continue;
|
|
93
|
+
// Base URLs (`base_url`, `issuer`, `*_url`) keep their https scheme; every
|
|
94
|
+
// other variable is a bare value (a pasted `https://` is dropped, so
|
|
95
|
+
// `https://{domain}/` never doubles it).
|
|
96
|
+
const bare = value.replace(/^https:\/\//, '');
|
|
97
|
+
if (!VAR_VALUE.test(bare) || bare.includes('..') || bare.includes('//'))
|
|
98
|
+
throw new PresetVariableError(k, `"${k}" has characters a ${p.label} value never has.`);
|
|
99
|
+
const keepsScheme = k === 'issuer' || k.endsWith('url');
|
|
100
|
+
if (keepsScheme && !value.startsWith('https://'))
|
|
101
|
+
throw new PresetVariableError(k, `"${k}" must be an https URL.`);
|
|
102
|
+
vars[k] = keepsScheme ? value : bare;
|
|
103
|
+
}
|
|
104
|
+
const jwt = p.jwt;
|
|
105
|
+
return {
|
|
106
|
+
preset: p.id,
|
|
107
|
+
mode: p.mode,
|
|
108
|
+
issuer: jwt ? fill(jwt.issuer, vars) : null,
|
|
109
|
+
keysUrl: jwt?.keysUrl ? fill(jwt.keysUrl, vars) : null,
|
|
110
|
+
keysFormat: jwt?.keysFormat ?? 'jwks',
|
|
111
|
+
audience: jwt?.audience?.length ? jwt.audience.map((a) => fill(a, vars)) : null,
|
|
112
|
+
algorithms: jwt?.algorithms ?? [],
|
|
113
|
+
claims: jwt?.claims ?? { subject: 'sub' },
|
|
114
|
+
expiredGraceSeconds: jwt?.expiredGraceSeconds ?? 0,
|
|
115
|
+
cookies: p.cookies.map((c) => fill(c, vars)),
|
|
116
|
+
tokenFormat: p.tokenFormat ?? 'raw',
|
|
117
|
+
bearer: p.bearer === true,
|
|
118
|
+
clearCookies: (p.clearCookies ?? p.cookies).map((c) => fill(c, vars)),
|
|
119
|
+
sharesAtlasCookie: p.sharesAtlasCookie === true,
|
|
120
|
+
remote: p.remote
|
|
121
|
+
? {
|
|
122
|
+
...p.remote,
|
|
123
|
+
url: fill(p.remote.url, vars),
|
|
124
|
+
...(p.remote.headers ? { headers: Object.fromEntries(Object.entries(p.remote.headers).map(([k, v]) => [k, fill(v, vars)])) } : {}),
|
|
125
|
+
...(p.remote.body !== undefined ? { body: fill(p.remote.body, vars) } : {}),
|
|
126
|
+
}
|
|
127
|
+
: null,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// ── the starter presets ─────────────────────────────────────────────────────
|
|
131
|
+
const OIDC_CLAIMS = { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'jti', mfa: 'amr:mfa' };
|
|
132
|
+
for (const preset of [
|
|
133
|
+
{
|
|
134
|
+
id: 'oidc',
|
|
135
|
+
label: 'Any OpenID Connect provider',
|
|
136
|
+
mode: 'jwt',
|
|
137
|
+
vars: { issuer: 'The issuer URL (keys are found by OIDC discovery)' },
|
|
138
|
+
jwt: { issuer: '{issuer}', algorithms: OIDC_ALGS, claims: OIDC_CLAIMS },
|
|
139
|
+
cookies: [],
|
|
140
|
+
bearer: true,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: 'auth0',
|
|
144
|
+
label: 'Auth0',
|
|
145
|
+
mode: 'jwt',
|
|
146
|
+
vars: {
|
|
147
|
+
domain: 'Your Auth0 domain (tenant.us.auth0.com, or the custom domain your tokens are issued from)',
|
|
148
|
+
client_id: 'The application client id (the ID token audience)',
|
|
149
|
+
},
|
|
150
|
+
defaults: {},
|
|
151
|
+
jwt: {
|
|
152
|
+
issuer: 'https://{domain}/',
|
|
153
|
+
keysUrl: 'https://{domain}/.well-known/jwks.json',
|
|
154
|
+
// The bridge exchanges the ID token from the app session: its audience is the client id.
|
|
155
|
+
audience: ['{client_id}'],
|
|
156
|
+
algorithms: ['RS256', 'PS256'],
|
|
157
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid' },
|
|
158
|
+
// ID tokens live 10 hours by default while the app session rolls for days;
|
|
159
|
+
// nothing renews the ID token once Auth0's SDK stops running.
|
|
160
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
161
|
+
},
|
|
162
|
+
cookies: ['__session', 'appSession'],
|
|
163
|
+
// nextjs-auth0 v4 chunks a large session as __session__0, __session__1; v3 and
|
|
164
|
+
// express-openid-connect as appSession.0, appSession.1.
|
|
165
|
+
clearCookies: ['__session', '__session__*', 'appSession', 'appSession.*', 'auth_verification', '__txn_*'],
|
|
166
|
+
sharesAtlasCookie: true,
|
|
167
|
+
bearer: true,
|
|
168
|
+
notes: 'The nextjs-auth0 / express-openid-connect session cookie is encrypted with your AUTH0_SECRET: use auth0SessionTokenExtractor({ secret }) from @atlasauth/backend as the middleware extractToken so it is opened on your server and its ID token exchanged.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'clerk',
|
|
172
|
+
label: 'Clerk',
|
|
173
|
+
mode: 'jwt',
|
|
174
|
+
vars: { frontend_api: 'Your Clerk Frontend API host (clerk.example.com or xxx.clerk.accounts.dev — the host your publishable key encodes)' },
|
|
175
|
+
jwt: {
|
|
176
|
+
issuer: 'https://{frontend_api}',
|
|
177
|
+
keysUrl: 'https://{frontend_api}/.well-known/jwks.json',
|
|
178
|
+
algorithms: ['RS256'],
|
|
179
|
+
claims: { subject: 'sub', sessionKey: 'sid', email: 'email' },
|
|
180
|
+
// Clerk session tokens live 60 seconds and are refreshed by clerk-js, which no longer runs after the switch.
|
|
181
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
182
|
+
},
|
|
183
|
+
cookies: ['__session'],
|
|
184
|
+
// Clerk also sets suffixed copies (__session_<suffix>, __client_uat_<suffix>) on newer SDKs.
|
|
185
|
+
clearCookies: ['__session', '__session_*', '__client_uat', '__client_uat_*', '__clerk_db_jwt', '__clerk_db_jwt_*', '__refresh_*'],
|
|
186
|
+
sharesAtlasCookie: true,
|
|
187
|
+
bearer: true,
|
|
188
|
+
notes: 'Clerk session tokens are exchanged up to 7 days after they expire (each one once): run the bridge from the day you switch. Clerk\'s __client cookie lives on the Frontend API domain and is never readable by your app.',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: 'cognito',
|
|
192
|
+
label: 'Amazon Cognito',
|
|
193
|
+
mode: 'jwt',
|
|
194
|
+
vars: { region: 'AWS region (us-east-1)', user_pool_id: 'User pool id (us-east-1_AbCdEf)', client_id: 'App client id' },
|
|
195
|
+
jwt: {
|
|
196
|
+
issuer: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}',
|
|
197
|
+
keysUrl: 'https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json',
|
|
198
|
+
audience: ['{client_id}'],
|
|
199
|
+
algorithms: ['RS256'],
|
|
200
|
+
claims: { subject: 'sub', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'origin_jti' },
|
|
201
|
+
},
|
|
202
|
+
cookies: ['CognitoIdentityServiceProvider.{client_id}.*.idToken'],
|
|
203
|
+
clearCookies: ['CognitoIdentityServiceProvider.{client_id}.*'],
|
|
204
|
+
bearer: true,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'firebase',
|
|
208
|
+
label: 'Firebase Authentication',
|
|
209
|
+
mode: 'jwt',
|
|
210
|
+
vars: { project_id: 'Firebase project id' },
|
|
211
|
+
jwt: {
|
|
212
|
+
issuer: 'https://securetoken.google.com/{project_id}',
|
|
213
|
+
keysUrl: 'https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com',
|
|
214
|
+
audience: ['{project_id}'],
|
|
215
|
+
algorithms: ['RS256'],
|
|
216
|
+
claims: { subject: 'user_id', email: 'email', emailVerified: 'email_verified', name: 'name', sessionKey: 'jti' },
|
|
217
|
+
},
|
|
218
|
+
cookies: ['__session'],
|
|
219
|
+
sharesAtlasCookie: true,
|
|
220
|
+
bearer: true,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'firebase_session_cookie',
|
|
224
|
+
label: 'Firebase session cookies',
|
|
225
|
+
mode: 'jwt',
|
|
226
|
+
vars: { project_id: 'Firebase project id' },
|
|
227
|
+
jwt: {
|
|
228
|
+
issuer: 'https://session.firebase.google.com/{project_id}',
|
|
229
|
+
keysUrl: 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys',
|
|
230
|
+
keysFormat: 'x509',
|
|
231
|
+
audience: ['{project_id}'],
|
|
232
|
+
algorithms: ['RS256'],
|
|
233
|
+
claims: { subject: 'user_id', email: 'email', emailVerified: 'email_verified', name: 'name' },
|
|
234
|
+
},
|
|
235
|
+
cookies: ['__session', 'session'],
|
|
236
|
+
sharesAtlasCookie: true,
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 'supabase',
|
|
240
|
+
label: 'Supabase Auth',
|
|
241
|
+
mode: 'jwt',
|
|
242
|
+
vars: { project_ref: 'Project ref (the subdomain of <ref>.supabase.co)' },
|
|
243
|
+
jwt: {
|
|
244
|
+
issuer: 'https://{project_ref}.supabase.co/auth/v1',
|
|
245
|
+
keysUrl: 'https://{project_ref}.supabase.co/auth/v1/.well-known/jwks.json',
|
|
246
|
+
audience: ['authenticated'],
|
|
247
|
+
algorithms: ['ES256', 'RS256', 'HS256'],
|
|
248
|
+
claims: { subject: 'sub', email: 'email', sessionKey: 'session_id', mfa: 'claim:aal2' },
|
|
249
|
+
// The access token lives an hour; supabase-js refreshes it, which no longer happens after the switch.
|
|
250
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
251
|
+
allowSharedSecret: true,
|
|
252
|
+
},
|
|
253
|
+
cookies: ['sb-{project_ref}-auth-token'],
|
|
254
|
+
tokenFormat: 'supabase',
|
|
255
|
+
clearCookies: ['sb-{project_ref}-auth-token', 'sb-{project_ref}-auth-token.*'],
|
|
256
|
+
bearer: true,
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'workos',
|
|
260
|
+
label: 'WorkOS AuthKit',
|
|
261
|
+
mode: 'jwt',
|
|
262
|
+
vars: { client_id: 'WorkOS client id (client_…)' },
|
|
263
|
+
jwt: {
|
|
264
|
+
issuer: 'https://api.workos.com/user_management/{client_id}',
|
|
265
|
+
keysUrl: 'https://api.workos.com/sso/jwks/{client_id}',
|
|
266
|
+
algorithms: ['RS256'],
|
|
267
|
+
claims: { subject: 'sub', sessionKey: 'sid' },
|
|
268
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
269
|
+
},
|
|
270
|
+
cookies: ['wos-session'],
|
|
271
|
+
notes: 'The wos-session cookie is sealed with your WORKOS_COOKIE_PASSWORD: pass the middleware a token extractor that unseals it locally and returns the access token.',
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
id: 'okta',
|
|
275
|
+
label: 'Okta',
|
|
276
|
+
mode: 'jwt',
|
|
277
|
+
vars: { domain: 'Your Okta domain (example.okta.com)' },
|
|
278
|
+
defaults: { auth_server: 'default', audience: 'api://default' },
|
|
279
|
+
jwt: {
|
|
280
|
+
// A custom authorization server: org-server access tokens are opaque to anyone but Okta.
|
|
281
|
+
issuer: 'https://{domain}/oauth2/{auth_server}',
|
|
282
|
+
keysUrl: 'https://{domain}/oauth2/{auth_server}/v1/keys',
|
|
283
|
+
audience: ['{audience}'],
|
|
284
|
+
algorithms: ['RS256'],
|
|
285
|
+
// Access tokens carry the login in `sub` and the Okta user id in `uid`.
|
|
286
|
+
claims: { ...OIDC_CLAIMS, subject: 'uid', sessionKey: 'jti' },
|
|
287
|
+
},
|
|
288
|
+
// okta-auth-js keeps tokens in browser storage, not cookies: API calls carry them as bearer tokens.
|
|
289
|
+
cookies: [],
|
|
290
|
+
bearer: true,
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
id: 'stytch',
|
|
294
|
+
label: 'Stytch',
|
|
295
|
+
mode: 'jwt',
|
|
296
|
+
vars: { project_id: 'Stytch project id (project-live-…)' },
|
|
297
|
+
defaults: { api_host: 'api.stytch.com' },
|
|
298
|
+
jwt: {
|
|
299
|
+
issuer: 'stytch.com/{project_id}',
|
|
300
|
+
keysUrl: 'https://{api_host}/v1/sessions/jwks/{project_id}',
|
|
301
|
+
audience: ['{project_id}'],
|
|
302
|
+
algorithms: ['RS256'],
|
|
303
|
+
claims: { subject: 'sub', sessionKey: 'https://stytch.com/session' },
|
|
304
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
305
|
+
},
|
|
306
|
+
cookies: ['stytch_session_jwt'],
|
|
307
|
+
clearCookies: ['stytch_session_jwt', 'stytch_session'],
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
id: 'keycloak',
|
|
311
|
+
label: 'Keycloak',
|
|
312
|
+
mode: 'jwt',
|
|
313
|
+
vars: { base_url: 'Keycloak base URL (https://sso.example.com)', realm: 'Realm name' },
|
|
314
|
+
jwt: {
|
|
315
|
+
issuer: '{base_url}/realms/{realm}',
|
|
316
|
+
keysUrl: '{base_url}/realms/{realm}/protocol/openid-connect/certs',
|
|
317
|
+
algorithms: ['RS256', 'ES256', 'PS256'],
|
|
318
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid', mfa: 'acr:2' },
|
|
319
|
+
},
|
|
320
|
+
cookies: [],
|
|
321
|
+
bearer: true,
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
id: 'fusionauth',
|
|
325
|
+
label: 'FusionAuth',
|
|
326
|
+
mode: 'jwt',
|
|
327
|
+
vars: { base_url: 'FusionAuth URL (https://auth.example.com)' },
|
|
328
|
+
defaults: {},
|
|
329
|
+
jwt: {
|
|
330
|
+
issuer: '{base_url}',
|
|
331
|
+
keysUrl: '{base_url}/.well-known/jwks.json',
|
|
332
|
+
algorithms: ['RS256', 'ES256'],
|
|
333
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'sid' },
|
|
334
|
+
},
|
|
335
|
+
cookies: ['app.at'],
|
|
336
|
+
clearCookies: ['app.at', 'app.rt', 'app.idt'],
|
|
337
|
+
bearer: true,
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
id: 'kinde',
|
|
341
|
+
label: 'Kinde',
|
|
342
|
+
mode: 'jwt',
|
|
343
|
+
vars: { domain: 'Your Kinde domain (example.kinde.com, or your custom domain)' },
|
|
344
|
+
jwt: {
|
|
345
|
+
issuer: 'https://{domain}',
|
|
346
|
+
keysUrl: 'https://{domain}/.well-known/jwks',
|
|
347
|
+
algorithms: ['RS256'],
|
|
348
|
+
claims: { ...OIDC_CLAIMS, sessionKey: 'jti' },
|
|
349
|
+
// The Kinde SDK refreshes its access token; nothing does after the switch.
|
|
350
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
351
|
+
},
|
|
352
|
+
// The Kinde Next.js SDK keeps the raw tokens in these cookies.
|
|
353
|
+
cookies: ['access_token', 'id_token'],
|
|
354
|
+
clearCookies: ['access_token', 'id_token', 'refresh_token', 'refresh_token_*', 'ac-state-key', 'user', 'post_login_redirect_url'],
|
|
355
|
+
bearer: true,
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: 'descope',
|
|
359
|
+
label: 'Descope',
|
|
360
|
+
mode: 'jwt',
|
|
361
|
+
vars: { project_id: 'Descope project id (P…)' },
|
|
362
|
+
defaults: { base_url: 'https://api.descope.com' },
|
|
363
|
+
jwt: {
|
|
364
|
+
// Newer projects issue `https://api.descope.com/<project id>`; older ones the
|
|
365
|
+
// bare project id (preset descope_project_issuer). Decode one DS token to check.
|
|
366
|
+
issuer: '{base_url}/{project_id}',
|
|
367
|
+
keysUrl: '{base_url}/v2/keys/{project_id}',
|
|
368
|
+
algorithms: ['RS256'],
|
|
369
|
+
claims: { subject: 'sub', email: 'email', mfa: 'amr:mfa' },
|
|
370
|
+
// Session tokens live minutes and are renewed from the DSR refresh token by the Descope SDK.
|
|
371
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
372
|
+
},
|
|
373
|
+
cookies: ['DS'],
|
|
374
|
+
clearCookies: ['DS', 'DSR'],
|
|
375
|
+
bearer: true,
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
id: 'descope_project_issuer',
|
|
379
|
+
label: 'Descope (project-id issuer)',
|
|
380
|
+
mode: 'jwt',
|
|
381
|
+
vars: { project_id: 'Descope project id (P…)' },
|
|
382
|
+
defaults: { base_url: 'https://api.descope.com' },
|
|
383
|
+
jwt: {
|
|
384
|
+
issuer: '{project_id}',
|
|
385
|
+
keysUrl: '{base_url}/v2/keys/{project_id}',
|
|
386
|
+
algorithms: ['RS256'],
|
|
387
|
+
claims: { subject: 'sub', email: 'email', mfa: 'amr:mfa' },
|
|
388
|
+
expiredGraceSeconds: 7 * 24 * 3600,
|
|
389
|
+
},
|
|
390
|
+
cookies: ['DS'],
|
|
391
|
+
clearCookies: ['DS', 'DSR'],
|
|
392
|
+
bearer: true,
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
id: 'frontegg',
|
|
396
|
+
label: 'Frontegg',
|
|
397
|
+
mode: 'jwt',
|
|
398
|
+
vars: { base_url: 'Your Frontegg domain (https://app-xxx.frontegg.com)' },
|
|
399
|
+
jwt: { issuer: '{base_url}', keysUrl: '{base_url}/.well-known/jwks.json', algorithms: ['RS256'], claims: { subject: 'sub', email: 'email', sessionKey: 'sid' } },
|
|
400
|
+
cookies: [],
|
|
401
|
+
bearer: true,
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
id: 'better_auth',
|
|
405
|
+
label: 'Better Auth',
|
|
406
|
+
mode: 'session_table',
|
|
407
|
+
defaults: { cookie_prefix: 'better-auth' },
|
|
408
|
+
cookies: ['__Secure-{cookie_prefix}.session_token', '{cookie_prefix}.session_token'],
|
|
409
|
+
clearCookies: [
|
|
410
|
+
'__Secure-{cookie_prefix}.session_token',
|
|
411
|
+
'__Secure-{cookie_prefix}.session_data',
|
|
412
|
+
'__Secure-{cookie_prefix}.account_data',
|
|
413
|
+
'__Secure-{cookie_prefix}.dont_remember',
|
|
414
|
+
'{cookie_prefix}.session_token',
|
|
415
|
+
'{cookie_prefix}.session_data',
|
|
416
|
+
'{cookie_prefix}.account_data',
|
|
417
|
+
'{cookie_prefix}.dont_remember',
|
|
418
|
+
],
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
id: 'authjs',
|
|
422
|
+
label: 'Auth.js (database sessions)',
|
|
423
|
+
mode: 'session_table',
|
|
424
|
+
cookies: ['__Secure-authjs.session-token', 'authjs.session-token', '__Secure-next-auth.session-token', 'next-auth.session-token'],
|
|
425
|
+
notes: 'With the JWT session strategy the cookie is encrypted with AUTH_SECRET: pass the middleware a token extractor that decrypts it locally.',
|
|
426
|
+
},
|
|
427
|
+
{ id: 'lucia', label: 'Lucia', mode: 'session_table', defaults: { cookie_name: 'auth_session' }, cookies: ['{cookie_name}'] },
|
|
428
|
+
{ id: 'ory', label: 'Ory (Kratos)', mode: 'session_table', cookies: ['ory_kratos_session', 'ory_session_*'], bearer: true },
|
|
429
|
+
{ id: 'custom', label: 'Your own sessions', mode: 'session_table', vars: { cookie_name: 'The session cookie name' }, cookies: ['{cookie_name}'] },
|
|
430
|
+
]) {
|
|
431
|
+
registerMigrationBridgePreset(preset);
|
|
432
|
+
}
|
|
433
|
+
/** Does a cookie name match a preset pattern (`*` = any run of characters)? */
|
|
434
|
+
function cookieNameMatches(pattern, name) {
|
|
435
|
+
if (!pattern.includes('*'))
|
|
436
|
+
return pattern === name;
|
|
437
|
+
const re = new RegExp(`^${pattern.split('*').map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('.*')}$`);
|
|
438
|
+
return re.test(name);
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=migration-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-presets.js","sourceRoot":"","sources":["../src/migration-presets.ts"],"names":[],"mappings":"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"}
|