@atlasauth/backend 0.22.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/auth0-session.d.ts +23 -0
  3. package/dist/auth0-session.js +80 -0
  4. package/dist/auth0-session.js.map +1 -0
  5. package/dist/better-auth.d.ts +4 -8
  6. package/dist/better-auth.js +42 -150
  7. package/dist/better-auth.js.map +1 -1
  8. package/dist/client/index.d.ts +67 -3
  9. package/dist/client/index.js +4 -0
  10. package/dist/client/index.js.map +1 -1
  11. package/dist/client/instance.d.ts +61 -1
  12. package/dist/client/instance.js +8 -0
  13. package/dist/client/instance.js.map +1 -1
  14. package/dist/client/jwt-templates.d.ts +29 -4
  15. package/dist/client/jwt-templates.js +1 -1
  16. package/dist/client/jwt-templates.js.map +1 -1
  17. package/dist/client/migrations.d.ts +286 -0
  18. package/dist/client/migrations.js +103 -0
  19. package/dist/client/migrations.js.map +1 -0
  20. package/dist/client/operator.d.ts +35 -0
  21. package/dist/client/operator.js +47 -12
  22. package/dist/client/operator.js.map +1 -1
  23. package/dist/framework-bridge.d.ts +98 -0
  24. package/dist/framework-bridge.js +264 -0
  25. package/dist/framework-bridge.js.map +1 -0
  26. package/dist/framework-sessions.d.ts +147 -0
  27. package/dist/framework-sessions.js +544 -0
  28. package/dist/framework-sessions.js.map +1 -0
  29. package/dist/index.d.ts +9 -1
  30. package/dist/index.js +12 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/legacy-issuer-presets.d.ts +85 -0
  33. package/dist/legacy-issuer-presets.js +165 -0
  34. package/dist/legacy-issuer-presets.js.map +1 -0
  35. package/dist/legacy-issuers.d.ts +16 -2
  36. package/dist/legacy-issuers.js +16 -1
  37. package/dist/legacy-issuers.js.map +1 -1
  38. package/dist/legacy-verify.d.ts +103 -0
  39. package/dist/legacy-verify.js +244 -0
  40. package/dist/legacy-verify.js.map +1 -0
  41. package/dist/migration-bridge.d.ts +153 -0
  42. package/dist/migration-bridge.js +328 -0
  43. package/dist/migration-bridge.js.map +1 -0
  44. package/dist/migration-presets.d.ts +150 -0
  45. package/dist/migration-presets.js +440 -0
  46. package/dist/migration-presets.js.map +1 -0
  47. package/dist/recent-auth.d.ts +21 -0
  48. package/dist/recent-auth.js +30 -0
  49. package/dist/recent-auth.js.map +1 -0
  50. package/package.json +1 -1
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.openSealedBox = exports.sealBox = exports.OAuthFlowError = void 0;
4
4
  exports.operatorConfiguration = operatorConfiguration;
5
+ exports.startDeviceAuthorization = startDeviceAuthorization;
6
+ exports.pollDeviceAuthorization = pollDeviceAuthorization;
5
7
  exports.startOperatorLogin = startOperatorLogin;
6
8
  exports.pollOperatorLogin = pollOperatorLogin;
7
9
  exports.exchangeOperatorToken = exchangeOperatorToken;
@@ -42,27 +44,41 @@ async function operatorConfiguration(opts = {}) {
42
44
  return (await res.json());
43
45
  }
44
46
  /**
45
- * Start the device flow. With `audience` (one of the configuration's
46
- * `audiences`), the operator token is minted FOR that other product
47
- * (`aud=<audience>`, sent as the RFC 8707 `resource`): hand it to that product;
48
- * Atlas's own token exchange refuses it.
47
+ * Start an RFC 8628 device flow against any Atlas instance's OAuth server, for a
48
+ * CLI or TV app of your own: `issuer` is the instance's issuer (its Frontend API
49
+ * host, e.g. `https://acme-fapi.atlasauth.net`) and `clientId` an OAuth client
50
+ * with the `urn:ietf:params:oauth:grant-type:device_code` grant. Show the person
51
+ * `verification_uri_complete` (or `verification_uri` + `user_code`), then
52
+ * {@link pollDeviceAuthorization}. A confidential client passes `clientSecret`.
49
53
  */
