@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,544 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DJANGO_SESSION_COOKIE = exports.LUCIA_SESSION_COOKIE = exports.EXPRESS_SESSION_COOKIE = exports.AUTHJS_SESSION_COOKIES = void 0;
4
+ exports.readAuthJsSessionCookie = readAuthJsSessionCookie;
5
+ exports.authJsSessionTokenKind = authJsSessionTokenKind;
6
+ exports.decodeAuthJsSessionToken = decodeAuthJsSessionToken;
7
+ exports.unsignExpressSessionCookie = unsignExpressSessionCookie;
8
+ exports.luciaSessionId = luciaSessionId;
9
+ exports.unsealIronSession = unsealIronSession;
10
+ exports.sessionValueAt = sessionValueAt;
11
+ exports.decryptRailsCookie = decryptRailsCookie;
12
+ exports.deviseSessionUser = deviseSessionUser;
13
+ exports.deviseSaltMatches = deviseSaltMatches;
14
+ exports.decodeDjangoSignedCookie = decodeDjangoSignedCookie;
15
+ exports.decodeDjangoPayload = decodeDjangoPayload;
16
+ exports.djangoSessionUser = djangoSessionUser;
17
+ exports.djangoSessionAuthHash = djangoSessionAuthHash;
18
+ const jose_1 = require("jose");
19
+ /**
20
+ * Reading the session a self-hosted auth framework left in the browser, so a
21
+ * returning user can be exchanged for an Atlas session without signing in
22
+ * again (the zero-logout bridge).
23
+ *
24
+ * Every framework here keeps its session in one of two shapes:
25
+ *
26
+ * - an opaque id the framework looks up in its own store (Auth.js database
27
+ * sessions, Lucia, express-session, Django's database sessions): the cookie
28
+ * carries the id, the migration import carries the rows, and the bridge
29
+ * only has to pull the id out of the cookie ({@link authJsSessionTokenKind},
30
+ * {@link unsignExpressSessionCookie}, {@link luciaSessionId});
31
+ * - a sealed or signed cookie that IS the session (Auth.js JWT sessions,
32
+ * iron-session, Rails' cookie store under Devise, Django's signed-cookie
33
+ * sessions): only the app's own secret opens it
34
+ * ({@link decodeAuthJsSessionToken}, {@link unsealIronSession},
35
+ * {@link decryptRailsCookie}, {@link decodeDjangoSignedCookie}).
36
+ *
37
+ * Each reader mirrors the framework's own source format exactly and FAILS
38
+ * CLOSED: a malformed, forged, expired or wrongly-keyed value is `null`, never
39
+ * a throw. Web Crypto only (plus jose, which Auth.js itself uses), so the same
40
+ * code runs in Node, edge middleware and the Atlas API.
41
+ */
42
+ const enc = new TextEncoder();
43
+ const dec = new TextDecoder();
44
+ function bytes(input) {
45
+ return enc.encode(input);
46
+ }
47
+ function fromBase64(input) {
48
+ const std = input.replace(/-/g, '+').replace(/_/g, '/').replace(/=+$/, '');
49
+ if (!/^[A-Za-z0-9+/]*$/.test(std) || std.length % 4 === 1)
50
+ return null;
51
+ const bin = atob(std + '='.repeat((4 - (std.length % 4)) % 4));
52
+ const out = new Uint8Array(bin.length);
53
+ for (let i = 0; i < bin.length; i++)
54
+ out[i] = bin.charCodeAt(i);
55
+ return out;
56
+ }
57
+ function toBase64(input, url) {
58
+ let bin = '';
59
+ for (const b of input)
60
+ bin += String.fromCharCode(b);
61
+ const b64 = btoa(bin);
62
+ return url ? b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') : b64;
63
+ }
64
+ function hex(input) {
65
+ let out = '';
66
+ for (const b of input)
67
+ out += b.toString(16).padStart(2, '0');
68
+ return out;
69
+ }
70
+ /** Length-safe constant-time comparison of two strings. */
71
+ function sameString(a, b) {
72
+ if (a.length !== b.length)
73
+ return false;
74
+ let diff = 0;
75
+ for (let i = 0; i < a.length; i++)
76
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
77
+ return diff === 0;
78
+ }
79
+ async function hmac(hash, key, data) {
80
+ const k = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash }, false, ['sign']);
81
+ return new Uint8Array(await crypto.subtle.sign('HMAC', k, data));
82
+ }
83
+ async function digest(hash, data) {
84
+ return new Uint8Array(await crypto.subtle.digest(hash, data));
85
+ }
86
+ async function pbkdf2(hash, password, salt, iterations, length) {
87
+ const k = await crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
88
+ return new Uint8Array(await crypto.subtle.deriveBits({ name: 'PBKDF2', hash, salt, iterations }, k, length * 8));
89
+ }
90
+ async function hkdfSha256(ikm, salt, info, length) {
91
+ const k = await crypto.subtle.importKey('raw', ikm, 'HKDF', false, ['deriveBits']);
92
+ return new Uint8Array(await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: bytes(salt), info: bytes(info) }, k, length * 8));
93
+ }
94
+ function asList(value) {
95
+ return (typeof value === 'string' ? [value] : [...value]).filter((v) => typeof v === 'string' && v.length > 0);
96
+ }
97
+ function decodeCookieValue(raw) {
98
+ const value = raw.trim();
99
+ if (!value.includes('%'))
100
+ return value;
101
+ try {
102
+ return decodeURIComponent(value);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ /** Every `name=value` pair of a `Cookie` header (first occurrence wins). */
109
+ function cookieMap(header) {
110
+ const out = new Map();
111
+ if (!header)
112
+ return out;
113
+ for (const part of header.split(';')) {
114
+ const eq = part.indexOf('=');
115
+ if (eq <= 0)
116
+ continue;
117
+ const name = part.slice(0, eq).trim();
118
+ if (!out.has(name))
119
+ out.set(name, part.slice(eq + 1).trim());
120
+ }
121
+ return out;
122
+ }
123
+ // ── Auth.js / NextAuth ──────────────────────────────────────────────────────
124
+ /** Auth.js v5 (`@auth/core`) and NextAuth v4 session cookie names, `__Secure-` first. */
125
+ exports.AUTHJS_SESSION_COOKIES = [
126
+ '__Secure-authjs.session-token',
127
+ 'authjs.session-token',
128
+ '__Secure-next-auth.session-token',
129
+ 'next-auth.session-token',
130
+ ];
131
+ /**
132
+ * The Auth.js session cookie from a `Cookie` header, reassembled when Auth.js
133
+ * split it into `<name>.0`, `<name>.1`, … chunks (it does above ~4 KB). `name`
134
+ * is the base cookie name — the HKDF salt of a v5 JWT. `cookieName` overrides
135
+ * the defaults when the app set `cookies.sessionToken.name`.
136
+ */
137
+ function readAuthJsSessionCookie(cookieHeader, options = {}) {
138
+ const cookies = typeof cookieHeader === 'object' && cookieHeader !== null ? new Map(Object.entries(cookieHeader)) : cookieMap(cookieHeader);
139
+ const names = options.cookieName ? [options.cookieName] : [...exports.AUTHJS_SESSION_COOKIES];
140
+ for (const name of names) {
141
+ const whole = cookies.get(name);
142
+ if (whole)
143
+ return { name, value: whole };
144
+ const chunks = [];
145
+ for (let i = 0; cookies.has(`${name}.${i}`); i++)
146
+ chunks.push(cookies.get(`${name}.${i}`));
147
+ if (chunks.length)
148
+ return { name, value: chunks.join('') };
149
+ }
150
+ return undefined;
151
+ }
152
+ /**
153
+ * Which session strategy produced a cookie value: a five-part compact JWE is a
154
+ * JWT-strategy session; anything else is a database session token (the
155
+ * `sessionToken` column of the adapter's sessions table).
156
+ */
157
+ function authJsSessionTokenKind(value) {
158
+ const v = decodeCookieValue(value);
159
+ if (!v || v.length > 16_384)
160
+ return null;
161
+ if (/^[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]*){4}$/.test(v))
162
+ return 'jwt';
163
+ return /^[A-Za-z0-9_\-.]{8,512}$/.test(v) ? 'database' : null;
164
+ }
165
+ /**
166
+ * Decrypt an Auth.js JWT-strategy session cookie with the app's secret
167
+ * (`AUTH_SECRET` / `NEXTAUTH_SECRET`; pass every rotated secret, newest first).
168
+ *
169
+ * - NextAuth v4: `dir` + `A256GCM`, key = HKDF-SHA256(secret, salt "", info
170
+ * "NextAuth.js Generated Encryption Key", 32 bytes).
171
+ * - Auth.js v5 (`@auth/core`): `dir` + `A256CBC-HS512` (or `A256GCM`), key =
172
+ * HKDF-SHA256(secret, salt = the cookie name, info
173
+ * "Auth.js Generated Encryption Key (<cookie name>)", 64 / 32 bytes).
174
+ *
175
+ * `salt` is the cookie the value came from (from {@link readAuthJsSessionCookie}).
176
+ * The JWT's `exp` is enforced with Auth.js's own 15 s tolerance.
177
+ */
178
+ async function decodeAuthJsSessionToken(token, options) {
179
+ const value = decodeCookieValue(token);
180
+ if (!value || authJsSessionTokenKind(value) !== 'jwt')
181
+ return null;
182
+ let encAlg;
183
+ try {
184
+ const header = (0, jose_1.decodeProtectedHeader)(value);
185
+ if (header.alg !== 'dir')
186
+ return null;
187
+ encAlg = header.enc;
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ if (encAlg !== 'A256GCM' && encAlg !== 'A256CBC-HS512')
193
+ return null;
194
+ const candidates = [];
195
+ for (const secret of asList(options.secret)) {
196
+ const ikm = bytes(secret);
197
+ if (encAlg === 'A256CBC-HS512') {
198
+ candidates.push(await hkdfSha256(ikm, options.salt, `Auth.js Generated Encryption Key (${options.salt})`, 64));
199
+ }
200
+ else {
201
+ candidates.push(await hkdfSha256(ikm, options.salt, `Auth.js Generated Encryption Key (${options.salt})`, 32));
202
+ candidates.push(await hkdfSha256(ikm, '', 'NextAuth.js Generated Encryption Key', 32));
203
+ }
204
+ }
205
+ for (const key of candidates) {
206
+ try {
207
+ const { payload } = await (0, jose_1.jwtDecrypt)(value, key, {
208
+ keyManagementAlgorithms: ['dir'],
209
+ contentEncryptionAlgorithms: [encAlg],
210
+ clockTolerance: 15,
211
+ ...(options.now ? { currentDate: options.now } : {}),
212
+ });
213
+ return payload;
214
+ }
215
+ catch {
216
+ // wrong key, tampered, or expired: try the next secret
217
+ }
218
+ }
219
+ return null;
220
+ }
221
+ // ── express-session (Passport) ──────────────────────────────────────────────
222
+ /** express-session's default cookie name. */
223
+ exports.EXPRESS_SESSION_COOKIE = 'connect.sid';
224
+ /**
225
+ * The session id inside an express-session cookie (`s:<sid>.<signature>`,
226
+ * URL-encoded), where the signature is cookie-signature's
227
+ * base64(HMAC-SHA256(secret, sid)) without padding. With `secrets` (the app's
228
+ * `session({ secret })`, a string or the rotation array) the signature must
229
+ * verify against one of them; without, the id is only parsed — the session id
230
+ * is itself a 24-byte random bearer value, so a store lookup by id is what
231
+ * authenticates it either way.
232
+ */
233
+ async function unsignExpressSessionCookie(raw, secrets) {
234
+ const value = decodeCookieValue(raw);
235
+ if (!value || !value.startsWith('s:') || value.length > 1024)
236
+ return null;
237
+ const body = value.slice(2);
238
+ const dot = body.lastIndexOf('.');
239
+ if (dot <= 0)
240
+ return null;
241
+ const sid = body.slice(0, dot);
242
+ const signature = body.slice(dot + 1);
243
+ if (!/^[A-Za-z0-9_\-+/=]+$/.test(sid))
244
+ return null;
245
+ if (secrets === undefined)
246
+ return sid;
247
+ for (const secret of asList(secrets)) {
248
+ const expected = toBase64(await hmac('SHA-256', bytes(secret), bytes(sid)), false).replace(/=+$/, '');
249
+ if (sameString(expected, signature))
250
+ return sid;
251
+ }
252
+ return null;
253
+ }
254
+ // ── Lucia ───────────────────────────────────────────────────────────────────
255
+ /** Lucia's default session cookie name (v2 and v3). */
256
+ exports.LUCIA_SESSION_COOKIE = 'auth_session';
257
+ /**
258
+ * The id a Lucia session row is stored under, from the cookie's token. Lucia
259
+ * v2/v3 store the cookie value itself (`none`); the current Lucia guide's
260
+ * session implementation stores `hex(sha256(token))` (`sha256-hex`).
261
+ */
262
+ async function luciaSessionId(token, hashing = 'none') {
263
+ const value = decodeCookieValue(token);
264
+ if (!value || !/^[A-Za-z0-9_-]{8,256}$/.test(value))
265
+ return null;
266
+ return hashing === 'none' ? value : hex(await digest('SHA-256', bytes(value)));
267
+ }
268
+ // ── iron-session ────────────────────────────────────────────────────────────
269
+ /**
270
+ * Open an iron-session cookie (an `@hapi/iron` `Fe26.2` seal, with iron-session
271
+ * v8's `~2` version suffix) with the app's `password` — a string, or the
272
+ * `{ id: password }` rotation map. Mirrors iron: HMAC-SHA256 integrity and
273
+ * AES-256-CBC, each keyed by PBKDF2-SHA1(password, the seal's salt, 1 iteration,
274
+ * 32 bytes); the seal's own expiry is enforced (60 s skew, as iron does).
275
+ * Returns the session object the app stored.
276
+ */
277
+ async function unsealIronSession(raw, password, options = {}) {
278
+ const value = decodeCookieValue(raw);
279
+ if (!value || value.length > 16_384)
280
+ return null;
281
+ const [seal, version] = value.split('~');
282
+ const parts = (seal ?? '').split('*');
283
+ if (parts.length !== 8 || parts[0] !== 'Fe26.2')
284
+ return null;
285
+ const [, passwordId, encSalt, encIv, encrypted, expiration, hmacSalt, mac] = parts;
286
+ const secret = typeof password === 'string'
287
+ ? passwordId === '' || passwordId === '1'
288
+ ? password
289
+ : undefined
290
+ : password[passwordId || 'default'];
291
+ if (!secret)
292
+ return null;
293
+ const now = (options.now ?? new Date()).getTime();
294
+ if (expiration) {
295
+ const exp = Number(expiration);
296
+ if (!Number.isFinite(exp) || exp <= now - 60_000)
297
+ return null;
298
+ }
299
+ const integrityKey = await pbkdf2('SHA-1', bytes(secret), bytes(hmacSalt), 1, 32);
300
+ const expectedMac = toBase64(await hmac('SHA-256', integrityKey, bytes(parts.slice(0, 6).join('*'))), true);
301
+ if (!sameString(expectedMac, mac))
302
+ return null;
303
+ const iv = fromBase64(encIv);
304
+ const ciphertext = fromBase64(encrypted);
305
+ if (!iv || iv.length !== 16 || !ciphertext)
306
+ return null;
307
+ try {
308
+ const key = await crypto.subtle.importKey('raw', await pbkdf2('SHA-1', bytes(secret), bytes(encSalt), 1, 32), 'AES-CBC', false, ['decrypt']);
309
+ const plain = dec.decode(await crypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, ciphertext));
310
+ const data = JSON.parse(plain);
311
+ // iron-session v8 reads a seal without the `~2` suffix as an older one whose
312
+ // data sits under `persistent`.
313
+ if (version !== '2' && data && typeof data.persistent === 'object' && data.persistent !== null) {
314
+ return data.persistent;
315
+ }
316
+ return data;
317
+ }
318
+ catch {
319
+ return null;
320
+ }
321
+ }
322
+ /** Read `path` (`"user.id"`) out of a session object, as a non-empty string. */
323
+ function sessionValueAt(data, path) {
324
+ let cur = data;
325
+ for (const key of path.split('.')) {
326
+ if (!cur || typeof cur !== 'object')
327
+ return null;
328
+ cur = cur[key];
329
+ }
330
+ if (typeof cur === 'number' && Number.isFinite(cur))
331
+ return String(cur);
332
+ return typeof cur === 'string' && cur.length > 0 ? cur : null;
333
+ }
334
+ // ── Rails cookie store (Devise / Warden) ────────────────────────────────────
335
+ /**
336
+ * Decrypt a Rails encrypted cookie — the session cookie of a Rails app using
337
+ * the default cookie store, which is where Devise (through Warden) keeps the
338
+ * signed-in user. Rails 5.2+ authenticated encryption:
339
+ * `base64(ciphertext)--base64(iv)--base64(auth tag)`, AES-256-GCM, empty AAD,
340
+ * key = PBKDF2(secret_key_base, "authenticated encrypted cookie", 1000
341
+ * iterations, 32 bytes) with SHA-256 (Rails 7 default) or SHA-1 (apps that kept
342
+ * `key_generator_hash_digest_class = SHA1`). Both are tried unless `keyDigest`
343
+ * pins one. The `_rails` envelope's purpose (`cookie.<cookieName>`) and expiry
344
+ * are enforced; JSON-serialized cookies only (`cookies_serializer :json` or
345
+ * `:hybrid` — a Marshal-serialized cookie cannot be read outside Ruby).
346
+ */
347
+ async function decryptRailsCookie(raw, options) {
348
+ const value = decodeCookieValue(raw);
349
+ if (!value || value.length > 16_384)
350
+ return null;
351
+ const parts = value.split('--');
352
+ if (parts.length !== 3)
353
+ return null;
354
+ const [ct, ivPart, tagPart] = parts.map((p) => fromBase64(p));
355
+ if (!ct || !ivPart || !tagPart || ivPart.length !== 12 || tagPart.length !== 16)
356
+ return null;
357
+ const sealed = new Uint8Array(ct.length + tagPart.length);
358
+ sealed.set(ct);
359
+ sealed.set(tagPart, ct.length);
360
+ const digests = options.keyDigest ? [options.keyDigest] : ['SHA-256', 'SHA-1'];
361
+ const salt = options.salt ?? 'authenticated encrypted cookie';
362
+ let plain = null;
363
+ outer: for (const secret of asList(options.secretKeyBase)) {
364
+ for (const d of digests) {
365
+ try {
366
+ const raw = await pbkdf2(d, bytes(secret), bytes(salt), 1000, 32);
367
+ const key = await crypto.subtle.importKey('raw', raw, 'AES-GCM', false, ['decrypt']);
368
+ plain = dec.decode(await crypto.subtle.decrypt({ name: 'AES-GCM', iv: ivPart, additionalData: new Uint8Array(0), tagLength: 128 }, key, sealed));
369
+ break outer;
370
+ }
371
+ catch {
372
+ // wrong key: try the next one
373
+ }
374
+ }
375
+ }
376
+ if (plain === null)
377
+ return null;
378
+ let parsed;
379
+ try {
380
+ parsed = JSON.parse(plain);
381
+ }
382
+ catch {
383
+ return null; // Marshal (or another non-JSON serializer)
384
+ }
385
+ const envelope = parsed?._rails;
386
+ if (!envelope)
387
+ return isRecord(parsed) ? parsed : null;
388
+ if (options.cookieName && envelope.pur != null && envelope.pur !== `cookie.${options.cookieName}`)
389
+ return null;
390
+ if (typeof envelope.exp === 'string' && envelope.exp) {
391
+ const exp = Date.parse(envelope.exp);
392
+ if (!Number.isFinite(exp) || exp <= (options.now ?? new Date()).getTime())
393
+ return null;
394
+ }
395
+ let data = envelope.data;
396
+ if (data === undefined && typeof envelope.message === 'string') {
397
+ const inner = fromBase64(envelope.message);
398
+ if (!inner)
399
+ return null;
400
+ try {
401
+ data = JSON.parse(dec.decode(inner));
402
+ }
403
+ catch {
404
+ return null;
405
+ }
406
+ }
407
+ return isRecord(data) ? data : null;
408
+ }
409
+ function isRecord(v) {
410
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
411
+ }
412
+ /**
413
+ * The Devise user a Rails session holds: Warden stores
414
+ * `warden.user.<scope>.key` = `[[id], authenticatable_salt]`, where the salt is
415
+ * the first 29 characters of the user's bcrypt `encrypted_password` (so a
416
+ * password change signs every session out — check it against the imported
417
+ * hash with {@link deviseSaltMatches}).
418
+ */
419
+ function deviseSessionUser(session, scope = 'user') {
420
+ const entry = session[`warden.user.${scope}.key`];
421
+ if (!Array.isArray(entry) || entry.length < 1)
422
+ return null;
423
+ const ids = entry[0];
424
+ const id = Array.isArray(ids) ? ids[0] : ids;
425
+ const idText = typeof id === 'number' && Number.isFinite(id) ? String(id) : typeof id === 'string' && id ? id : null;
426
+ if (!idText)
427
+ return null;
428
+ return { id: idText, salt: typeof entry[1] === 'string' ? entry[1] : null };
429
+ }
430
+ /** Devise's `authenticatable_salt`: the bcrypt digest's first 29 characters. */
431
+ function deviseSaltMatches(salt, encryptedPassword) {
432
+ if (!salt || !encryptedPassword || encryptedPassword.length < 29)
433
+ return false;
434
+ return sameString(salt, encryptedPassword.slice(0, 29));
435
+ }
436
+ // ── Django ──────────────────────────────────────────────────────────────────
437
+ /** Django's default session cookie name (`SESSION_COOKIE_NAME`). */
438
+ exports.DJANGO_SESSION_COOKIE = 'sessionid';
439
+ const B62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
440
+ function b62decode(s) {
441
+ let n = 0;
442
+ for (const ch of s) {
443
+ const i = B62.indexOf(ch);
444
+ if (i < 0)
445
+ return NaN;
446
+ n = n * 62 + i;
447
+ }
448
+ return n;
449
+ }
450
+ /** Django's `salted_hmac(key_salt, value, secret, algorithm)`. */
451
+ async function djangoSaltedHmac(keySalt, value, secret, algorithm) {
452
+ const hash = algorithm === 'sha256' ? 'SHA-256' : 'SHA-1';
453
+ const key = await digest(hash, bytes(keySalt + secret));
454
+ return hmac(hash, key, bytes(value));
455
+ }
456
+ async function inflate(data) {
457
+ const DS = globalThis.DecompressionStream;
458
+ if (!DS)
459
+ return null;
460
+ try {
461
+ const stream = new Blob([data]).stream().pipeThrough(new DS('deflate'));
462
+ return new Uint8Array(await new Response(stream).arrayBuffer());
463
+ }
464
+ catch {
465
+ return null;
466
+ }
467
+ }
468
+ /**
469
+ * Verify and decode a value made by Django's `signing.dumps` — the session
470
+ * cookie of `SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"`.
471
+ * Format `<payload>:<base62 timestamp>:<signature>`, payload = urlsafe base64 of
472
+ * the JSON (zlib-compressed when it starts with `.`), signature = urlsafe
473
+ * base64 of salted_hmac(salt + "signer", "<payload>:<timestamp>", SECRET_KEY)
474
+ * with SHA-256 (Django ≥ 3.1) or SHA-1 (older). Pass SECRET_KEY first, then
475
+ * SECRET_KEY_FALLBACKS. `maxAgeSeconds` is SESSION_COOKIE_AGE.
476
+ */
477
+ async function decodeDjangoSignedCookie(raw, options) {
478
+ const value = decodeCookieValue(raw)?.replace(/^"|"$/g, '');
479
+ if (!value || value.length > 16_384)
480
+ return null;
481
+ const parts = value.split(':');
482
+ if (parts.length !== 3)
483
+ return null;
484
+ const [payload, ts, signature] = parts;
485
+ const signed = `${payload}:${ts}`;
486
+ const salt = options.salt ?? 'django.contrib.sessions.backends.signed_cookies';
487
+ const algorithms = options.algorithm ? [options.algorithm] : ['sha256', 'sha1'];
488
+ let ok = false;
489
+ for (const secret of asList(options.secretKey)) {
490
+ for (const alg of algorithms) {
491
+ const expected = toBase64(await djangoSaltedHmac(`${salt}signer`, signed, secret, alg), true);
492
+ if (sameString(expected, signature))
493
+ ok = true;
494
+ }
495
+ }
496
+ if (!ok)
497
+ return null;
498
+ const issued = b62decode(ts);
499
+ if (!Number.isFinite(issued))
500
+ return null;
501
+ if (options.maxAgeSeconds !== undefined) {
502
+ const age = (options.now ?? new Date()).getTime() / 1000 - issued;
503
+ if (age > options.maxAgeSeconds)
504
+ return null;
505
+ }
506
+ return decodeDjangoPayload(payload);
507
+ }
508
+ /**
509
+ * Decode a `signing.dumps` payload (the part before the timestamp) WITHOUT
510
+ * verifying it — for rows read out of the app's own `django_session` table.
511
+ */
512
+ async function decodeDjangoPayload(payload) {
513
+ const compressed = payload.startsWith('.');
514
+ const raw = fromBase64(compressed ? payload.slice(1) : payload);
515
+ if (!raw)
516
+ return null;
517
+ const json = compressed ? await inflate(raw) : raw;
518
+ if (!json)
519
+ return null;
520
+ try {
521
+ const data = JSON.parse(dec.decode(json));
522
+ return isRecord(data) ? data : null;
523
+ }
524
+ catch {
525
+ return null;
526
+ }
527
+ }
528
+ /** The signed-in user of a Django session: `_auth_user_id` and `_auth_user_hash`. */
529
+ function djangoSessionUser(data) {
530
+ const id = data._auth_user_id;
531
+ const idText = typeof id === 'number' ? String(id) : typeof id === 'string' && id ? id : null;
532
+ if (!idText)
533
+ return null;
534
+ return { id: idText, hash: typeof data._auth_user_hash === 'string' ? data._auth_user_hash : null };
535
+ }
536
+ /**
537
+ * Django's session auth hash for a user's stored password hash
538
+ * (`AbstractBaseUser.get_session_auth_hash`): hex salted_hmac with SHA-256. A
539
+ * session whose `_auth_user_hash` differs was signed out by a password change.
540
+ */
541
+ async function djangoSessionAuthHash(passwordHash, secretKey) {
542
+ return hex(await djangoSaltedHmac('django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash', passwordHash, secretKey, 'sha256'));
543
+ }
544
+ //# sourceMappingURL=framework-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-sessions.js","sourceRoot":"","sources":["../src/framework-sessions.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,21 @@
1
1
  export * from './jwks-cache';
2
2
  export { DiscoveryError, JwksDiscovery, discoveryUrlFor, instanceIdFromPublishableKey } from './discovery';
3
3
  export * from './verify';
4
+ export * from './request-auth';
4
5
  export * from './recent-auth';
5
6
  export * from './access-control';
6
7
  export * from './handshake';
7
8
  export * from './better-auth';
9
+ export * from './migration-presets';
10
+ export * from './migration-bridge';
11
+ export * from './auth0-session';
12
+ export { looksLikeMagicDidToken, magicDidTokenExtractor } from './magic-did';
13
+ export { workosSessionTokenExtractor } from './workos-session';
8
14
  export { BETTER_AUTH_JWT_ALGS, peekIssuer } from './legacy-issuers';
9
- export type { LegacyIssuer } from './legacy-issuers';
15
+ export type { LegacyIssuer, LegacyIssuerKind } from './legacy-issuers';
16
+ export * from './legacy-issuer-presets';
17
+ export * from './framework-sessions';
18
+ export * from './framework-bridge';
10
19
  export { BACKCHANNEL_LOGOUT_EVENT, LOGOUT_TOKEN_CLOCK_SKEW_SECONDS, LOGOUT_TOKEN_MAX_AGE_SECONDS, LogoutTokenVerifier, memoryLogoutReplayStore, verifyLogoutToken, } from './logout-token';
11
20
  export type { LogoutReplayStore, LogoutTokenCheckOptions, LogoutTokenClaims, LogoutTokenResult, LogoutTokenVerifierOptions, } from './logout-token';
12
21
  export { expressBackchannelLogout, fastifyBackchannelLogout, fastifyBackchannelLogoutPlugin, fetchBackchannelLogout, handleBackchannelLogout, nextBackchannelLogout, readLogoutToken, } from './backchannel-handlers';
@@ -30,3 +39,4 @@ export { requirePCA, defaultExtract, memoryPcaStore } from './pca/require-pca';
30
39
  export type { RequirePcaOptions, PcaGuardResult, PcaRequestLike, PcaStateStore } from './pca/require-pca';
31
40
  export { ACCESS_TOKEN_CLOCK_SKEW_SECONDS, DPOP_PROOF_MAX_AGE_SECONDS, buildWwwAuthenticate, createAccessTokenVerifier, createIntrospector, hmacDpopNonceSource, memoryDpopNonceSource, memoryDpopReplayStore, protectedResourceMetadata, protectedResourceMetadataPath, verifyAccessToken, } from './oauth-resource';
32
41
  export type { AccessTokenClaims, AccessTokenErrorCode, AccessTokenResult, AccessTokenVerifierOptions, DpopNonceSource, DpopReplayStore, IntrospectionOptions, ResourceRequestLike, } from './oauth-resource';
42
+ export * from './legacy-verify';
package/dist/index.js CHANGED
@@ -14,8 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.buildWwwAuthenticate = exports.DPOP_PROOF_MAX_AGE_SECONDS = exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = exports.memoryPcaStore = exports.defaultExtract = exports.requirePCA = exports.verifyPCActn = exports.REFERALLI_API_VERSION = exports.referralEmailHash = exports.referalliSignatureV2 = exports.referalliSignature = exports.signReferralUpdatedEvent = exports.signReferalliCall = exports.signAtlasReferralCall = exports.testTenantClaims = exports.TEST_TOKEN_TAMPERS = exports.createTestIssuer = exports.createAtlasClient = exports.resetOidcCaches = exports.oidcSsoOf = exports.oidcOrganizationsOf = exports.oidcOrganizationOf = exports.oidcVerifyIdToken = exports.oidcStart = exports.oidcLogoutUrl = exports.oidcClearCookie = exports.oidcCallback = exports.oidc = exports.OIDC_FLOW_MAX_AGE_SECONDS = exports.OIDC_FLOW_COOKIE = exports.AtlasOidcError = exports.readLogoutToken = exports.nextBackchannelLogout = exports.handleBackchannelLogout = exports.fetchBackchannelLogout = exports.fastifyBackchannelLogoutPlugin = exports.fastifyBackchannelLogout = exports.expressBackchannelLogout = exports.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.LOGOUT_TOKEN_MAX_AGE_SECONDS = exports.LOGOUT_TOKEN_CLOCK_SKEW_SECONDS = exports.BACKCHANNEL_LOGOUT_EVENT = exports.peekIssuer = exports.BETTER_AUTH_JWT_ALGS = exports.instanceIdFromPublishableKey = exports.discoveryUrlFor = exports.JwksDiscovery = exports.DiscoveryError = void 0;
18
- exports.verifyAccessToken = exports.protectedResourceMetadataPath = exports.protectedResourceMetadata = exports.memoryDpopReplayStore = exports.memoryDpopNonceSource = exports.hmacDpopNonceSource = exports.createIntrospector = exports.createAccessTokenVerifier = void 0;
17
+ exports.memoryPcaStore = exports.defaultExtract = exports.requirePCA = exports.verifyPCActn = exports.REFERALLI_API_VERSION = exports.referralEmailHash = exports.referalliSignatureV2 = exports.referalliSignature = exports.signReferralUpdatedEvent = exports.signReferalliCall = exports.signAtlasReferralCall = exports.testTenantClaims = exports.TEST_TOKEN_TAMPERS = exports.createTestIssuer = exports.createAtlasClient = exports.resetOidcCaches = exports.oidcSsoOf = exports.oidcOrganizationsOf = exports.oidcOrganizationOf = exports.oidcVerifyIdToken = exports.oidcStart = exports.oidcLogoutUrl = exports.oidcClearCookie = exports.oidcCallback = exports.oidc = exports.OIDC_FLOW_MAX_AGE_SECONDS = exports.OIDC_FLOW_COOKIE = exports.AtlasOidcError = exports.readLogoutToken = exports.nextBackchannelLogout = exports.handleBackchannelLogout = exports.fetchBackchannelLogout = exports.fastifyBackchannelLogoutPlugin = exports.fastifyBackchannelLogout = exports.expressBackchannelLogout = exports.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.LOGOUT_TOKEN_MAX_AGE_SECONDS = exports.LOGOUT_TOKEN_CLOCK_SKEW_SECONDS = exports.BACKCHANNEL_LOGOUT_EVENT = exports.peekIssuer = exports.BETTER_AUTH_JWT_ALGS = exports.workosSessionTokenExtractor = exports.magicDidTokenExtractor = exports.looksLikeMagicDidToken = exports.instanceIdFromPublishableKey = exports.discoveryUrlFor = exports.JwksDiscovery = exports.DiscoveryError = void 0;
18
+ exports.verifyAccessToken = exports.protectedResourceMetadataPath = exports.protectedResourceMetadata = exports.memoryDpopReplayStore = exports.memoryDpopNonceSource = exports.hmacDpopNonceSource = exports.createIntrospector = exports.createAccessTokenVerifier = exports.buildWwwAuthenticate = exports.DPOP_PROOF_MAX_AGE_SECONDS = exports.ACCESS_TOKEN_CLOCK_SKEW_SECONDS = void 0;
19
19
  // §7.3 token verification — the original surface, unchanged.
20
20
  __exportStar(require("./jwks-cache"), exports);
21
21
  // OIDC discovery of the JWKS URL when only `issuer` is configured.
@@ -25,14 +25,30 @@ Object.defineProperty(exports, "JwksDiscovery", { enumerable: true, get: functio
25
25
  Object.defineProperty(exports, "discoveryUrlFor", { enumerable: true, get: function () { return discovery_1.discoveryUrlFor; } });
26
26
  Object.defineProperty(exports, "instanceIdFromPublishableKey", { enumerable: true, get: function () { return discovery_1.instanceIdFromPublishableKey; } });
27
27
  __exportStar(require("./verify"), exports);
28
+ __exportStar(require("./request-auth"), exports);
28
29
  __exportStar(require("./recent-auth"), exports);
29
30
  __exportStar(require("./access-control"), exports);
30
31
  __exportStar(require("./handshake"), exports);
31
32
  // Moving from Better Auth: exchange its session cookie once, accept its JWTs for a window.
32
33
  __exportStar(require("./better-auth"), exports);
34
+ // Moving from any vendor: the generic zero-logout bridge and its per-vendor presets.
35
+ __exportStar(require("./migration-presets"), exports);
36
+ __exportStar(require("./migration-bridge"), exports);
37
+ __exportStar(require("./auth0-session"), exports);
38
+ var magic_did_1 = require("./magic-did");
39
+ Object.defineProperty(exports, "looksLikeMagicDidToken", { enumerable: true, get: function () { return magic_did_1.looksLikeMagicDidToken; } });
40
+ Object.defineProperty(exports, "magicDidTokenExtractor", { enumerable: true, get: function () { return magic_did_1.magicDidTokenExtractor; } });
41
+ var workos_session_1 = require("./workos-session");
42
+ Object.defineProperty(exports, "workosSessionTokenExtractor", { enumerable: true, get: function () { return workos_session_1.workosSessionTokenExtractor; } });
33
43
  var legacy_issuers_1 = require("./legacy-issuers");
34
44
  Object.defineProperty(exports, "BETTER_AUTH_JWT_ALGS", { enumerable: true, get: function () { return legacy_issuers_1.BETTER_AUTH_JWT_ALGS; } });
35
45
  Object.defineProperty(exports, "peekIssuer", { enumerable: true, get: function () { return legacy_issuers_1.peekIssuer; } });
46
+ __exportStar(require("./legacy-issuer-presets"), exports);
47
+ // Moving from a self-hosted framework (Auth.js, Lucia, Passport, iron-session,
48
+ // Devise, Django): read the session it left in the browser.
49
+ __exportStar(require("./framework-sessions"), exports);
50
+ // …and their bridge presets + token extractors (registers the presets on load).
51
+ __exportStar(require("./framework-bridge"), exports);
36
52
  // OIDC Back-Channel Logout: verify the logout_token Atlas POSTs to your app.
37
53
  var logout_token_1 = require("./logout-token");
38
54
  Object.defineProperty(exports, "BACKCHANNEL_LOGOUT_EVENT", { enumerable: true, get: function () { return logout_token_1.BACKCHANNEL_LOGOUT_EVENT; } });
@@ -114,4 +130,5 @@ Object.defineProperty(exports, "memoryDpopReplayStore", { enumerable: true, get:
114
130
  Object.defineProperty(exports, "protectedResourceMetadata", { enumerable: true, get: function () { return oauth_resource_1.protectedResourceMetadata; } });
115
131
  Object.defineProperty(exports, "protectedResourceMetadataPath", { enumerable: true, get: function () { return oauth_resource_1.protectedResourceMetadataPath; } });
116
132
  Object.defineProperty(exports, "verifyAccessToken", { enumerable: true, get: function () { return oauth_resource_1.verifyAccessToken; } });
133
+ __exportStar(require("./legacy-verify"), exports);
117
134
  //# sourceMappingURL=index.js.map