@atlasauth/backend 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/better-auth.d.ts +157 -0
- package/dist/better-auth.js +245 -0
- package/dist/better-auth.js.map +1 -0
- package/dist/client/better-auth-imports.d.ts +205 -0
- package/dist/client/better-auth-imports.js +107 -0
- package/dist/client/better-auth-imports.js.map +1 -0
- package/dist/client/index.d.ts +46 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy-issuers.d.ts +65 -0
- package/dist/legacy-issuers.js +140 -0
- package/dist/legacy-issuers.js.map +1 -0
- package/dist/verify.d.ts +22 -0
- package/dist/verify.js +32 -0
- package/dist/verify.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BETTER_AUTH_IMPORT_PART_BYTES = void 0;
|
|
4
|
+
exports.splitBundleParts = splitBundleParts;
|
|
5
|
+
exports.betterAuthImportsResource = betterAuthImportsResource;
|
|
6
|
+
const request_1 = require("./request");
|
|
7
|
+
/** Bytes per uploaded part (the API takes at most 10 MiB). Parts end on a line boundary. */
|
|
8
|
+
exports.BETTER_AUTH_IMPORT_PART_BYTES = 8 * 1024 * 1024;
|
|
9
|
+
/** Split a sealed bundle's text into upload parts on line boundaries. */
|
|
10
|
+
function splitBundleParts(text, maxBytes = exports.BETTER_AUTH_IMPORT_PART_BYTES) {
|
|
11
|
+
const enc8 = new TextEncoder();
|
|
12
|
+
const parts = [];
|
|
13
|
+
let current = [];
|
|
14
|
+
let size = 0;
|
|
15
|
+
for (const line of text.split('\n')) {
|
|
16
|
+
if (!line)
|
|
17
|
+
continue;
|
|
18
|
+
const n = enc8.encode(line).length + 1;
|
|
19
|
+
if (size > 0 && size + n > maxBytes) {
|
|
20
|
+
parts.push(`${current.join('\n')}\n`);
|
|
21
|
+
current = [];
|
|
22
|
+
size = 0;
|
|
23
|
+
}
|
|
24
|
+
current.push(line);
|
|
25
|
+
size += n;
|
|
26
|
+
}
|
|
27
|
+
if (current.length)
|
|
28
|
+
parts.push(`${current.join('\n')}\n`);
|
|
29
|
+
return parts;
|
|
30
|
+
}
|
|
31
|
+
const TERMINAL = ['ready', 'invalid', 'completed', 'failed'];
|
|
32
|
+
function betterAuthImportsResource(request) {
|
|
33
|
+
const base = '/v1/better_auth_imports';
|
|
34
|
+
const self = {
|
|
35
|
+
/** The import public key (created on first read). */
|
|
36
|
+
getPublicKey() {
|
|
37
|
+
return request({ method: 'GET', path: `${base}/public_key` });
|
|
38
|
+
},
|
|
39
|
+
/** Replace the import key; bundles sealed to the old one no longer finalize. */
|
|
40
|
+
rotatePublicKey() {
|
|
41
|
+
return request({ method: 'POST', path: `${base}/public_key/rotate` });
|
|
42
|
+
},
|
|
43
|
+
create(body = {}, idempotencyKey) {
|
|
44
|
+
return request({ method: 'POST', path: base, body, idempotencyKey });
|
|
45
|
+
},
|
|
46
|
+
list(params = {}) {
|
|
47
|
+
return request({ method: 'GET', path: base, query: { ...params } });
|
|
48
|
+
},
|
|
49
|
+
get(id) {
|
|
50
|
+
return request({ method: 'GET', path: `${base}/${(0, request_1.enc)(id)}` });
|
|
51
|
+
},
|
|
52
|
+
/** Upload part `part` (1-based) of the sealed bundle text. */
|
|
53
|
+
uploadPart(id, part, data) {
|
|
54
|
+
return request({ method: 'PUT', path: `${base}/${(0, request_1.enc)(id)}/parts/${part}`, body: { data } });
|
|
55
|
+
},
|
|
56
|
+
/** Close the upload; Atlas checks the key and runs the dry run. */
|
|
57
|
+
finalize(id) {
|
|
58
|
+
return request({ method: 'POST', path: `${base}/${(0, request_1.enc)(id)}/finalize` });
|
|
59
|
+
},
|
|
60
|
+
/** Run the dry run again, optionally with new options. */
|
|
61
|
+
dryRun(id, body = {}) {
|
|
62
|
+
return request({ method: 'POST', path: `${base}/${(0, request_1.enc)(id)}/dry_run`, body });
|
|
63
|
+
},
|
|
64
|
+
/** Import (or resume). Pass confirm_conflicts when the dry run reported conflicts. */
|
|
65
|
+
apply(id, body = {}) {
|
|
66
|
+
return request({ method: 'POST', path: `${base}/${(0, request_1.enc)(id)}/apply`, body });
|
|
67
|
+
},
|
|
68
|
+
delete(id) {
|
|
69
|
+
return request({ method: 'DELETE', path: `${base}/${(0, request_1.enc)(id)}` });
|
|
70
|
+
},
|
|
71
|
+
/** Better Auth JWT keys published in the instance JWKS for the cutover. */
|
|
72
|
+
listJwks() {
|
|
73
|
+
return request({ method: 'GET', path: `${base}/jwks` });
|
|
74
|
+
},
|
|
75
|
+
deleteJwk(kid) {
|
|
76
|
+
return request({ method: 'DELETE', path: `${base}/jwks/${(0, request_1.enc)(kid)}` });
|
|
77
|
+
},
|
|
78
|
+
/** Create an import, upload the sealed bundle text in parts and finalize it. */
|
|
79
|
+
async upload(bundleText, opts = {}) {
|
|
80
|
+
const parts = splitBundleParts(bundleText, opts.partBytes);
|
|
81
|
+
if (parts.length === 0)
|
|
82
|
+
throw new Error('The bundle is empty.');
|
|
83
|
+
const created = await self.create(opts.options ? { options: opts.options } : {});
|
|
84
|
+
for (let i = 0; i < parts.length; i++) {
|
|
85
|
+
await self.uploadPart(created.id, i + 1, parts[i]);
|
|
86
|
+
opts.onPart?.(i + 1, parts.length);
|
|
87
|
+
}
|
|
88
|
+
return self.finalize(created.id);
|
|
89
|
+
},
|
|
90
|
+
/** Poll until the import leaves analyzing / queued / applying. */
|
|
91
|
+
async waitFor(id, opts = {}) {
|
|
92
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
93
|
+
const deadline = Date.now() + (opts.timeoutMs ?? 6 * 3600_000);
|
|
94
|
+
for (;;) {
|
|
95
|
+
const imp = await self.get(id);
|
|
96
|
+
opts.onProgress?.(imp);
|
|
97
|
+
if (TERMINAL.includes(imp.status) || imp.status === 'uploading')
|
|
98
|
+
return imp;
|
|
99
|
+
if (Date.now() > deadline)
|
|
100
|
+
throw new Error(`Timed out waiting for Better Auth import ${id} (status ${imp.status}).`);
|
|
101
|
+
await sleep(opts.intervalMs ?? 2000);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
return self;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=better-auth-imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-auth-imports.js","sourceRoot":"","sources":["../../src/client/better-auth-imports.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -973,6 +973,51 @@ declare function buildNamespaces(request: RequestFn): {
|
|
|
973
973
|
getJob(id: string): Promise<import("./import-export").Job>;
|
|
974
974
|
getJobErrors(id: string): Promise<import("./types").ListPage<import("./import-export").JobError>>;
|
|
975
975
|
};
|
|
976
|
+
betterAuthImports: {
|
|
977
|
+
getPublicKey(): Promise<import("./better-auth-imports").BetterAuthImportKey>;
|
|
978
|
+
rotatePublicKey(): Promise<import("./better-auth-imports").BetterAuthImportKey>;
|
|
979
|
+
create(body?: {
|
|
980
|
+
options?: import("./better-auth-imports").BetterAuthImportOptions;
|
|
981
|
+
}, idempotencyKey?: string): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
982
|
+
list(params?: import("./types").CursorParams): Promise<import("./types").CursorPage<import("./better-auth-imports").BetterAuthImport>>;
|
|
983
|
+
get(id: string): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
984
|
+
uploadPart(id: string, part: number, data: string): Promise<{
|
|
985
|
+
object: "better_auth_import_part";
|
|
986
|
+
import_id: string;
|
|
987
|
+
part: number;
|
|
988
|
+
bytes: number;
|
|
989
|
+
sha256: string;
|
|
990
|
+
}>;
|
|
991
|
+
finalize(id: string): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
992
|
+
dryRun(id: string, body?: {
|
|
993
|
+
options?: import("./better-auth-imports").BetterAuthImportOptions;
|
|
994
|
+
}): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
995
|
+
apply(id: string, body?: {
|
|
996
|
+
confirm_conflicts?: boolean;
|
|
997
|
+
}): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
998
|
+
delete(id: string): Promise<{
|
|
999
|
+
object: "better_auth_import";
|
|
1000
|
+
id: string;
|
|
1001
|
+
deleted: true;
|
|
1002
|
+
}>;
|
|
1003
|
+
listJwks(): Promise<import("./types").CursorPage<import("./better-auth-imports").ImportedJwk>>;
|
|
1004
|
+
deleteJwk(kid: string): Promise<{
|
|
1005
|
+
object: "imported_jwk";
|
|
1006
|
+
kid: string;
|
|
1007
|
+
deleted: true;
|
|
1008
|
+
}>;
|
|
1009
|
+
upload(bundleText: string, opts?: {
|
|
1010
|
+
options?: import("./better-auth-imports").BetterAuthImportOptions;
|
|
1011
|
+
partBytes?: number;
|
|
1012
|
+
onPart?: (n: number, of: number) => void;
|
|
1013
|
+
}): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
1014
|
+
waitFor(id: string, opts?: {
|
|
1015
|
+
intervalMs?: number;
|
|
1016
|
+
timeoutMs?: number;
|
|
1017
|
+
onProgress?: (imp: import("./better-auth-imports").BetterAuthImport) => void;
|
|
1018
|
+
sleep?: (ms: number) => Promise<void>;
|
|
1019
|
+
}): Promise<import("./better-auth-imports").BetterAuthImport>;
|
|
1020
|
+
};
|
|
976
1021
|
dataSubjectRequests: {
|
|
977
1022
|
create(body: import("./data-subject-requests").CreateDataSubjectRequestBody, idempotencyKey?: string): Promise<import("./data-subject-requests").DataSubjectRequest>;
|
|
978
1023
|
cancel(id: string): Promise<import("./data-subject-requests").DataSubjectRequest>;
|
|
@@ -1494,6 +1539,7 @@ export * from './action-gallery';
|
|
|
1494
1539
|
export * from './billing-plans';
|
|
1495
1540
|
export * from './messaging';
|
|
1496
1541
|
export * from './import-export';
|
|
1542
|
+
export * from './better-auth-imports';
|
|
1497
1543
|
export * from './data-subject-requests';
|
|
1498
1544
|
export * from './radius-clients';
|
|
1499
1545
|
export * from './lti-platforms';
|
package/dist/client/index.js
CHANGED
|
@@ -57,6 +57,7 @@ const action_gallery_1 = require("./action-gallery");
|
|
|
57
57
|
const billing_plans_1 = require("./billing-plans");
|
|
58
58
|
const messaging_1 = require("./messaging");
|
|
59
59
|
const import_export_1 = require("./import-export");
|
|
60
|
+
const better_auth_imports_1 = require("./better-auth-imports");
|
|
60
61
|
const data_subject_requests_1 = require("./data-subject-requests");
|
|
61
62
|
const radius_clients_1 = require("./radius-clients");
|
|
62
63
|
const lti_platforms_1 = require("./lti-platforms");
|
|
@@ -151,6 +152,8 @@ function buildNamespaces(request) {
|
|
|
151
152
|
billing: (0, billing_plans_1.billingResource)(request),
|
|
152
153
|
messaging: (0, messaging_1.messagingResource)(request),
|
|
153
154
|
importExport: (0, import_export_1.importExportResource)(request),
|
|
155
|
+
// Migrate from Better Auth: sealed-bundle upload, dry run and resumable apply.
|
|
156
|
+
betterAuthImports: (0, better_auth_imports_1.betterAuthImportsResource)(request),
|
|
154
157
|
dataSubjectRequests: (0, data_subject_requests_1.dataSubjectRequestsResource)(request),
|
|
155
158
|
radiusClients: (0, radius_clients_1.radiusClientsResource)(request),
|
|
156
159
|
ltiPlatforms: (0, lti_platforms_1.ltiPlatformsResource)(request),
|
|
@@ -247,6 +250,7 @@ __exportStar(require("./action-gallery"), exports);
|
|
|
247
250
|
__exportStar(require("./billing-plans"), exports);
|
|
248
251
|
__exportStar(require("./messaging"), exports);
|
|
249
252
|
__exportStar(require("./import-export"), exports);
|
|
253
|
+
__exportStar(require("./better-auth-imports"), exports);
|
|
250
254
|
__exportStar(require("./data-subject-requests"), exports);
|
|
251
255
|
__exportStar(require("./radius-clients"), exports);
|
|
252
256
|
__exportStar(require("./lti-platforms"), exports);
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ export { DiscoveryError, JwksDiscovery, discoveryUrlFor, instanceIdFromPublishab
|
|
|
3
3
|
export * from './verify';
|
|
4
4
|
export * from './access-control';
|
|
5
5
|
export * from './handshake';
|
|
6
|
+
export * from './better-auth';
|
|
7
|
+
export { BETTER_AUTH_JWT_ALGS, peekIssuer } from './legacy-issuers';
|
|
8
|
+
export type { LegacyIssuer } from './legacy-issuers';
|
|
6
9
|
export { BACKCHANNEL_LOGOUT_EVENT, LOGOUT_TOKEN_CLOCK_SKEW_SECONDS, LOGOUT_TOKEN_MAX_AGE_SECONDS, LogoutTokenVerifier, memoryLogoutReplayStore, verifyLogoutToken, } from './logout-token';
|
|
7
10
|
export type { LogoutReplayStore, LogoutTokenCheckOptions, LogoutTokenClaims, LogoutTokenResult, LogoutTokenVerifierOptions, } from './logout-token';
|
|
8
11
|
export { AtlasOidcError, OIDC_FLOW_COOKIE, OIDC_FLOW_MAX_AGE_SECONDS, oidc, oidcCallback, oidcClearCookie, oidcLogoutUrl, oidcStart, oidcVerifyIdToken, resetOidcCaches, } from './oidc';
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ 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.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 = exports.memoryPcaStore = exports.defaultExtract = exports.requirePCA = exports.verifyPCActn = exports.REFERALLY_API_VERSION = exports.referralEmailHash = exports.referallySignature = exports.signReferralUpdatedEvent = exports.signReferallyCall = exports.signAtlasReferralCall = exports.TEST_TOKEN_TAMPERS = exports.createTestIssuer = exports.createAtlasClient = exports.resetOidcCaches = 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.verifyLogoutToken = exports.memoryLogoutReplayStore = exports.LogoutTokenVerifier = exports.LOGOUT_TOKEN_MAX_AGE_SECONDS = exports.LOGOUT_TOKEN_CLOCK_SKEW_SECONDS = exports.BACKCHANNEL_LOGOUT_EVENT = exports.instanceIdFromPublishableKey = exports.discoveryUrlFor = exports.JwksDiscovery = exports.DiscoveryError = void 0;
|
|
17
|
+
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 = exports.memoryPcaStore = exports.defaultExtract = exports.requirePCA = exports.verifyPCActn = exports.REFERALLY_API_VERSION = exports.referralEmailHash = exports.referallySignature = exports.signReferralUpdatedEvent = exports.signReferallyCall = exports.signAtlasReferralCall = exports.TEST_TOKEN_TAMPERS = exports.createTestIssuer = exports.createAtlasClient = exports.resetOidcCaches = 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.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
18
|
// §7.3 token verification — the original surface, unchanged.
|
|
19
19
|
__exportStar(require("./jwks-cache"), exports);
|
|
20
20
|
// OIDC discovery of the JWKS URL when only `issuer` is configured.
|
|
@@ -26,6 +26,11 @@ Object.defineProperty(exports, "instanceIdFromPublishableKey", { enumerable: tru
|
|
|
26
26
|
__exportStar(require("./verify"), exports);
|
|
27
27
|
__exportStar(require("./access-control"), exports);
|
|
28
28
|
__exportStar(require("./handshake"), exports);
|
|
29
|
+
// Moving from Better Auth: exchange its session cookie once, accept its JWTs for a window.
|
|
30
|
+
__exportStar(require("./better-auth"), exports);
|
|
31
|
+
var legacy_issuers_1 = require("./legacy-issuers");
|
|
32
|
+
Object.defineProperty(exports, "BETTER_AUTH_JWT_ALGS", { enumerable: true, get: function () { return legacy_issuers_1.BETTER_AUTH_JWT_ALGS; } });
|
|
33
|
+
Object.defineProperty(exports, "peekIssuer", { enumerable: true, get: function () { return legacy_issuers_1.peekIssuer; } });
|
|
29
34
|
// OIDC Back-Channel Logout: verify the logout_token Atlas POSTs to your app.
|
|
30
35
|
var logout_token_1 = require("./logout-token");
|
|
31
36
|
Object.defineProperty(exports, "BACKCHANNEL_LOGOUT_EVENT", { enumerable: true, get: function () { return logout_token_1.BACKCHANNEL_LOGOUT_EVENT; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,mDAAiC;AACjC,8CAA4B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,mDAAiC;AACjC,8CAA4B;AAC5B,2FAA2F;AAC3F,gDAA8B;AAC9B,mDAAoE;AAA3D,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAGzC,6EAA6E;AAC7E,+CAOwB;AANtB,wHAAA,wBAAwB,OAAA;AACxB,+HAAA,+BAA+B,OAAA;AAC/B,4HAAA,4BAA4B,OAAA;AAC5B,mHAAA,mBAAmB,OAAA;AACnB,uHAAA,uBAAuB,OAAA;AACvB,iHAAA,iBAAiB,OAAA;AAUnB,sEAAsE;AACtE,iFAAiF;AACjF,+BAWgB;AAVd,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,iHAAA,yBAAyB,OAAA;AACzB,4FAAA,IAAI,OAAA;AACJ,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,iGAAA,SAAS,OAAA;AACT,yGAAA,iBAAiB,OAAA;AACjB,uGAAA,eAAe,OAAA;AAcjB,oDAAoD;AACpD,6CAA2B;AAE3B,uFAAuF;AACvF,8CAA4B;AAE5B,0FAA0F;AAC1F,0CAAwB;AAExB,8DAA8D;AAC9D,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAE1B,2CAAyB;AAEzB,yEAAyE;AACzE,2EAA2E;AAC3E,iEAAiE;AACjE,qCAAiE;AAAxD,2GAAA,gBAAgB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAS7C,6DAO+B;AAN7B,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AACjB,+HAAA,wBAAwB,OAAA;AACxB,yHAAA,kBAAkB,OAAA;AAClB,wHAAA,iBAAiB,OAAA;AACjB,4HAAA,qBAAqB,OAAA;AAWvB,wFAAwF;AACxF,2CAA2C;AAC3C,uCAA4C;AAAnC,sGAAA,YAAY,OAAA;AAErB,iDAA+E;AAAtE,yGAAA,UAAU,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAGnD,8EAA8E;AAC9E,gFAAgF;AAChF,mDAY0B;AAXxB,iIAAA,+BAA+B,OAAA;AAC/B,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,2HAAA,yBAAyB,OAAA;AACzB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,uHAAA,qBAAqB,OAAA;AACrB,2HAAA,yBAAyB,OAAA;AACzB,+HAAA,6BAA6B,OAAA;AAC7B,mHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type Jwks } from './jwks-cache';
|
|
2
|
+
/**
|
|
3
|
+
* Accepting your OLD auth provider's JWTs during a cutover — today, Better
|
|
4
|
+
* Auth's `jwt` plugin tokens.
|
|
5
|
+
*
|
|
6
|
+
* When you move to Atlas, API clients may still hold short-lived JWTs your
|
|
7
|
+
* Better Auth app minted. With `legacyIssuers` on an {@link AtlasBackend}, a
|
|
8
|
+
* token whose `iss` is one of these issuers is verified against THAT issuer's
|
|
9
|
+
* key set (the JWKS you imported into Atlas, or the old app's `/api/auth/jwks`)
|
|
10
|
+
* for a bounded window, and its `sub` (the Better Auth user id) is mapped to the
|
|
11
|
+
* Atlas user id — Atlas keeps the Better Auth id as the user's `external_id`.
|
|
12
|
+
* After `until`, those tokens are refused like any other foreign token.
|
|
13
|
+
*/
|
|
14
|
+
export interface LegacyIssuer {
|
|
15
|
+
/** The old provider. Only `better_auth` today. */
|
|
16
|
+
kind?: 'better_auth';
|
|
17
|
+
/** The `iss` the old tokens carry (Better Auth: its `baseURL`, unless `jwt.issuer` was set). */
|
|
18
|
+
issuer: string;
|
|
19
|
+
/** The imported key set. Exactly one of `jwks` / `jwksUrl`. */
|
|
20
|
+
jwks?: Jwks;
|
|
21
|
+
/** Where to fetch the old key set (e.g. `https://app.example.com/api/auth/jwks`). */
|
|
22
|
+
jwksUrl?: string;
|
|
23
|
+
/** Expected `aud` (Better Auth: its `baseURL`, unless `jwt.audience` was set). Unchecked when unset. */
|
|
24
|
+
audience?: string | readonly string[];
|
|
25
|
+
/** The end of the acceptance window. Required: a legacy issuer is never accepted forever. */
|
|
26
|
+
until: Date | string | number;
|
|
27
|
+
/** Signing algorithms to accept. Default: Better Auth's (EdDSA, ES256, ES512, RS256, PS256). */
|
|
28
|
+
algorithms?: readonly string[];
|
|
29
|
+
/**
|
|
30
|
+
* Map the old `sub` to the Atlas user id. Default: look the user up by
|
|
31
|
+
* `external_id` through the Backend API (needs `secretKey` + `bapiBaseUrl`
|
|
32
|
+
* on the backend), cached in memory. Return null to refuse the token.
|
|
33
|
+
*/
|
|
34
|
+
resolveSubject?: (legacySub: string, claims: Record<string, unknown>) => Promise<string | null> | string | null;
|
|
35
|
+
}
|
|
36
|
+
/** Better Auth's `jwt` plugin key algorithms. */
|
|
37
|
+
export declare const BETTER_AUTH_JWT_ALGS: string[];
|
|
38
|
+
export interface LegacyVerifierDeps {
|
|
39
|
+
issuers: readonly LegacyIssuer[];
|
|
40
|
+
secretKey?: string;
|
|
41
|
+
bapiBaseUrl?: string;
|
|
42
|
+
fetchImpl?: typeof fetch;
|
|
43
|
+
now?: () => number;
|
|
44
|
+
clockToleranceSeconds: number;
|
|
45
|
+
}
|
|
46
|
+
export type LegacyVerifyOutcome = {
|
|
47
|
+
ok: true;
|
|
48
|
+
claims: Record<string, unknown>;
|
|
49
|
+
} | {
|
|
50
|
+
ok: false;
|
|
51
|
+
reason: 'invalid' | 'no_keys';
|
|
52
|
+
};
|
|
53
|
+
/** The unverified `iss` of a compact JWT, for routing only — never trusted on its own. */
|
|
54
|
+
export declare function peekIssuer(token: string): string | undefined;
|
|
55
|
+
export declare class LegacyIssuerVerifier {
|
|
56
|
+
private readonly deps;
|
|
57
|
+
private readonly caches;
|
|
58
|
+
private readonly subjects;
|
|
59
|
+
constructor(deps: LegacyVerifierDeps);
|
|
60
|
+
private get now();
|
|
61
|
+
/** The configured entry for this `iss`, when its window is still open. */
|
|
62
|
+
match(iss: string | undefined): LegacyIssuer | undefined;
|
|
63
|
+
verify(token: string, entry: LegacyIssuer): Promise<LegacyVerifyOutcome>;
|
|
64
|
+
private resolve;
|
|
65
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LegacyIssuerVerifier = exports.BETTER_AUTH_JWT_ALGS = void 0;
|
|
4
|
+
exports.peekIssuer = peekIssuer;
|
|
5
|
+
const jose_1 = require("jose");
|
|
6
|
+
const jwks_cache_1 = require("./jwks-cache");
|
|
7
|
+
/** Better Auth's `jwt` plugin key algorithms. */
|
|
8
|
+
exports.BETTER_AUTH_JWT_ALGS = ['EdDSA', 'ES256', 'ES512', 'RS256', 'PS256'];
|
|
9
|
+
/** How long a resolved sub → Atlas id mapping is reused. */
|
|
10
|
+
const SUBJECT_TTL_MS = 5 * 60_000;
|
|
11
|
+
/** Cap on cached subjects, so a stream of distinct tokens can't grow memory without bound. */
|
|
12
|
+
const SUBJECT_CACHE_MAX = 10_000;
|
|
13
|
+
/** The unverified `iss` of a compact JWT, for routing only — never trusted on its own. */
|
|
14
|
+
function peekIssuer(token) {
|
|
15
|
+
try {
|
|
16
|
+
const iss = (0, jose_1.decodeJwt)(token).iss;
|
|
17
|
+
return typeof iss === 'string' ? iss : undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function untilMs(until) {
|
|
24
|
+
const t = until instanceof Date ? until.getTime() : typeof until === 'number' ? until : Date.parse(until);
|
|
25
|
+
return Number.isFinite(t) ? t : 0;
|
|
26
|
+
}
|
|
27
|
+
class LegacyIssuerVerifier {
|
|
28
|
+
deps;
|
|
29
|
+
caches = new Map();
|
|
30
|
+
subjects = new Map();
|
|
31
|
+
constructor(deps) {
|
|
32
|
+
this.deps = deps;
|
|
33
|
+
for (const entry of deps.issuers) {
|
|
34
|
+
const hasUrl = typeof entry.jwksUrl === 'string' && entry.jwksUrl.length > 0;
|
|
35
|
+
if (hasUrl === (entry.jwks !== undefined)) {
|
|
36
|
+
throw new Error(`legacyIssuers: "${entry.issuer}" needs exactly one of \`jwks\` or \`jwksUrl\`.`);
|
|
37
|
+
}
|
|
38
|
+
if (!entry.issuer)
|
|
39
|
+
throw new Error('legacyIssuers: every entry needs `issuer`.');
|
|
40
|
+
if (!untilMs(entry.until))
|
|
41
|
+
throw new Error(`legacyIssuers: "${entry.issuer}" needs a valid \`until\` (the end of the window).`);
|
|
42
|
+
if (!entry.resolveSubject && (!deps.secretKey || !deps.bapiBaseUrl)) {
|
|
43
|
+
throw new Error(`legacyIssuers: "${entry.issuer}" maps its \`sub\` to an Atlas user through the Backend API, which needs \`secretKey\` and \`bapiBaseUrl\` on AtlasBackend — or give the issuer a \`resolveSubject\`.`);
|
|
44
|
+
}
|
|
45
|
+
this.caches.set(entry.issuer, new jwks_cache_1.JwksCache({
|
|
46
|
+
url: hasUrl ? entry.jwksUrl : undefined,
|
|
47
|
+
staticJwks: entry.jwks,
|
|
48
|
+
fetchImpl: deps.fetchImpl,
|
|
49
|
+
now: deps.now,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
get now() {
|
|
54
|
+
return (this.deps.now ?? Date.now)();
|
|
55
|
+
}
|
|
56
|
+
/** The configured entry for this `iss`, when its window is still open. */
|
|
57
|
+
match(iss) {
|
|
58
|
+
if (!iss)
|
|
59
|
+
return undefined;
|
|
60
|
+
const entry = this.deps.issuers.find((e) => e.issuer === iss);
|
|
61
|
+
if (!entry)
|
|
62
|
+
return undefined;
|
|
63
|
+
return untilMs(entry.until) > this.now ? entry : undefined;
|
|
64
|
+
}
|
|
65
|
+
async verify(token, entry) {
|
|
66
|
+
const cache = this.caches.get(entry.issuer);
|
|
67
|
+
const keys = await cache.get((0, jwks_cache_1.readKid)(token));
|
|
68
|
+
if (!keys || keys.keys.length === 0)
|
|
69
|
+
return { ok: false, reason: 'no_keys' };
|
|
70
|
+
let payload;
|
|
71
|
+
try {
|
|
72
|
+
const verified = await (0, jose_1.jwtVerify)(token, (0, jose_1.createLocalJWKSet)(keys), {
|
|
73
|
+
algorithms: [...(entry.algorithms ?? exports.BETTER_AUTH_JWT_ALGS)],
|
|
74
|
+
issuer: entry.issuer,
|
|
75
|
+
...(entry.audience !== undefined ? { audience: entry.audience } : {}),
|
|
76
|
+
clockTolerance: this.deps.clockToleranceSeconds,
|
|
77
|
+
currentDate: this.deps.now ? new Date(this.deps.now()) : undefined,
|
|
78
|
+
});
|
|
79
|
+
payload = verified.payload;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { ok: false, reason: 'invalid' };
|
|
83
|
+
}
|
|
84
|
+
// A legacy token without an expiry would outlive the window it is accepted in.
|
|
85
|
+
if (typeof payload.exp !== 'number')
|
|
86
|
+
return { ok: false, reason: 'invalid' };
|
|
87
|
+
const legacySub = typeof payload.sub === 'string' && payload.sub ? payload.sub : typeof payload.id === 'string' ? payload.id : '';
|
|
88
|
+
if (!legacySub)
|
|
89
|
+
return { ok: false, reason: 'invalid' };
|
|
90
|
+
const atlasId = await this.resolve(legacySub, payload, entry);
|
|
91
|
+
if (!atlasId)
|
|
92
|
+
return { ok: false, reason: 'invalid' };
|
|
93
|
+
return {
|
|
94
|
+
ok: true,
|
|
95
|
+
claims: {
|
|
96
|
+
...payload,
|
|
97
|
+
sub: atlasId,
|
|
98
|
+
sid: typeof payload.sid === 'string' ? payload.sid : '',
|
|
99
|
+
external_id: legacySub,
|
|
100
|
+
legacy: { kind: entry.kind ?? 'better_auth', issuer: entry.issuer, sub: legacySub },
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async resolve(legacySub, claims, entry) {
|
|
105
|
+
if (entry.resolveSubject) {
|
|
106
|
+
try {
|
|
107
|
+
return (await entry.resolveSubject(legacySub, claims)) || null;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const key = `${entry.issuer}\u0000${legacySub}`;
|
|
114
|
+
const hit = this.subjects.get(key);
|
|
115
|
+
if (hit && this.now - hit.at < SUBJECT_TTL_MS)
|
|
116
|
+
return hit.id;
|
|
117
|
+
let id = null;
|
|
118
|
+
try {
|
|
119
|
+
const url = new URL('/v1/users', this.deps.bapiBaseUrl);
|
|
120
|
+
url.searchParams.set('external_id', legacySub);
|
|
121
|
+
url.searchParams.set('limit', '1');
|
|
122
|
+
const res = await (this.deps.fetchImpl ?? fetch)(url.toString(), {
|
|
123
|
+
headers: { authorization: `Bearer ${this.deps.secretKey}` },
|
|
124
|
+
});
|
|
125
|
+
if (!res.ok)
|
|
126
|
+
return null; // not cached: a transient failure should not stick
|
|
127
|
+
const body = (await res.json());
|
|
128
|
+
id = body.data?.[0]?.id ?? null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
if (this.subjects.size >= SUBJECT_CACHE_MAX)
|
|
134
|
+
this.subjects.clear();
|
|
135
|
+
this.subjects.set(key, { id, at: this.now });
|
|
136
|
+
return id;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.LegacyIssuerVerifier = LegacyIssuerVerifier;
|
|
140
|
+
//# sourceMappingURL=legacy-issuers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-issuers.js","sourceRoot":"","sources":["../src/legacy-issuers.ts"],"names":[],"mappings":"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"}
|
package/dist/verify.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface AtlasBackendOidc {
|
|
|
17
17
|
clearCookie: typeof oidcClearCookie;
|
|
18
18
|
}
|
|
19
19
|
export { type AuthzClaims, type ProtectCondition, type ProtectOutcome, type ProtectReason, evaluate, hasFromClaims, protectFromClaims, ForbiddenError, isRoleKey, isPermissionKey, } from '@atlasauth/authz';
|
|
20
|
+
import { type LegacyIssuer } from './legacy-issuers';
|
|
20
21
|
/**
|
|
21
22
|
* §7.3 verification by customer backends.
|
|
22
23
|
*
|
|
@@ -89,6 +90,16 @@ export interface SessionClaims {
|
|
|
89
90
|
* `email` under the same opt-in, and only when the user carries one.
|
|
90
91
|
*/
|
|
91
92
|
external_id?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Present ONLY on a token accepted through `legacyIssuers` (a cutover from
|
|
95
|
+
* another provider): which issuer minted it and the subject it carried there.
|
|
96
|
+
* `sub` is already the Atlas user id.
|
|
97
|
+
*/
|
|
98
|
+
legacy?: {
|
|
99
|
+
kind: string;
|
|
100
|
+
issuer: string;
|
|
101
|
+
sub: string;
|
|
102
|
+
};
|
|
92
103
|
[claim: string]: unknown;
|
|
93
104
|
}
|
|
94
105
|
/**
|
|
@@ -175,10 +186,21 @@ export interface AtlasBackendOptions {
|
|
|
175
186
|
bapiBaseUrl?: string;
|
|
176
187
|
fetchImpl?: typeof fetch;
|
|
177
188
|
now?: () => number;
|
|
189
|
+
/**
|
|
190
|
+
* Cutover from another auth provider (Better Auth): ALSO accept JWTs from
|
|
191
|
+
* these issuers until each one's `until`, verified against that issuer's own
|
|
192
|
+
* key set, with `sub` mapped to the Atlas user id (the old id is the user's
|
|
193
|
+
* `external_id`; mapped through the Backend API unless the issuer has a
|
|
194
|
+
* `resolveSubject`). The verified claims carry `sub` = the Atlas user id,
|
|
195
|
+
* `external_id` = the old id and `legacy` = `{ kind, issuer, sub }`, so code
|
|
196
|
+
* that needs to tell the two apart can. Atlas tokens are unaffected.
|
|
197
|
+
*/
|
|
198
|
+
legacyIssuers?: readonly LegacyIssuer[];
|
|
178
199
|
}
|
|
179
200
|
export declare class AtlasBackend {
|
|
180
201
|
private readonly options;
|
|
181
202
|
private readonly jwks;
|
|
203
|
+
private readonly legacy?;
|
|
182
204
|
/**
|
|
183
205
|
* The server-side OIDC relying party (hosted-redirect sign-in) for this
|
|
184
206
|
* instance: `start`, `callback`, `logoutUrl`, `verifyIdToken`. `issuer`,
|
package/dist/verify.js
CHANGED
|
@@ -24,6 +24,7 @@ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: functi
|
|
|
24
24
|
Object.defineProperty(exports, "isRoleKey", { enumerable: true, get: function () { return authz_2.isRoleKey; } });
|
|
25
25
|
Object.defineProperty(exports, "isPermissionKey", { enumerable: true, get: function () { return authz_2.isPermissionKey; } });
|
|
26
26
|
const algs_1 = require("./algs");
|
|
27
|
+
const legacy_issuers_1 = require("./legacy-issuers");
|
|
27
28
|
/**
|
|
28
29
|
* §7.3 verification by customer backends.
|
|
29
30
|
*
|
|
@@ -64,6 +65,7 @@ function authorized(claims) {
|
|
|
64
65
|
class AtlasBackend {
|
|
65
66
|
options;
|
|
66
67
|
jwks;
|
|
68
|
+
legacy;
|
|
67
69
|
/**
|
|
68
70
|
* The server-side OIDC relying party (hosted-redirect sign-in) for this
|
|
69
71
|
* instance: `start`, `callback`, `logoutUrl`, `verifyIdToken`. `issuer`,
|
|
@@ -110,6 +112,19 @@ class AtlasBackend {
|
|
|
110
112
|
verifyIdToken: (token, o) => (0, oidc_1.oidcVerifyIdToken)(token, bind(o)),
|
|
111
113
|
clearCookie: oidc_1.oidcClearCookie,
|
|
112
114
|
};
|
|
115
|
+
if (options.legacyIssuers && options.legacyIssuers.length > 0) {
|
|
116
|
+
if (options.legacyIssuers.some((l) => l.issuer === options.issuer)) {
|
|
117
|
+
throw new Error('AtlasBackend: a legacy issuer cannot be the Atlas `issuer` itself.');
|
|
118
|
+
}
|
|
119
|
+
this.legacy = new legacy_issuers_1.LegacyIssuerVerifier({
|
|
120
|
+
issuers: options.legacyIssuers,
|
|
121
|
+
secretKey: options.secretKey,
|
|
122
|
+
bapiBaseUrl: options.bapiBaseUrl,
|
|
123
|
+
fetchImpl: options.fetchImpl,
|
|
124
|
+
now: options.now,
|
|
125
|
+
clockToleranceSeconds: exports.CLOCK_SKEW_SECONDS,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
113
128
|
this.jwks = new jwks_cache_1.JwksCache({
|
|
114
129
|
url: hasUrl ? options.jwksUrl : undefined,
|
|
115
130
|
staticJwks: options.jwks,
|
|
@@ -137,6 +152,23 @@ class AtlasBackend {
|
|
|
137
152
|
async verify(token) {
|
|
138
153
|
if (!token || token.split('.').length !== 3)
|
|
139
154
|
return { ok: false, reason: 'malformed' };
|
|
155
|
+
// A token from a configured legacy issuer (within its window) is verified
|
|
156
|
+
// against THAT issuer's keys only — never the Atlas keys, and an Atlas
|
|
157
|
+
// token never reaches the legacy path (the `iss` routes, the signature decides).
|
|
158
|
+
if (this.legacy) {
|
|
159
|
+
const entry = this.legacy.match((0, legacy_issuers_1.peekIssuer)(token));
|
|
160
|
+
if (entry) {
|
|
161
|
+
const outcome = await this.legacy.verify(token, entry);
|
|
162
|
+
if (!outcome.ok)
|
|
163
|
+
return { ok: false, reason: outcome.reason };
|
|
164
|
+
const claims = outcome.claims;
|
|
165
|
+
if (this.options.authorizedParties?.length && claims.azp !== undefined) {
|
|
166
|
+
if (!this.options.authorizedParties.includes(claims.azp))
|
|
167
|
+
return { ok: false, reason: 'unauthorized_party' };
|
|
168
|
+
}
|
|
169
|
+
return authorized(claims);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
140
172
|
const keys = await this.jwks.get((0, jwks_cache_1.readKid)(token));
|
|
141
173
|
if (!keys || keys.keys.length === 0) {
|
|
142
174
|
return this.jwks.lastError
|