50
- async function startOperatorLogin(opts = {}) {
51
- const config = opts.config ?? (await operatorConfiguration(opts));
52
- const out = await form(opts.fetch ?? globalThis.fetch, config.device_authorization_endpoint, {
54
+ async function startDeviceAuthorization(params, opts = {}) {
55
+ const base = params.issuer.replace(/\/+$/, '');
56
+ const config = {
57
+ device_authorization_endpoint: `${base}/oauth2/device_authorization`,
58
+ token_endpoint: `${base}/oauth2/token`,
59
+ client_id: params.clientId,
60
+ ...(params.clientSecret ? { client_secret: params.clientSecret } : {}),
61
+ };
62
+ const scope = Array.isArray(params.scope) ? params.scope.join(' ') : params.scope;
63
+ return startDevice(opts.fetch ?? globalThis.fetch, config, { scope, resource: params.resource });
64
+ }
65
+ async function startDevice(f, config, params) {
66
+ const out = await form(f, config.device_authorization_endpoint, {
53
67
  client_id: config.client_id,
54
- scope: config.scope,
55
- ...(opts.audience ? { resource: opts.audience } : {}),
68
+ ...(config.client_secret ? { client_secret: config.client_secret } : {}),
69
+ ...(params.scope ? { scope: params.scope } : {}),
70
+ ...(params.resource ? { resource: params.resource } : {}),
56
71
  });
57
72
  if (out._status !== 200)
58
73
  throw new OAuthFlowError(String(out.error ?? 'error'), String(out.error_description ?? 'Device authorization failed.'), out._status);
59
74
  return { ...out, config };
60
75
  }
61
76
  /**
62
- * Poll until the person approves (resolves the operator token), denies or the
63
- * code expires (throws). Honours `interval` and `slow_down`.
77
+ * Poll the token endpoint until the person approves (resolves the tokens),
78
+ * denies (`access_denied`) or the code expires (`expired_token`); both throw an
79
+ * {@link OAuthFlowError}. Honours `interval` and adds 5 s on each `slow_down`.
64
80
  */
65
- async function pollOperatorLogin(start, opts = {}) {
81
+ async function pollDeviceAuthorization(start, opts = {}) {
66
82
  const f = opts.fetch ?? globalThis.fetch;
67
83
  const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
68
84
  let interval = Math.max(1, start.interval) * 1000;
@@ -75,6 +91,7 @@ async function pollOperatorLogin(start, opts = {}) {
75
91
  grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
76
92
  device_code: start.device_code,
77
93
  client_id: start.config.client_id,
94
+ ...(start.config.client_secret ? { client_secret: start.config.client_secret } : {}),
78
95
  });
79
96
  if (out._status === 200)
80
97
  return out;
@@ -88,6 +105,24 @@ async function pollOperatorLogin(start, opts = {}) {
88
105
  }
89
106
  throw new OAuthFlowError('expired_token', 'The sign-in code expired. Run the login again.', 400);
90
107
  }
108
+ /**
109
+ * Start the device flow. With `audience` (one of the configuration's
110
+ * `audiences`), the operator token is minted FOR that other product
111
+ * (`aud=<audience>`, sent as the RFC 8707 `resource`): hand it to that product;
112
+ * Atlas's own token exchange refuses it.
113
+ */
114
+ async function startOperatorLogin(opts = {}) {
115
+ const config = opts.config ?? (await operatorConfiguration(opts));
116
+ const out = await startDevice(opts.fetch ?? globalThis.fetch, config, { scope: config.scope, resource: opts.audience });
117
+ return { ...out, config };
118
+ }
119
+ /**
120
+ * Poll until the person approves (resolves the operator token), denies or the
121
+ * code expires (throws). Honours `interval` and `slow_down`.
122
+ */
123
+ async function pollOperatorLogin(start, opts = {}) {
124
+ return pollDeviceAuthorization(start, opts);
125
+ }
91
126
  /** RFC 8693: swap an operator token for a one-hour, resource-bound Atlas token. */
92
127
  async function exchangeOperatorToken(subjectToken, params, opts = {}) {
93
128
  const out = await form(opts.fetch ?? globalThis.fetch, `${(opts.apiUrl ?? DEFAULT_API).replace(/\/+$/, '')}/v1/oauth/token`, {
@@ -1 +1 @@
1
- {"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/client/operator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/client/operator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { MigrationTokenExtractor } from './migration-bridge';
2
+ /**
3
+ * Zero-logout bridge for the SELF-HOSTED frameworks (Auth.js, Lucia,
4
+ * Passport, iron-session, Devise, Django): their presets, and the token
5
+ * extractors `migrationBridge({ extractToken })` takes.
6
+ *
7
+ * Two families:
8
+ *
9
+ * - Database sessions (Auth.js database strategy, Lucia, express-session
10
+ * stores, Django's database backend, Rails' activerecord-session_store):
11
+ * preset mode `session_table`. The cookie carries an opaque id; Atlas finds
12
+ * sha256(id) among the sessions you imported. Lucia, Auth.js and Django
13
+ * cookies are read as they are; express-session's cookie is signed
14
+ * (`s:<id>.<signature>`), so {@link expressSessionExtractor} pulls the id out.
15
+ *
16
+ * - Sealed cookies (Auth.js JWT strategy, iron-session, Rails' cookie store
17
+ * under Devise, Django's signed-cookie backend): there is no session row to
18
+ * import — the cookie IS the session, and only your app's secret opens it.
19
+ * The extractor opens it ON YOUR SERVER and hands Atlas a short-lived
20
+ * BRIDGE ASSERTION instead: an HS256 JWT (`iss` = `urn:atlas:bridge:<source>`,
21
+ * `sub` = the user id you exported, `jti` = the old session's id) signed
22
+ * with a bridge secret you generate and store in the bridge settings
23
+ * (`shared_secret`). Your AUTH_SECRET / secret_key_base / SECRET_KEY /
24
+ * iron password never leave your server; Atlas verifies the assertion,
25
+ * spends its `jti` once, and signs the user in.
26
+ */
27
+ /** The issuer of a bridge assertion for a source. */
28
+ export declare function bridgeAssertionIssuer(source: string): string;
29
+ /** Lifetime of a bridge assertion: it is exchanged immediately, once. */
30
+ export declare const BRIDGE_ASSERTION_TTL_SECONDS = 120;
31
+ export interface BridgeAssertion {
32
+ source: string;
33
+ /** The source user id (the `user.id` your export wrote). */
34
+ sub: string;
35
+ /** The old session's own id, so the session exchanges once (single-use ledger). */
36
+ sessionKey: string;
37
+ email?: string | null;
38
+ name?: string | null;
39
+ /** The old session had already passed a second factor. */
40
+ mfa?: boolean;
41
+ }
42
+ /** Sign a bridge assertion with the bridge secret (HS256). */
43
+ export declare function signBridgeAssertion(assertion: BridgeAssertion, bridgeSecret: string, now?: Date): Promise<string>;
44
+ /**
45
+ * Auth.js / NextAuth, either session strategy. A database-session cookie is
46
+ * returned as it is (preset `authjs`); a JWT-strategy cookie is decrypted with
47
+ * `secret` (AUTH_SECRET / NEXTAUTH_SECRET, or the rotation list) and turned
48
+ * into a bridge assertion (preset `authjs_jwt`, needs `bridgeSecret`).
49
+ */
50
+ export declare function authJsExtractor(options: {
51
+ secret?: string | readonly string[];
52
+ bridgeSecret?: string;
53
+ cookieName?: string;
54
+ }): MigrationTokenExtractor;
55
+ /**
56
+ * Passport / express-session: the session id out of the signed `connect.sid`
57
+ * cookie (preset `passport`). Pass `secrets` (your `session({ secret })`) to
58
+ * check the signature as express-session does.
59
+ */
60
+ export declare function expressSessionExtractor(options?: {
61
+ cookieName?: string;
62
+ secrets?: string | readonly string[];
63
+ }): MigrationTokenExtractor;
64
+ /**
65
+ * iron-session: unseal the cookie with your session password and assert the
66
+ * user at `userIdPath` (default: `userId`, then `user.id`, then `id`).
67
+ */
68
+ export declare function ironSessionExtractor(options: {
69
+ cookieName: string;
70
+ password: string | Readonly<Record<string, string>>;
71
+ bridgeSecret: string;
72
+ userIdPath?: string;
73
+ emailPath?: string;
74
+ }): MigrationTokenExtractor;
75
+ /**
76
+ * Devise on Rails' cookie store: decrypt `_<app>_session` with
77
+ * `secret_key_base` and assert the Warden user (`scope`, default `user`).
78
+ */
79
+ export declare function deviseExtractor(options: {
80
+ cookieName: string;
81
+ secretKeyBase: string | readonly string[];
82
+ bridgeSecret: string;
83
+ scope?: string;
84
+ keyDigest?: 'SHA-256' | 'SHA-1';
85
+ }): MigrationTokenExtractor;
86
+ /**
87
+ * Django's signed-cookie session backend: verify the cookie with SECRET_KEY
88
+ * (then SECRET_KEY_FALLBACKS) and assert `_auth_user_id`.
89
+ */
90
+ export declare function djangoSignedCookieExtractor(options: {
91
+ secretKey: string | readonly string[];
92
+ bridgeSecret: string;
93
+ cookieName?: string;
94
+ /** SESSION_COOKIE_AGE (default two weeks). */
95
+ maxAgeSeconds?: number;
96
+ }): MigrationTokenExtractor;
97
+ /** The preset ids this module registers (for docs and the settings UI). */
98
+ export declare const FRAMEWORK_BRIDGE_PRESETS: string[];
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FRAMEWORK_BRIDGE_PRESETS = exports.BRIDGE_ASSERTION_TTL_SECONDS = void 0;
4
+ exports.bridgeAssertionIssuer = bridgeAssertionIssuer;
5
+ exports.signBridgeAssertion = signBridgeAssertion;
6
+ exports.authJsExtractor = authJsExtractor;
7
+ exports.expressSessionExtractor = expressSessionExtractor;
8
+ exports.ironSessionExtractor = ironSessionExtractor;
9
+ exports.deviseExtractor = deviseExtractor;
10
+ exports.djangoSignedCookieExtractor = djangoSignedCookieExtractor;
11
+ const jose_1 = require("jose");
12
+ const framework_sessions_1 = require("./framework-sessions");
13
+ const migration_presets_1 = require("./migration-presets");
14
+ /**
15
+ * Zero-logout bridge for the SELF-HOSTED frameworks (Auth.js, Lucia,
16
+ * Passport, iron-session, Devise, Django): their presets, and the token
17
+ * extractors `migrationBridge({ extractToken })` takes.
18
+ *
19
+ * Two families:
20
+ *
21
+ * - Database sessions (Auth.js database strategy, Lucia, express-session
22
+ * stores, Django's database backend, Rails' activerecord-session_store):
23
+ * preset mode `session_table`. The cookie carries an opaque id; Atlas finds
24
+ * sha256(id) among the sessions you imported. Lucia, Auth.js and Django
25
+ * cookies are read as they are; express-session's cookie is signed
26
+ * (`s:<id>.<signature>`), so {@link expressSessionExtractor} pulls the id out.
27
+ *
28
+ * - Sealed cookies (Auth.js JWT strategy, iron-session, Rails' cookie store
29
+ * under Devise, Django's signed-cookie backend): there is no session row to
30
+ * import — the cookie IS the session, and only your app's secret opens it.
31
+ * The extractor opens it ON YOUR SERVER and hands Atlas a short-lived
32
+ * BRIDGE ASSERTION instead: an HS256 JWT (`iss` = `urn:atlas:bridge:<source>`,
33
+ * `sub` = the user id you exported, `jti` = the old session's id) signed
34
+ * with a bridge secret you generate and store in the bridge settings
35
+ * (`shared_secret`). Your AUTH_SECRET / secret_key_base / SECRET_KEY /
36
+ * iron password never leave your server; Atlas verifies the assertion,
37
+ * spends its `jti` once, and signs the user in.
38
+ */
39
+ /** The issuer of a bridge assertion for a source. */
40
+ function bridgeAssertionIssuer(source) {
41
+ return `urn:atlas:bridge:${source}`;
42
+ }
43
+ /** Lifetime of a bridge assertion: it is exchanged immediately, once. */
44
+ exports.BRIDGE_ASSERTION_TTL_SECONDS = 120;
45
+ /** Sign a bridge assertion with the bridge secret (HS256). */
46
+ async function signBridgeAssertion(assertion, bridgeSecret, now = new Date()) {
47
+ if (!bridgeSecret || bridgeSecret.length < 32)
48
+ throw new Error('The bridge secret must be at least 32 characters (generate one with `openssl rand -base64 48`).');
49
+ const iat = Math.floor(now.getTime() / 1000);
50
+ return new jose_1.SignJWT({
51
+ ...(assertion.email ? { email: assertion.email } : {}),
52
+ ...(assertion.name ? { name: assertion.name } : {}),
53
+ ...(assertion.mfa ? { amr: ['pwd', 'mfa'] } : {}),
54
+ })
55
+ .setProtectedHeader({ alg: 'HS256', typ: 'JWT' })
56
+ .setIssuer(bridgeAssertionIssuer(assertion.source))
57
+ .setSubject(assertion.sub)
58
+ .setJti(assertion.sessionKey)
59
+ .setIssuedAt(iat)
60
+ .setExpirationTime(iat + exports.BRIDGE_ASSERTION_TTL_SECONDS)
61
+ .sign(new TextEncoder().encode(bridgeSecret));
62
+ }
63
+ async function sha256Hex(value) {
64
+ const d = new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value)));
65
+ return Array.from(d, (b) => b.toString(16).padStart(2, '0')).join('');
66
+ }
67
+ // ── extractors ──────────────────────────────────────────────────────────────
68
+ /**
69
+ * Auth.js / NextAuth, either session strategy. A database-session cookie is
70
+ * returned as it is (preset `authjs`); a JWT-strategy cookie is decrypted with
71
+ * `secret` (AUTH_SECRET / NEXTAUTH_SECRET, or the rotation list) and turned
72
+ * into a bridge assertion (preset `authjs_jwt`, needs `bridgeSecret`).
73
+ */
74
+ function authJsExtractor(options) {
75
+ return async ({ cookies }) => {
76
+ const found = (0, framework_sessions_1.readAuthJsSessionCookie)(cookies, { cookieName: options.cookieName });
77
+ if (!found)
78
+ return undefined;
79
+ const kind = (0, framework_sessions_1.authJsSessionTokenKind)(found.value);
80
+ if (kind === 'database')
81
+ return decodeURIComponent(found.value);
82
+ if (kind !== 'jwt' || !options.secret || !options.bridgeSecret)
83
+ return undefined;
84
+ const claims = await (0, framework_sessions_1.decodeAuthJsSessionToken)(found.value, { secret: options.secret, salt: found.name });
85
+ if (!claims?.sub)
86
+ return undefined;
87
+ return signBridgeAssertion({
88
+ source: 'authjs',
89
+ sub: claims.sub,
90
+ sessionKey: typeof claims.jti === 'string' && claims.jti ? claims.jti : await sha256Hex(found.value),
91
+ email: claims.email ?? null,
92
+ name: claims.name ?? null,
93
+ }, options.bridgeSecret);
94
+ };
95
+ }
96
+ /**
97
+ * Passport / express-session: the session id out of the signed `connect.sid`
98
+ * cookie (preset `passport`). Pass `secrets` (your `session({ secret })`) to
99
+ * check the signature as express-session does.
100
+ */
101
+ function expressSessionExtractor(options = {}) {
102
+ return async ({ cookies }) => {
103
+ const raw = cookies[options.cookieName ?? framework_sessions_1.EXPRESS_SESSION_COOKIE];
104
+ if (!raw)
105
+ return undefined;
106
+ return (await (0, framework_sessions_1.unsignExpressSessionCookie)(raw, options.secrets)) ?? undefined;
107
+ };
108
+ }
109
+ /**
110
+ * iron-session: unseal the cookie with your session password and assert the
111
+ * user at `userIdPath` (default: `userId`, then `user.id`, then `id`).
112
+ */
113
+ function ironSessionExtractor(options) {
114
+ return async ({ cookies }) => {
115
+ const raw = cookies[options.cookieName];
116
+ if (!raw)
117
+ return undefined;
118
+ const data = await (0, framework_sessions_1.unsealIronSession)(raw, options.password);
119
+ if (!data)
120
+ return undefined;
121
+ const sub = options.userIdPath
122
+ ? (0, framework_sessions_1.sessionValueAt)(data, options.userIdPath)
123
+ : ((0, framework_sessions_1.sessionValueAt)(data, 'userId') ?? (0, framework_sessions_1.sessionValueAt)(data, 'user.id') ?? (0, framework_sessions_1.sessionValueAt)(data, 'id'));
124
+ if (!sub)
125
+ return undefined;
126
+ return signBridgeAssertion({
127
+ source: 'iron_session',
128
+ sub,
129
+ sessionKey: await sha256Hex(raw),
130
+ email: (0, framework_sessions_1.sessionValueAt)(data, options.emailPath ?? 'user.email') ?? (0, framework_sessions_1.sessionValueAt)(data, 'email'),
131
+ }, options.bridgeSecret);
132
+ };
133
+ }
134
+ /**
135
+ * Devise on Rails' cookie store: decrypt `_<app>_session` with
136
+ * `secret_key_base` and assert the Warden user (`scope`, default `user`).
137
+ */
138
+ function deviseExtractor(options) {
139
+ return async ({ cookies }) => {
140
+ const raw = cookies[options.cookieName];
141
+ if (!raw)
142
+ return undefined;
143
+ const session = await (0, framework_sessions_1.decryptRailsCookie)(raw, {
144
+ secretKeyBase: options.secretKeyBase,
145
+ cookieName: options.cookieName,
146
+ ...(options.keyDigest ? { keyDigest: options.keyDigest } : {}),
147
+ });
148
+ const user = session ? (0, framework_sessions_1.deviseSessionUser)(session, options.scope) : null;
149
+ if (!user)
150
+ return undefined;
151
+ const sid = typeof session.session_id === 'string' && session.session_id ? session.session_id : await sha256Hex(raw);
152
+ return signBridgeAssertion({ source: 'devise', sub: user.id, sessionKey: sid }, options.bridgeSecret);
153
+ };
154
+ }
155
+ /**
156
+ * Django's signed-cookie session backend: verify the cookie with SECRET_KEY
157
+ * (then SECRET_KEY_FALLBACKS) and assert `_auth_user_id`.
158
+ */
159
+ function djangoSignedCookieExtractor(options) {
160
+ return async ({ cookies }) => {
161
+ const raw = cookies[options.cookieName ?? framework_sessions_1.DJANGO_SESSION_COOKIE];
162
+ if (!raw)
163
+ return undefined;
164
+ const data = await (0, framework_sessions_1.decodeDjangoSignedCookie)(raw, { secretKey: options.secretKey, maxAgeSeconds: options.maxAgeSeconds ?? 1209600 });
165
+ const user = data ? (0, framework_sessions_1.djangoSessionUser)(data) : null;
166
+ if (!user)
167
+ return undefined;
168
+ return signBridgeAssertion({ source: 'django', sub: user.id, sessionKey: await sha256Hex(raw) }, options.bridgeSecret);
169
+ };
170
+ }
171
+ // ── presets ─────────────────────────────────────────────────────────────────
172
+ const AUTHJS_COOKIES = [...framework_sessions_1.AUTHJS_SESSION_COOKIES];
173
+ const AUTHJS_CLEAR = [
174
+ ...framework_sessions_1.AUTHJS_SESSION_COOKIES.map((c) => `${c}*`),
175
+ '__Host-authjs.csrf-token',
176
+ 'authjs.csrf-token',
177
+ '__Secure-authjs.callback-url',
178
+ 'authjs.callback-url',
179
+ '__Host-next-auth.csrf-token',
180
+ 'next-auth.csrf-token',
181
+ '__Secure-next-auth.callback-url',
182
+ 'next-auth.callback-url',
183
+ ];
184
+ /** A sealed-cookie preset: Atlas verifies the bridge assertion with the stored shared secret. */
185
+ function assertionPreset(id, source, label, cookies, extra) {
186
+ return {
187
+ id,
188
+ label,
189
+ mode: 'jwt',
190
+ jwt: {
191
+ issuer: bridgeAssertionIssuer(source),
192
+ algorithms: ['HS256'],
193
+ allowSharedSecret: true,
194
+ claims: { subject: 'sub', email: 'email', name: 'name', sessionKey: 'jti', mfa: 'amr:mfa' },
195
+ },
196
+ cookies,
197
+ ...extra,
198
+ };
199
+ }
200
+ const FRAMEWORK_PRESETS = [
201
+ {
202
+ id: 'authjs',
203
+ label: 'Auth.js (database sessions)',
204
+ mode: 'session_table',
205
+ cookies: AUTHJS_COOKIES,
206
+ clearCookies: AUTHJS_CLEAR,
207
+ notes: 'Database strategy: the cookie is the sessionToken your adapter stored; import the sessions table. With the JWT strategy use the authjs_jwt preset.',
208
+ },
209
+ assertionPreset('authjs_jwt', 'authjs', 'Auth.js (JWT sessions)', AUTHJS_COOKIES, {
210
+ clearCookies: AUTHJS_CLEAR,
211
+ notes: 'The cookie is a JWE encrypted with AUTH_SECRET. Pass authJsExtractor({ secret: AUTH_SECRET, bridgeSecret }) to the middleware: it decrypts the cookie on your server and sends a one-time bridge assertion signed with the bridge secret stored in these settings.',
212
+ }),
213
+ {
214
+ id: 'lucia',
215
+ label: 'Lucia',
216
+ mode: 'session_table',
217
+ defaults: { cookie_name: framework_sessions_1.LUCIA_SESSION_COOKIE },
218
+ cookies: ['{cookie_name}'],
219
+ notes: 'The cookie holds the session token; the export hashes v2/v3 session ids, and reads guide-style sessions (id = sha256 of the token) as they are.',
220
+ },
221
+ {
222
+ id: 'passport',
223
+ label: 'Passport.js (express-session)',
224
+ mode: 'session_table',
225
+ defaults: { cookie_name: framework_sessions_1.EXPRESS_SESSION_COOKIE },
226
+ cookies: ['{cookie_name}'],
227
+ notes: 'The connect.sid cookie is signed (s:<id>.<signature>): pass expressSessionExtractor() to the middleware so Atlas gets the session id. Import the sessions from your express-session store.',
228
+ },
229
+ assertionPreset('iron_session', 'iron_session', 'iron-session', ['{cookie_name}'], {
230
+ vars: { cookie_name: 'The iron-session cookieName' },
231
+ notes: 'Pass ironSessionExtractor({ cookieName, password, bridgeSecret }) to the middleware: it unseals the cookie with your session password on your server.',
232
+ }),
233
+ assertionPreset('devise', 'devise', 'Devise (Rails cookie store)', ['{cookie_name}'], {
234
+ vars: { cookie_name: 'The Rails session cookie (_yourapp_session)' },
235
+ clearCookies: ['{cookie_name}', 'remember_user_token'],
236
+ notes: 'Pass deviseExtractor({ cookieName, secretKeyBase, bridgeSecret }) to the middleware (Node in front of, or beside, the Rails app): it decrypts the session cookie with secret_key_base on your server. JSON cookie serializer only.',
237
+ }),
238
+ {
239
+ id: 'devise_active_record',
240
+ label: 'Devise (activerecord-session_store)',
241
+ mode: 'session_table',
242
+ vars: { cookie_name: 'The Rails session cookie (_yourapp_session)' },
243
+ cookies: ['{cookie_name}'],
244
+ clearCookies: ['{cookie_name}', 'remember_user_token'],
245
+ notes: 'The cookie holds the public session id; Atlas matches sha256 of it, which is the private id Rack stored.',
246
+ },
247
+ {
248
+ id: 'django',
249
+ label: 'Django (database sessions)',
250
+ mode: 'session_table',
251
+ defaults: { cookie_name: framework_sessions_1.DJANGO_SESSION_COOKIE },
252
+ cookies: ['{cookie_name}'],
253
+ notes: 'The sessionid cookie is the django_session key; import sessions.session with the export.',
254
+ },
255
+ assertionPreset('django_signed_cookies', 'django', 'Django (signed-cookie sessions)', ['{cookie_name}'], {
256
+ defaults: { cookie_name: framework_sessions_1.DJANGO_SESSION_COOKIE },
257
+ notes: 'Pass djangoSignedCookieExtractor({ secretKey: SECRET_KEY, bridgeSecret }) to the middleware: it verifies the cookie with SECRET_KEY on your server.',
258
+ }),
259
+ ];
260
+ for (const preset of FRAMEWORK_PRESETS)
261
+ (0, migration_presets_1.registerMigrationBridgePreset)(preset, { replace: true });
262
+ /** The preset ids this module registers (for docs and the settings UI). */
263
+ exports.FRAMEWORK_BRIDGE_PRESETS = FRAMEWORK_PRESETS.map((p) => p.id);
264
+ //# sourceMappingURL=framework-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-bridge.js","sourceRoot":"","sources":["../src/framework-bridge.ts"],"names":[],"mappings":"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"}