@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.
Files changed (188) hide show
  1. package/CHANGELOG.md +14 -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/abac.d.ts +132 -0
  9. package/dist/client/abac.js +48 -0
  10. package/dist/client/abac.js.map +1 -0
  11. package/dist/client/access-policies.d.ts +100 -0
  12. package/dist/client/access-policies.js +29 -0
  13. package/dist/client/access-policies.js.map +1 -0
  14. package/dist/client/action-gallery.d.ts +1 -1
  15. package/dist/client/action-gallery.js.map +1 -1
  16. package/dist/client/actions.d.ts +129 -6
  17. package/dist/client/actions.js +4 -0
  18. package/dist/client/actions.js.map +1 -1
  19. package/dist/client/analytics-reports.d.ts +215 -0
  20. package/dist/client/analytics-reports.js +56 -0
  21. package/dist/client/analytics-reports.js.map +1 -0
  22. package/dist/client/app-catalog.d.ts +74 -0
  23. package/dist/client/app-catalog.js +30 -0
  24. package/dist/client/app-catalog.js.map +1 -0
  25. package/dist/client/attack-protection.d.ts +10 -0
  26. package/dist/client/attack-protection.js +8 -0
  27. package/dist/client/attack-protection.js.map +1 -1
  28. package/dist/client/audit-events.d.ts +71 -0
  29. package/dist/client/audit-events.js +28 -0
  30. package/dist/client/audit-events.js.map +1 -1
  31. package/dist/client/credentials.d.ts +8 -0
  32. package/dist/client/credentials.js.map +1 -1
  33. package/dist/client/delegated-ui-proxy.d.ts +25 -0
  34. package/dist/client/delegated-ui-proxy.js +46 -0
  35. package/dist/client/delegated-ui-proxy.js.map +1 -0
  36. package/dist/client/devices.d.ts +44 -0
  37. package/dist/client/devices.js +26 -0
  38. package/dist/client/devices.js.map +1 -0
  39. package/dist/client/email-templates.d.ts +1 -1
  40. package/dist/client/email-templates.js.map +1 -1
  41. package/dist/client/flags.d.ts +101 -0
  42. package/dist/client/flags.js +104 -0
  43. package/dist/client/flags.js.map +1 -0
  44. package/dist/client/groups.d.ts +146 -0
  45. package/dist/client/groups.js +67 -0
  46. package/dist/client/groups.js.map +1 -0
  47. package/dist/client/identity-verification.d.ts +62 -0
  48. package/dist/client/identity-verification.js +39 -0
  49. package/dist/client/identity-verification.js.map +1 -0
  50. package/dist/client/index.d.ts +997 -2
  51. package/dist/client/index.js +77 -0
  52. package/dist/client/index.js.map +1 -1
  53. package/dist/client/journeys.d.ts +108 -0
  54. package/dist/client/journeys.js +35 -0
  55. package/dist/client/journeys.js.map +1 -0
  56. package/dist/client/log-streams.d.ts +1 -1
  57. package/dist/client/marketing.d.ts +67 -0
  58. package/dist/client/marketing.js +26 -0
  59. package/dist/client/marketing.js.map +1 -0
  60. package/dist/client/mcp-gateways.d.ts +54 -0
  61. package/dist/client/mcp-gateways.js +25 -0
  62. package/dist/client/mcp-gateways.js.map +1 -0
  63. package/dist/client/messaging.d.ts +14 -3
  64. package/dist/client/messaging.js.map +1 -1
  65. package/dist/client/mfa-factors.d.ts +120 -0
  66. package/dist/client/mfa-factors.js +73 -0
  67. package/dist/client/mfa-factors.js.map +1 -0
  68. package/dist/client/migrations.d.ts +286 -0
  69. package/dist/client/migrations.js +103 -0
  70. package/dist/client/migrations.js.map +1 -0
  71. package/dist/client/network-acls.d.ts +6 -1
  72. package/dist/client/network-acls.js.map +1 -1
  73. package/dist/client/network-zones.d.ts +56 -0
  74. package/dist/client/network-zones.js +29 -0
  75. package/dist/client/network-zones.js.map +1 -0
  76. package/dist/client/notifications.d.ts +1 -1
  77. package/dist/client/notifications.js.map +1 -1
  78. package/dist/client/oauth-clients.d.ts +183 -3
  79. package/dist/client/oauth-clients.js +64 -0
  80. package/dist/client/oauth-clients.js.map +1 -1
  81. package/dist/client/org-role-grants.d.ts +57 -0
  82. package/dist/client/org-role-grants.js +40 -0
  83. package/dist/client/org-role-grants.js.map +1 -0
  84. package/dist/client/organizations.d.ts +52 -0
  85. package/dist/client/organizations.js +44 -0
  86. package/dist/client/organizations.js.map +1 -1
  87. package/dist/client/page-templates.d.ts +78 -0
  88. package/dist/client/page-templates.js +31 -0
  89. package/dist/client/page-templates.js.map +1 -0
  90. package/dist/client/passkey-api.d.ts +73 -0
  91. package/dist/client/passkey-api.js +34 -0
  92. package/dist/client/passkey-api.js.map +1 -0
  93. package/dist/client/resources.d.ts +149 -0
  94. package/dist/client/resources.js +73 -0
  95. package/dist/client/resources.js.map +1 -0
  96. package/dist/client/risk-based-mfa.d.ts +147 -0
  97. package/dist/client/risk-based-mfa.js +30 -0
  98. package/dist/client/risk-based-mfa.js.map +1 -1
  99. package/dist/client/roles.d.ts +4 -0
  100. package/dist/client/roles.js.map +1 -1
  101. package/dist/client/service-connectors.d.ts +83 -0
  102. package/dist/client/service-connectors.js +33 -0
  103. package/dist/client/service-connectors.js.map +1 -0
  104. package/dist/client/ssf.d.ts +111 -0
  105. package/dist/client/ssf.js +49 -0
  106. package/dist/client/ssf.js.map +1 -0
  107. package/dist/client/sso-onboarding.d.ts +6 -0
  108. package/dist/client/sso-onboarding.js.map +1 -1
  109. package/dist/client/users.d.ts +302 -0
  110. package/dist/client/users.js +125 -0
  111. package/dist/client/users.js.map +1 -1
  112. package/dist/client/vault.d.ts +85 -0
  113. package/dist/client/vault.js +50 -0
  114. package/dist/client/vault.js.map +1 -0
  115. package/dist/client/vc.d.ts +128 -0
  116. package/dist/client/vc.js +43 -0
  117. package/dist/client/vc.js.map +1 -0
  118. package/dist/client/webhooks.d.ts +31 -2
  119. package/dist/client/webhooks.js.map +1 -1
  120. package/dist/client/workflows.d.ts +131 -0
  121. package/dist/client/workflows.js +36 -0
  122. package/dist/client/workflows.js.map +1 -0
  123. package/dist/framework-bridge.d.ts +98 -0
  124. package/dist/framework-bridge.js +264 -0
  125. package/dist/framework-bridge.js.map +1 -0
  126. package/dist/framework-sessions.d.ts +147 -0
  127. package/dist/framework-sessions.js +544 -0
  128. package/dist/framework-sessions.js.map +1 -0
  129. package/dist/index.d.ts +11 -1
  130. package/dist/index.js +19 -2
  131. package/dist/index.js.map +1 -1
  132. package/dist/legacy-issuer-presets.d.ts +85 -0
  133. package/dist/legacy-issuer-presets.js +165 -0
  134. package/dist/legacy-issuer-presets.js.map +1 -0
  135. package/dist/legacy-issuers.d.ts +16 -2
  136. package/dist/legacy-issuers.js +16 -1
  137. package/dist/legacy-issuers.js.map +1 -1
  138. package/dist/legacy-verify.d.ts +103 -0
  139. package/dist/legacy-verify.js +244 -0
  140. package/dist/legacy-verify.js.map +1 -0
  141. package/dist/magic-did.d.ts +5 -0
  142. package/dist/magic-did.js +49 -0
  143. package/dist/magic-did.js.map +1 -0
  144. package/dist/migration-bridge.d.ts +162 -0
  145. package/dist/migration-bridge.js +354 -0
  146. package/dist/migration-bridge.js.map +1 -0
  147. package/dist/migration-presets-g3.d.ts +2 -0
  148. package/dist/migration-presets-g3.js +254 -0
  149. package/dist/migration-presets-g3.js.map +1 -0
  150. package/dist/migration-presets-g4/authentik.d.ts +14 -0
  151. package/dist/migration-presets-g4/authentik.js +37 -0
  152. package/dist/migration-presets-g4/authentik.js.map +1 -0
  153. package/dist/migration-presets-g4/fusionauth.d.ts +2 -0
  154. package/dist/migration-presets-g4/fusionauth.js +52 -0
  155. package/dist/migration-presets-g4/fusionauth.js.map +1 -0
  156. package/dist/migration-presets-g4/hanko.d.ts +12 -0
  157. package/dist/migration-presets-g4/hanko.js +46 -0
  158. package/dist/migration-presets-g4/hanko.js.map +1 -0
  159. package/dist/migration-presets-g4/keycloak.d.ts +16 -0
  160. package/dist/migration-presets-g4/keycloak.js +37 -0
  161. package/dist/migration-presets-g4/keycloak.js.map +1 -0
  162. package/dist/migration-presets-g4/logto.d.ts +12 -0
  163. package/dist/migration-presets-g4/logto.js +35 -0
  164. package/dist/migration-presets-g4/logto.js.map +1 -0
  165. package/dist/migration-presets-g4/ory.d.ts +2 -0
  166. package/dist/migration-presets-g4/ory.js +67 -0
  167. package/dist/migration-presets-g4/ory.js.map +1 -0
  168. package/dist/migration-presets-g4/supertokens.d.ts +13 -0
  169. package/dist/migration-presets-g4/supertokens.js +35 -0
  170. package/dist/migration-presets-g4/supertokens.js.map +1 -0
  171. package/dist/migration-presets-g4/zitadel.d.ts +2 -0
  172. package/dist/migration-presets-g4/zitadel.js +36 -0
  173. package/dist/migration-presets-g4/zitadel.js.map +1 -0
  174. package/dist/migration-presets-g4.d.ts +10 -0
  175. package/dist/migration-presets-g4.js +30 -0
  176. package/dist/migration-presets-g4.js.map +1 -0
  177. package/dist/migration-presets.d.ts +156 -0
  178. package/dist/migration-presets.js +536 -0
  179. package/dist/migration-presets.js.map +1 -0
  180. package/dist/request-auth.d.ts +32 -0
  181. package/dist/request-auth.js +72 -0
  182. package/dist/request-auth.js.map +1 -0
  183. package/dist/verify.d.ts +2 -0
  184. package/dist/verify.js.map +1 -1
  185. package/dist/workos-session.d.ts +30 -0
  186. package/dist/workos-session.js +123 -0
  187. package/dist/workos-session.js.map +1 -0
  188. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,147 @@
1
+ /** Auth.js v5 (`@auth/core`) and NextAuth v4 session cookie names, `__Secure-` first. */
2
+ export declare const AUTHJS_SESSION_COOKIES: readonly ["__Secure-authjs.session-token", "authjs.session-token", "__Secure-next-auth.session-token", "next-auth.session-token"];
3
+ /**
4
+ * The Auth.js session cookie from a `Cookie` header, reassembled when Auth.js
5
+ * split it into `<name>.0`, `<name>.1`, … chunks (it does above ~4 KB). `name`
6
+ * is the base cookie name — the HKDF salt of a v5 JWT. `cookieName` overrides
7
+ * the defaults when the app set `cookies.sessionToken.name`.
8
+ */
9
+ export declare function readAuthJsSessionCookie(cookieHeader: string | null | undefined | Record<string, string>, options?: {
10
+ cookieName?: string;
11
+ }): {
12
+ name: string;
13
+ value: string;
14
+ } | undefined;
15
+ /**
16
+ * Which session strategy produced a cookie value: a five-part compact JWE is a
17
+ * JWT-strategy session; anything else is a database session token (the
18
+ * `sessionToken` column of the adapter's sessions table).
19
+ */
20
+ export declare function authJsSessionTokenKind(value: string): 'jwt' | 'database' | null;
21
+ /** The claims of a decrypted Auth.js session JWT (whatever the `jwt` callback put in it). */
22
+ export interface AuthJsSessionClaims {
23
+ sub?: string;
24
+ email?: string | null;
25
+ name?: string | null;
26
+ picture?: string | null;
27
+ exp?: number;
28
+ iat?: number;
29
+ [claim: string]: unknown;
30
+ }
31
+ /**
32
+ * Decrypt an Auth.js JWT-strategy session cookie with the app's secret
33
+ * (`AUTH_SECRET` / `NEXTAUTH_SECRET`; pass every rotated secret, newest first).
34
+ *
35
+ * - NextAuth v4: `dir` + `A256GCM`, key = HKDF-SHA256(secret, salt "", info
36
+ * "NextAuth.js Generated Encryption Key", 32 bytes).
37
+ * - Auth.js v5 (`@auth/core`): `dir` + `A256CBC-HS512` (or `A256GCM`), key =
38
+ * HKDF-SHA256(secret, salt = the cookie name, info
39
+ * "Auth.js Generated Encryption Key (<cookie name>)", 64 / 32 bytes).
40
+ *
41
+ * `salt` is the cookie the value came from (from {@link readAuthJsSessionCookie}).
42
+ * The JWT's `exp` is enforced with Auth.js's own 15 s tolerance.
43
+ */
44
+ export declare function decodeAuthJsSessionToken(token: string, options: {
45
+ secret: string | readonly string[];
46
+ salt: string;
47
+ now?: Date;
48
+ }): Promise<AuthJsSessionClaims | null>;
49
+ /** express-session's default cookie name. */
50
+ export declare const EXPRESS_SESSION_COOKIE = "connect.sid";
51
+ /**
52
+ * The session id inside an express-session cookie (`s:<sid>.<signature>`,
53
+ * URL-encoded), where the signature is cookie-signature's
54
+ * base64(HMAC-SHA256(secret, sid)) without padding. With `secrets` (the app's
55
+ * `session({ secret })`, a string or the rotation array) the signature must
56
+ * verify against one of them; without, the id is only parsed — the session id
57
+ * is itself a 24-byte random bearer value, so a store lookup by id is what
58
+ * authenticates it either way.
59
+ */
60
+ export declare function unsignExpressSessionCookie(raw: string, secrets?: string | readonly string[]): Promise<string | null>;
61
+ /** Lucia's default session cookie name (v2 and v3). */
62
+ export declare const LUCIA_SESSION_COOKIE = "auth_session";
63
+ /**
64
+ * The id a Lucia session row is stored under, from the cookie's token. Lucia
65
+ * v2/v3 store the cookie value itself (`none`); the current Lucia guide's
66
+ * session implementation stores `hex(sha256(token))` (`sha256-hex`).
67
+ */
68
+ export declare function luciaSessionId(token: string, hashing?: 'none' | 'sha256-hex'): Promise<string | null>;
69
+ /**
70
+ * Open an iron-session cookie (an `@hapi/iron` `Fe26.2` seal, with iron-session
71
+ * v8's `~2` version suffix) with the app's `password` — a string, or the
72
+ * `{ id: password }` rotation map. Mirrors iron: HMAC-SHA256 integrity and
73
+ * AES-256-CBC, each keyed by PBKDF2-SHA1(password, the seal's salt, 1 iteration,
74
+ * 32 bytes); the seal's own expiry is enforced (60 s skew, as iron does).
75
+ * Returns the session object the app stored.
76
+ */
77
+ export declare function unsealIronSession<T = Record<string, unknown>>(raw: string, password: string | Readonly<Record<string, string>>, options?: {
78
+ now?: Date;
79
+ }): Promise<T | null>;
80
+ /** Read `path` (`"user.id"`) out of a session object, as a non-empty string. */
81
+ export declare function sessionValueAt(data: unknown, path: string): string | null;
82
+ /**
83
+ * Decrypt a Rails encrypted cookie — the session cookie of a Rails app using
84
+ * the default cookie store, which is where Devise (through Warden) keeps the
85
+ * signed-in user. Rails 5.2+ authenticated encryption:
86
+ * `base64(ciphertext)--base64(iv)--base64(auth tag)`, AES-256-GCM, empty AAD,
87
+ * key = PBKDF2(secret_key_base, "authenticated encrypted cookie", 1000
88
+ * iterations, 32 bytes) with SHA-256 (Rails 7 default) or SHA-1 (apps that kept
89
+ * `key_generator_hash_digest_class = SHA1`). Both are tried unless `keyDigest`
90
+ * pins one. The `_rails` envelope's purpose (`cookie.<cookieName>`) and expiry
91
+ * are enforced; JSON-serialized cookies only (`cookies_serializer :json` or
92
+ * `:hybrid` — a Marshal-serialized cookie cannot be read outside Ruby).
93
+ */
94
+ export declare function decryptRailsCookie(raw: string, options: {
95
+ secretKeyBase: string | readonly string[];
96
+ cookieName?: string;
97
+ keyDigest?: 'SHA-256' | 'SHA-1';
98
+ salt?: string;
99
+ now?: Date;
100
+ }): Promise<Record<string, unknown> | null>;
101
+ /**
102
+ * The Devise user a Rails session holds: Warden stores
103
+ * `warden.user.<scope>.key` = `[[id], authenticatable_salt]`, where the salt is
104
+ * the first 29 characters of the user's bcrypt `encrypted_password` (so a
105
+ * password change signs every session out — check it against the imported
106
+ * hash with {@link deviseSaltMatches}).
107
+ */
108
+ export declare function deviseSessionUser(session: Record<string, unknown>, scope?: string): {
109
+ id: string;
110
+ salt: string | null;
111
+ } | null;
112
+ /** Devise's `authenticatable_salt`: the bcrypt digest's first 29 characters. */
113
+ export declare function deviseSaltMatches(salt: string | null, encryptedPassword: string | null | undefined): boolean;
114
+ /** Django's default session cookie name (`SESSION_COOKIE_NAME`). */
115
+ export declare const DJANGO_SESSION_COOKIE = "sessionid";
116
+ /**
117
+ * Verify and decode a value made by Django's `signing.dumps` — the session
118
+ * cookie of `SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"`.
119
+ * Format `<payload>:<base62 timestamp>:<signature>`, payload = urlsafe base64 of
120
+ * the JSON (zlib-compressed when it starts with `.`), signature = urlsafe
121
+ * base64 of salted_hmac(salt + "signer", "<payload>:<timestamp>", SECRET_KEY)
122
+ * with SHA-256 (Django ≥ 3.1) or SHA-1 (older). Pass SECRET_KEY first, then
123
+ * SECRET_KEY_FALLBACKS. `maxAgeSeconds` is SESSION_COOKIE_AGE.
124
+ */
125
+ export declare function decodeDjangoSignedCookie(raw: string, options: {
126
+ secretKey: string | readonly string[];
127
+ salt?: string;
128
+ maxAgeSeconds?: number;
129
+ algorithm?: 'sha256' | 'sha1';
130
+ now?: Date;
131
+ }): Promise<Record<string, unknown> | null>;
132
+ /**
133
+ * Decode a `signing.dumps` payload (the part before the timestamp) WITHOUT
134
+ * verifying it — for rows read out of the app's own `django_session` table.
135
+ */
136
+ export declare function decodeDjangoPayload(payload: string): Promise<Record<string, unknown> | null>;
137
+ /** The signed-in user of a Django session: `_auth_user_id` and `_auth_user_hash`. */
138
+ export declare function djangoSessionUser(data: Record<string, unknown>): {
139
+ id: string;
140
+ hash: string | null;
141
+ } | null;
142
+ /**
143
+ * Django's session auth hash for a user's stored password hash
144
+ * (`AbstractBaseUser.get_session_auth_hash`): hex salted_hmac with SHA-256. A
145
+ * session whose `_auth_user_hash` differs was signed out by a password change.
146
+ */
147
+ export declare function djangoSessionAuthHash(passwordHash: string, secretKey: string): Promise<string>;