@idp.global/sdk 19.2.1 → 19.4.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 +58 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_browser/classes.idpclient.js +1 -1
- package/dist_ts_browser/classes.idprequests.js +1 -1
- package/dist_ts_browser/classes.relyingpartybearerclient.d.ts +276 -0
- package/dist_ts_browser/classes.relyingpartybearerclient.js +591 -0
- package/dist_ts_browser/index.d.ts +1 -0
- package/dist_ts_browser/index.js +2 -1
- package/dist_ts_browser/plugins.js +1 -1
- package/dist_ts_browser/secret-delivery.js +1 -1
- package/dist_ts_relyingparty/classes.authorityobserver.d.ts +23 -0
- package/dist_ts_relyingparty/classes.authorityobserver.js +68 -13
- package/dist_ts_relyingparty/classes.errors.d.ts +11 -1
- package/dist_ts_relyingparty/classes.errors.js +6 -1
- package/dist_ts_relyingparty/classes.relyingpartyroutes.d.ts +74 -2
- package/dist_ts_relyingparty/classes.relyingpartyroutes.js +289 -14
- package/dist_ts_relyingparty/classes.relyingpartysessions.d.ts +209 -7
- package/dist_ts_relyingparty/classes.relyingpartysessions.js +734 -87
- package/dist_ts_relyingparty/classes.rpmodels.d.ts +71 -8
- package/dist_ts_relyingparty/classes.rpmodels.js +224 -10
- package/dist_ts_relyingparty/contract.bearer.d.ts +82 -0
- package/dist_ts_relyingparty/contract.bearer.js +9 -0
- package/dist_ts_relyingparty/helpers.bearer.d.ts +48 -0
- package/dist_ts_relyingparty/helpers.bearer.js +199 -0
- package/dist_ts_relyingparty/index.d.ts +1 -0
- package/dist_ts_relyingparty/index.js +2 -1
- package/dist_ts_relyingparty/interfaces.d.ts +122 -2
- package/dist_ts_relyingparty/testing.d.ts +22 -0
- package/dist_ts_relyingparty/testing.js +42 -1
- package/package.json +9 -11
- package/readme.md +353 -8
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_browser/classes.relyingpartybearerclient.ts +821 -0
- package/ts_browser/index.ts +1 -0
- package/ts_relyingparty/classes.authorityobserver.ts +80 -12
- package/ts_relyingparty/classes.errors.ts +16 -1
- package/ts_relyingparty/classes.relyingpartyroutes.ts +340 -16
- package/ts_relyingparty/classes.relyingpartysessions.ts +907 -94
- package/ts_relyingparty/classes.rpmodels.ts +131 -9
- package/ts_relyingparty/contract.bearer.ts +99 -0
- package/ts_relyingparty/helpers.bearer.ts +259 -0
- package/ts_relyingparty/index.ts +1 -0
- package/ts_relyingparty/interfaces.ts +144 -2
- package/ts_relyingparty/testing.ts +60 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SecretBox } from './classes.secretbox.js';
|
|
2
2
|
import { AuthorityTokenError, LoginCallbackError, RelyingPartyError, RelyingPartyRefusal, } from './classes.errors.js';
|
|
3
3
|
import { OIDC_PROMPTS, OidcCompletionError, OidcRefreshRefusedError, } from './classes.idpoidcprovider.js';
|
|
4
|
+
import { isBearerClientKind, isBearerClientState, isBearerReturnTargetAllowed, isPkceChallenge, isPkceVerifier, normalizeBearerReturnTargets, parseBearerAuthorization, verifyPkceChallenge, } from './helpers.bearer.js';
|
|
4
5
|
import { parseCookies, serializeClearedCookie, serializeCookie } from './helpers.cookies.js';
|
|
5
6
|
import { deriveCsrfToken, randomToken, sha256, timingSafeEqualString } from './helpers.crypto.js';
|
|
6
7
|
import { sanitizeReturnPath } from './helpers.returnpath.js';
|
|
@@ -14,10 +15,22 @@ const SESSION_TOUCH_INTERVAL_MS = 60_000;
|
|
|
14
15
|
export const LOGIN_ATTEMPT_MAX_AGE_SECONDS = 10 * 60;
|
|
15
16
|
/** The longest intent a login carries (`IRelyingPartyLoginOptions.intent`), in characters. */
|
|
16
17
|
export const RELYING_PARTY_MAX_INTENT_LENGTH = 4_096;
|
|
17
|
-
/** Attempts are swept once they are this much older than their expiry. */
|
|
18
|
+
/** Attempts — and bearer hand-offs, token generations and sessions — are swept once they are this much older than their expiry. */
|
|
18
19
|
const LOGIN_ATTEMPT_SWEEP_GRACE_MS = 60 * 60 * 1_000;
|
|
19
20
|
/** How many of them one sign-in removes; the next sign-in takes the following page. */
|
|
20
21
|
const LOGIN_ATTEMPT_SWEEP_BATCH = 100;
|
|
22
|
+
/** How many sessions one page of `sessionsOfPrincipal` holds unless its `limit` says otherwise. */
|
|
23
|
+
export const RELYING_PARTY_DEFAULT_SESSIONS_PAGE_LIMIT = 100;
|
|
24
|
+
/** The largest `limit` of `sessionsOfPrincipal`; the store reads no larger page. */
|
|
25
|
+
export const RELYING_PARTY_MAX_SESSIONS_PAGE_LIMIT = 1_000;
|
|
26
|
+
/** A `sessionsOfPrincipal` cursor is a short base64url text; anything far longer is none. */
|
|
27
|
+
const MAX_SESSIONS_CURSOR_LENGTH = 512;
|
|
28
|
+
/** How long a bearer hand-off code can be claimed, at most; never past its session. */
|
|
29
|
+
export const BEARER_HANDOFF_MAX_AGE_SECONDS = 60;
|
|
30
|
+
/** How long a bearer access token lives unless `bearer.accessTokenMaxAgeSeconds` says otherwise. */
|
|
31
|
+
export const RELYING_PARTY_DEFAULT_BEARER_ACCESS_TOKEN_MAX_AGE_SECONDS = 15 * 60;
|
|
32
|
+
/** The codes and tokens of bearer mode are 43 characters; anything far longer is none of them. */
|
|
33
|
+
const MAX_BEARER_TOKEN_LENGTH = 256;
|
|
21
34
|
/**
|
|
22
35
|
* How long ending a session waits for the provider to take its tokens back.
|
|
23
36
|
* The local session is already revoked when that call runs.
|
|
@@ -30,6 +43,64 @@ export const ACCESS_TOKEN_REFRESH_SKEW_MS = 60_000;
|
|
|
30
43
|
* the claim and the store around it, and clock disagreement between replicas.
|
|
31
44
|
*/
|
|
32
45
|
export const REFRESH_LOCK_MARGIN_MS = 20_000;
|
|
46
|
+
const bearerModeOf = (bearerArg, optionsArg) => {
|
|
47
|
+
if (!bearerArg || typeof bearerArg !== 'object') {
|
|
48
|
+
throw new Error('bearer must be an object with returnTargets');
|
|
49
|
+
}
|
|
50
|
+
if (!optionsArg.hasProvider) {
|
|
51
|
+
throw new Error('bearer needs a provider: every bearer session is a provider login');
|
|
52
|
+
}
|
|
53
|
+
const { BearerHandoff, BearerToken } = optionsArg.models;
|
|
54
|
+
if (!BearerHandoff || !BearerToken) {
|
|
55
|
+
throw new Error('bearer needs the BearerHandoff and BearerToken models; createRelyingPartyModels binds them');
|
|
56
|
+
}
|
|
57
|
+
const accessTokenMaxAgeSeconds = bearerArg.accessTokenMaxAgeSeconds
|
|
58
|
+
?? Math.min(RELYING_PARTY_DEFAULT_BEARER_ACCESS_TOKEN_MAX_AGE_SECONDS, optionsArg.sessionMaxAgeSeconds);
|
|
59
|
+
if (!Number.isSafeInteger(accessTokenMaxAgeSeconds)
|
|
60
|
+
|| accessTokenMaxAgeSeconds < 1
|
|
61
|
+
|| accessTokenMaxAgeSeconds > optionsArg.sessionMaxAgeSeconds) {
|
|
62
|
+
throw new Error(`bearer.accessTokenMaxAgeSeconds must be a whole number from 1 to ${optionsArg.sessionMaxAgeSeconds}`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
returnTargets: normalizeBearerReturnTargets(bearerArg.returnTargets, optionsArg.publicOrigin, optionsArg.loginPathPrefix),
|
|
66
|
+
accessTokenMaxAgeSeconds,
|
|
67
|
+
models: { BearerHandoff, BearerToken },
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/** The one `state` of a callback, or `null` when it carries none or several. */
|
|
71
|
+
const singleStateOf = (callbackUrlArg) => {
|
|
72
|
+
const states = callbackUrlArg.searchParams.getAll('state');
|
|
73
|
+
return states.length === 1 && states[0] ? states[0] : null;
|
|
74
|
+
};
|
|
75
|
+
/** A code or token of bearer mode as a client presents it, or `null` when it cannot be one. */
|
|
76
|
+
const bearerCredentialOf = (valueArg) => typeof valueArg === 'string' && valueArg.length > 0 && valueArg.length <= MAX_BEARER_TOKEN_LENGTH ? valueArg : null;
|
|
77
|
+
const serializeSessionsCursor = (cursorArg) => Buffer.from(JSON.stringify([cursorArg.sortValue, cursorArg.uniqueValue]), 'utf8').toString('base64url');
|
|
78
|
+
/**
|
|
79
|
+
* The position a cursor of `sessionsOfPrincipal` names. It seeks within the
|
|
80
|
+
* principal's own sessions only, so it needs no seal; anything that is not
|
|
81
|
+
* such a position is refused.
|
|
82
|
+
*/
|
|
83
|
+
const parseSessionsCursor = (cursorArg) => {
|
|
84
|
+
if (typeof cursorArg !== 'string' || cursorArg.length > MAX_SESSIONS_CURSOR_LENGTH || !/^[A-Za-z0-9_-]+$/.test(cursorArg)) {
|
|
85
|
+
throw new RelyingPartyError('invalid_sessions_cursor');
|
|
86
|
+
}
|
|
87
|
+
let position;
|
|
88
|
+
try {
|
|
89
|
+
position = JSON.parse(Buffer.from(cursorArg, 'base64url').toString('utf8'));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw new RelyingPartyError('invalid_sessions_cursor');
|
|
93
|
+
}
|
|
94
|
+
if (!Array.isArray(position)
|
|
95
|
+
|| position.length !== 2
|
|
96
|
+
|| !Number.isSafeInteger(position[0])
|
|
97
|
+
|| position[0] < 0
|
|
98
|
+
|| typeof position[1] !== 'string'
|
|
99
|
+
|| position[1] === '') {
|
|
100
|
+
throw new RelyingPartyError('invalid_sessions_cursor');
|
|
101
|
+
}
|
|
102
|
+
return { sortValue: position[0], uniqueValue: position[1] };
|
|
103
|
+
};
|
|
33
104
|
const REVOKED_TOKEN_FIELDS = { sealedAccessToken: '', sealedRefreshToken: '', refreshLockUntil: 0 };
|
|
34
105
|
const errorMessage = (errorArg) => (errorArg instanceof Error ? errorArg.message : String(errorArg));
|
|
35
106
|
/** Browsers store a cookie with one of these prefixes only when it is set `Secure`; they match it case-insensitively. */
|
|
@@ -50,9 +121,16 @@ const cookieNameFor = (configuredArg, defaultArg, secureArg, labelArg) => {
|
|
|
50
121
|
* token, provider tokens sealed at rest and rotated under a cross-replica
|
|
51
122
|
* lock, and session ends that hand the tokens back.
|
|
52
123
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
124
|
+
* With `cookieSessions: false` it runs bearer hand-off mode alone and never
|
|
125
|
+
* touches a cookie (`IRelyingPartyBearerOnlySessionsOptions`).
|
|
126
|
+
*
|
|
127
|
+
* Nothing here runs on a timer: expired login attempts, bearer state and
|
|
128
|
+
* ended sessions are swept one bounded batch at a time when a login starts or
|
|
129
|
+
* the application opens a session, and the only timer — the revocation
|
|
130
|
+
* budget — is unreferenced and cleared on every path. Every session comes
|
|
131
|
+
* from a login start or from `openSession`, and each of those sweeps a batch
|
|
132
|
+
* of at least one first, so removal keeps pace with creation and the ended
|
|
133
|
+
* sessions kept stay bounded. Nothing here does I/O while it is constructed,
|
|
56
134
|
* so it is built before the database connects.
|
|
57
135
|
*
|
|
58
136
|
* `TPrincipal` is what a `principals.resolve` answers; with `isActive`
|
|
@@ -70,9 +148,9 @@ export class RelyingPartySessions {
|
|
|
70
148
|
/** the principal of a session when it may act right now, `null` otherwise */
|
|
71
149
|
#activePrincipal;
|
|
72
150
|
#provider;
|
|
151
|
+
#bearer;
|
|
73
152
|
#secretBox;
|
|
74
|
-
#
|
|
75
|
-
#csrfLabel;
|
|
153
|
+
#cookieSessions;
|
|
76
154
|
#hooks;
|
|
77
155
|
#now;
|
|
78
156
|
/** one rotation per session in this process, however many requests need it at once */
|
|
@@ -82,8 +160,24 @@ export class RelyingPartySessions {
|
|
|
82
160
|
if (origin.origin !== optionsArg.publicOrigin) {
|
|
83
161
|
throw new Error('publicOrigin must be a bare origin such as https://app.example');
|
|
84
162
|
}
|
|
85
|
-
|
|
86
|
-
|
|
163
|
+
const cookieSessions = optionsArg.cookieSessions ?? true;
|
|
164
|
+
if (cookieSessions !== true && cookieSessions !== false) {
|
|
165
|
+
throw new Error('cookieSessions must be true or false');
|
|
166
|
+
}
|
|
167
|
+
if (cookieSessions) {
|
|
168
|
+
if (!Buffer.isBuffer(optionsArg.csrfKey) || optionsArg.csrfKey.length !== 32) {
|
|
169
|
+
throw new Error('csrfKey must be 32 bytes');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
for (const name of ['csrfKey', 'csrfLabel', 'cookieNames']) {
|
|
174
|
+
if (optionsArg[name] !== undefined) {
|
|
175
|
+
throw new Error(`${name} has no use with cookieSessions: false, which reads and sets no cookie`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (optionsArg.bearer === undefined) {
|
|
179
|
+
throw new Error('cookieSessions: false needs bearer: without cookies, bearer hand-off is the only way in');
|
|
180
|
+
}
|
|
87
181
|
}
|
|
88
182
|
const maxAge = optionsArg.sessionMaxAgeSeconds ?? RELYING_PARTY_DEFAULT_SESSION_MAX_AGE_SECONDS;
|
|
89
183
|
if (!Number.isSafeInteger(maxAge) || maxAge < 1) {
|
|
@@ -129,9 +223,19 @@ export class RelyingPartySessions {
|
|
|
129
223
|
: null;
|
|
130
224
|
}
|
|
131
225
|
this.#provider = optionsArg.provider;
|
|
226
|
+
if (optionsArg.bearer !== undefined) {
|
|
227
|
+
this.#bearer = bearerModeOf(optionsArg.bearer, {
|
|
228
|
+
models: optionsArg.models,
|
|
229
|
+
hasProvider: optionsArg.provider !== undefined,
|
|
230
|
+
publicOrigin: this.publicOrigin,
|
|
231
|
+
loginPathPrefix: this.loginPathPrefix,
|
|
232
|
+
sessionMaxAgeSeconds: maxAge,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
132
235
|
this.#secretBox = new SecretBox(optionsArg.sessionEncryptionKey);
|
|
133
|
-
this.#
|
|
134
|
-
|
|
236
|
+
this.#cookieSessions = cookieSessions
|
|
237
|
+
? { csrfKey: Buffer.from(optionsArg.csrfKey), csrfLabel: optionsArg.csrfLabel ?? RELYING_PARTY_DEFAULT_CSRF_LABEL }
|
|
238
|
+
: null;
|
|
135
239
|
this.#hooks = optionsArg.hooks ?? {};
|
|
136
240
|
this.#now = optionsArg.now ?? (() => Date.now());
|
|
137
241
|
}
|
|
@@ -139,6 +243,18 @@ export class RelyingPartySessions {
|
|
|
139
243
|
get providerLoginEnabled() {
|
|
140
244
|
return this.#provider !== undefined;
|
|
141
245
|
}
|
|
246
|
+
/** Whether cookie sessions are offered; `false` only in bearer-only mode (`cookieSessions: false`). */
|
|
247
|
+
get cookieSessionsEnabled() {
|
|
248
|
+
return this.#cookieSessions !== null;
|
|
249
|
+
}
|
|
250
|
+
/** Whether bearer hand-off mode is offered. */
|
|
251
|
+
get bearerLoginEnabled() {
|
|
252
|
+
return this.#bearer !== undefined;
|
|
253
|
+
}
|
|
254
|
+
/** The return targets bearer clients may name, per kind, as configured; `undefined` without bearer mode. */
|
|
255
|
+
get bearerReturnTargets() {
|
|
256
|
+
return this.#bearer?.returnTargets;
|
|
257
|
+
}
|
|
142
258
|
/**
|
|
143
259
|
* How long one replica holds the right to rotate a session's tokens. The
|
|
144
260
|
* provider detects reuse of a superseded refresh token and kills the family,
|
|
@@ -158,6 +274,7 @@ export class RelyingPartySessions {
|
|
|
158
274
|
* cookie with it; it is a whole number of seconds from 1 to that maximum.
|
|
159
275
|
*/
|
|
160
276
|
async openSession(optionsArg) {
|
|
277
|
+
this.requireCookieSessions();
|
|
161
278
|
if (typeof optionsArg?.principalId !== 'string' || optionsArg.principalId.length === 0) {
|
|
162
279
|
throw new Error('openSession needs a principal id');
|
|
163
280
|
}
|
|
@@ -165,13 +282,21 @@ export class RelyingPartySessions {
|
|
|
165
282
|
if (!Number.isSafeInteger(maxAgeSeconds) || maxAgeSeconds < 1 || maxAgeSeconds > this.sessionMaxAgeSeconds) {
|
|
166
283
|
throw new RangeError(`openSession maxAgeSeconds must be a whole number from 1 to ${this.sessionMaxAgeSeconds}`);
|
|
167
284
|
}
|
|
285
|
+
await this.sweepEndedSessions();
|
|
168
286
|
const token = randomToken(32);
|
|
169
287
|
const session = this.newSessionDoc(token, optionsArg.principalId, maxAgeSeconds);
|
|
170
288
|
await session.save();
|
|
171
289
|
return this.opening(session, token, maxAgeSeconds);
|
|
172
290
|
}
|
|
173
|
-
/**
|
|
291
|
+
/**
|
|
292
|
+
* The live session behind the session cookie, or `null`. A read touches it
|
|
293
|
+
* at most once a minute. Always `null` in bearer-only mode, which reads no
|
|
294
|
+
* cookie.
|
|
295
|
+
*/
|
|
174
296
|
async resolveCookieSession(cookieHeaderArg) {
|
|
297
|
+
if (!this.#cookieSessions) {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
175
300
|
const token = parseCookies(cookieHeaderArg).get(this.sessionCookieName);
|
|
176
301
|
if (!token || token.length > MAX_COOKIE_TOKEN_LENGTH) {
|
|
177
302
|
return null;
|
|
@@ -252,7 +377,42 @@ export class RelyingPartySessions {
|
|
|
252
377
|
}
|
|
253
378
|
return ended;
|
|
254
379
|
}
|
|
380
|
+
/**
|
|
381
|
+
* One page of a principal's live sessions, newest first: the ones neither
|
|
382
|
+
* ended nor expired, and none at all while the principal is not active —
|
|
383
|
+
* exactly the sessions `isSessionLive` confirms. Pass the page's
|
|
384
|
+
* `nextCursor` as `cursor` to read the next one; the last page has none.
|
|
385
|
+
* The cursor is opaque, and one this method did not answer is refused with
|
|
386
|
+
* `invalid_sessions_cursor`. A session opened while the pages are read is
|
|
387
|
+
* listed only when it sorts after the cursor; none is listed twice.
|
|
388
|
+
*/
|
|
389
|
+
async sessionsOfPrincipal(principalIdArg, optionsArg = {}) {
|
|
390
|
+
if (typeof principalIdArg !== 'string' || principalIdArg === '') {
|
|
391
|
+
throw new Error('sessionsOfPrincipal needs a principal id');
|
|
392
|
+
}
|
|
393
|
+
const limit = optionsArg.limit ?? RELYING_PARTY_DEFAULT_SESSIONS_PAGE_LIMIT;
|
|
394
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > RELYING_PARTY_MAX_SESSIONS_PAGE_LIMIT) {
|
|
395
|
+
throw new Error(`limit must be an integer from 1 to ${RELYING_PARTY_MAX_SESSIONS_PAGE_LIMIT}`);
|
|
396
|
+
}
|
|
397
|
+
const cursor = optionsArg.cursor === undefined ? undefined : parseSessionsCursor(optionsArg.cursor);
|
|
398
|
+
if (!(await this.#activePrincipal(principalIdArg))) {
|
|
399
|
+
return { sessions: [] };
|
|
400
|
+
}
|
|
401
|
+
const page = await this.#models.Session.getPagedInstances({
|
|
402
|
+
filter: { userId: principalIdArg, revokedAt: { $exists: false }, expiresAt: { $gt: this.#now() } },
|
|
403
|
+
sortField: 'createdAt',
|
|
404
|
+
sortDirection: 'desc',
|
|
405
|
+
uniqueField: 'id',
|
|
406
|
+
limit,
|
|
407
|
+
...(cursor ? { cursor } : {}),
|
|
408
|
+
});
|
|
409
|
+
return {
|
|
410
|
+
sessions: page.documents.map((documentArg) => this.snapshot(documentArg)),
|
|
411
|
+
...(page.nextCursor ? { nextCursor: serializeSessionsCursor(page.nextCursor) } : {}),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
255
414
|
clearSessionCookie() {
|
|
415
|
+
this.requireCookieSessions();
|
|
256
416
|
return serializeClearedCookie(this.sessionCookieName, {
|
|
257
417
|
httpOnly: true,
|
|
258
418
|
secure: this.secureCookies,
|
|
@@ -260,6 +420,7 @@ export class RelyingPartySessions {
|
|
|
260
420
|
});
|
|
261
421
|
}
|
|
262
422
|
clearIntentCookie() {
|
|
423
|
+
this.requireCookieSessions();
|
|
263
424
|
return serializeClearedCookie(this.intentCookieName, {
|
|
264
425
|
httpOnly: true,
|
|
265
426
|
secure: this.secureCookies,
|
|
@@ -275,34 +436,22 @@ export class RelyingPartySessions {
|
|
|
275
436
|
* browser.
|
|
276
437
|
*/
|
|
277
438
|
async startLogin(returnPathArg, optionsArg = {}) {
|
|
439
|
+
this.requireCookieSessions();
|
|
278
440
|
const provider = this.requireProvider();
|
|
279
|
-
|
|
280
|
-
if (intent !== undefined && (typeof intent !== 'string' || intent.length === 0 || intent.length > RELYING_PARTY_MAX_INTENT_LENGTH)) {
|
|
281
|
-
throw new RangeError(`a login intent is text of 1 to ${RELYING_PARTY_MAX_INTENT_LENGTH} characters`);
|
|
282
|
-
}
|
|
283
|
-
if (prompt !== undefined && !OIDC_PROMPTS.includes(prompt)) {
|
|
284
|
-
throw new RangeError(`a login prompt is one of ${OIDC_PROMPTS.join(', ')}`);
|
|
285
|
-
}
|
|
441
|
+
this.checkLoginOptions(optionsArg);
|
|
286
442
|
await this.sweepExpiredAttempts();
|
|
287
|
-
|
|
288
|
-
const nonce = randomToken(32);
|
|
289
|
-
const pkceVerifier = randomToken(32);
|
|
443
|
+
await this.sweepEndedSessions();
|
|
290
444
|
const bindingToken = randomToken(32);
|
|
291
|
-
const
|
|
292
|
-
const attempt = new this.#models.LoginAttempt();
|
|
293
|
-
attempt.id = 'lga_' + randomToken(18);
|
|
294
|
-
attempt.stateHash = sha256(state);
|
|
445
|
+
const { attempt, state, nonce, pkceVerifier } = this.newLoginAttempt(optionsArg.intent);
|
|
295
446
|
attempt.bindingTokenHash = sha256(bindingToken);
|
|
296
|
-
attempt.sealedPkceVerifier = this.#secretBox.seal(pkceVerifier);
|
|
297
|
-
attempt.nonce = nonce;
|
|
298
447
|
attempt.returnPath = sanitizeReturnPath(returnPathArg, this.publicOrigin, this.loginPathPrefix);
|
|
299
|
-
if (intent !== undefined) {
|
|
300
|
-
attempt.sealedIntent = this.#secretBox.seal(intent);
|
|
301
|
-
}
|
|
302
|
-
attempt.createdAt = now;
|
|
303
|
-
attempt.expiresAt = now + LOGIN_ATTEMPT_MAX_AGE_SECONDS * 1_000;
|
|
304
448
|
// the URL first: a login the provider cannot start yet (before discovery) stores no attempt
|
|
305
|
-
const authorizationUrl = await provider.buildAuthorizationUrl({
|
|
449
|
+
const authorizationUrl = await provider.buildAuthorizationUrl({
|
|
450
|
+
state,
|
|
451
|
+
nonce,
|
|
452
|
+
pkceVerifier,
|
|
453
|
+
...(optionsArg.prompt ? { prompt: optionsArg.prompt } : {}),
|
|
454
|
+
});
|
|
306
455
|
await attempt.save();
|
|
307
456
|
return {
|
|
308
457
|
authorizationUrl,
|
|
@@ -322,6 +471,7 @@ export class RelyingPartySessions {
|
|
|
322
471
|
* leaves.
|
|
323
472
|
*/
|
|
324
473
|
async completeLogin(callbackUrlArg, cookieHeaderArg) {
|
|
474
|
+
this.requireCookieSessions();
|
|
325
475
|
const provider = this.requireProvider();
|
|
326
476
|
const states = callbackUrlArg.searchParams.getAll('state');
|
|
327
477
|
if (states.length !== 1 || !states[0]) {
|
|
@@ -342,35 +492,8 @@ export class RelyingPartySessions {
|
|
|
342
492
|
throw new RelyingPartyError('invalid_or_replayed_login');
|
|
343
493
|
}
|
|
344
494
|
const attempt = claimed.document;
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
try {
|
|
348
|
-
completion = await provider.completeAuthorization({
|
|
349
|
-
callbackUrl: callbackUrlArg,
|
|
350
|
-
state: states[0],
|
|
351
|
-
nonce: attempt.nonce,
|
|
352
|
-
pkceVerifier: this.#secretBox.open(attempt.sealedPkceVerifier),
|
|
353
|
-
});
|
|
354
|
-
stage = 'principal_admission';
|
|
355
|
-
const { principalId } = await this.#admit(completion, {
|
|
356
|
-
loginAttemptId: attempt.id,
|
|
357
|
-
...(attempt.sealedIntent ? { intent: this.#secretBox.open(attempt.sealedIntent) } : {}),
|
|
358
|
-
});
|
|
359
|
-
stage = 'session_persistence';
|
|
360
|
-
return await this.createProviderSession(attempt, principalId, completion);
|
|
361
|
-
}
|
|
362
|
-
catch (error) {
|
|
363
|
-
if (completion) {
|
|
364
|
-
await this.revokeCompletionTokens(completion);
|
|
365
|
-
}
|
|
366
|
-
if (error instanceof RelyingPartyError || error instanceof RelyingPartyRefusal) {
|
|
367
|
-
throw error;
|
|
368
|
-
}
|
|
369
|
-
if (error instanceof OidcCompletionError) {
|
|
370
|
-
throw new LoginCallbackError(error.stage, error);
|
|
371
|
-
}
|
|
372
|
-
throw new LoginCallbackError(stage, error);
|
|
373
|
-
}
|
|
495
|
+
const opened = await this.openProviderLogin(provider, callbackUrlArg, states[0], attempt);
|
|
496
|
+
return this.opening(opened.document, opened.token);
|
|
374
497
|
}
|
|
375
498
|
/**
|
|
376
499
|
* The provider sent the browser back without a code. The attempt is
|
|
@@ -378,6 +501,7 @@ export class RelyingPartySessions {
|
|
|
378
501
|
* matches no open attempt leaves nothing to do.
|
|
379
502
|
*/
|
|
380
503
|
async abandonLogin(callbackUrlArg, cookieHeaderArg) {
|
|
504
|
+
this.requireCookieSessions();
|
|
381
505
|
const states = callbackUrlArg.searchParams.getAll('state');
|
|
382
506
|
const bindingToken = parseCookies(cookieHeaderArg).get(this.intentCookieName);
|
|
383
507
|
if (states.length !== 1
|
|
@@ -394,6 +518,7 @@ export class RelyingPartySessions {
|
|
|
394
518
|
* session this very attempt created.
|
|
395
519
|
*/
|
|
396
520
|
async finalizeLogin(cookieHeaderArg) {
|
|
521
|
+
this.requireCookieSessions();
|
|
397
522
|
this.requireProvider();
|
|
398
523
|
const bindingToken = parseCookies(cookieHeaderArg).get(this.intentCookieName);
|
|
399
524
|
if (!bindingToken || bindingToken.length > MAX_COOKIE_TOKEN_LENGTH) {
|
|
@@ -416,6 +541,265 @@ export class RelyingPartySessions {
|
|
|
416
541
|
return sanitizeReturnPath(attempt.returnPath, this.publicOrigin, this.loginPathPrefix);
|
|
417
542
|
}
|
|
418
543
|
// ==========================================================================
|
|
544
|
+
// bearer hand-off
|
|
545
|
+
// ==========================================================================
|
|
546
|
+
/**
|
|
547
|
+
* Starts a bearer login for one of the application's own clients: the same
|
|
548
|
+
* provider login as `startLogin`, but the outcome goes to the return target
|
|
549
|
+
* the client named — exactly one of the configured targets of its kind —
|
|
550
|
+
* and it sets no cookie. The login is bound to the client's S256 challenge
|
|
551
|
+
* instead of a browser: whoever claims its hand-off code has to present the
|
|
552
|
+
* verifier. Every field of the request is checked as untrusted input.
|
|
553
|
+
*/
|
|
554
|
+
async startBearerLogin(requestArg, optionsArg = {}) {
|
|
555
|
+
const provider = this.requireProvider();
|
|
556
|
+
const bearer = this.requireBearer();
|
|
557
|
+
const request = requestArg && typeof requestArg === 'object' ? requestArg : null;
|
|
558
|
+
if (!request
|
|
559
|
+
|| !isBearerClientKind(request.clientKind)
|
|
560
|
+
|| typeof request.returnTarget !== 'string'
|
|
561
|
+
|| !isPkceChallenge(request.codeChallenge)
|
|
562
|
+
|| request.codeChallengeMethod !== 'S256'
|
|
563
|
+
|| (request.state !== undefined && !isBearerClientState(request.state))) {
|
|
564
|
+
throw new RelyingPartyError('invalid_bearer_request');
|
|
565
|
+
}
|
|
566
|
+
if (!isBearerReturnTargetAllowed(bearer.returnTargets, request.clientKind, request.returnTarget)) {
|
|
567
|
+
throw new RelyingPartyError('return_target_not_allowed');
|
|
568
|
+
}
|
|
569
|
+
this.checkLoginOptions(optionsArg);
|
|
570
|
+
await this.sweepExpiredAttempts();
|
|
571
|
+
await this.sweepBearerState();
|
|
572
|
+
await this.sweepEndedSessions();
|
|
573
|
+
const { attempt, state, nonce, pkceVerifier } = this.newLoginAttempt(optionsArg.intent);
|
|
574
|
+
// a binding token that never leaves: no cookie callback can consume this attempt
|
|
575
|
+
attempt.bindingTokenHash = sha256(randomToken(32));
|
|
576
|
+
attempt.bearerClientKind = request.clientKind;
|
|
577
|
+
attempt.bearerReturnTarget = request.returnTarget;
|
|
578
|
+
attempt.bearerCodeChallenge = request.codeChallenge;
|
|
579
|
+
if (isBearerClientState(request.state)) {
|
|
580
|
+
attempt.bearerClientState = request.state;
|
|
581
|
+
}
|
|
582
|
+
const authorizationUrl = await provider.buildAuthorizationUrl({
|
|
583
|
+
state,
|
|
584
|
+
nonce,
|
|
585
|
+
pkceVerifier,
|
|
586
|
+
...(optionsArg.prompt ? { prompt: optionsArg.prompt } : {}),
|
|
587
|
+
});
|
|
588
|
+
await attempt.save();
|
|
589
|
+
return { authorizationUrl };
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Where the outcome of a login callback goes when it belongs to a bearer
|
|
593
|
+
* login: the client kind, the return target and the client's `state`, read
|
|
594
|
+
* without consuming anything. `null` for a cookie login, an unknown state,
|
|
595
|
+
* and a return target that is no longer configured — the callback is then
|
|
596
|
+
* not answered as a bearer login at all.
|
|
597
|
+
*/
|
|
598
|
+
async bearerDeliveryOf(callbackUrlArg) {
|
|
599
|
+
const state = this.#bearer ? singleStateOf(callbackUrlArg) : null;
|
|
600
|
+
if (!state) {
|
|
601
|
+
return null;
|
|
602
|
+
}
|
|
603
|
+
const attempt = await this.#models.LoginAttempt.getInstance({ stateHash: sha256(state) });
|
|
604
|
+
return attempt ? this.bearerDeliveryOfAttempt(attempt) : null;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Consumes a bearer login's attempt exactly once, exchanges the code, admits
|
|
608
|
+
* the principal and opens its session — everything `completeLogin` does,
|
|
609
|
+
* with the same failures — and answers a single-use hand-off code bound to
|
|
610
|
+
* the client's challenge. The code lives `BEARER_HANDOFF_MAX_AGE_SECONDS`
|
|
611
|
+
* at most and only its hash is stored. A code nobody claims ends its session.
|
|
612
|
+
*/
|
|
613
|
+
async completeBearerLogin(callbackUrlArg) {
|
|
614
|
+
const provider = this.requireProvider();
|
|
615
|
+
const bearer = this.requireBearer();
|
|
616
|
+
const state = singleStateOf(callbackUrlArg);
|
|
617
|
+
if (!state) {
|
|
618
|
+
throw new RelyingPartyError('invalid_login_callback');
|
|
619
|
+
}
|
|
620
|
+
const now = this.#now();
|
|
621
|
+
const claimed = await this.#models.LoginAttempt.atomicFindOneAndUpdate({ stateHash: sha256(state), consumedAt: null, expiresAt: { $gt: now }, bearerClientKind: { $exists: true } }, { $set: { consumedAt: now } }, { returnDocument: 'after' });
|
|
622
|
+
if (claimed.status !== 'matched' || !claimed.document) {
|
|
623
|
+
throw new RelyingPartyError('invalid_or_replayed_login');
|
|
624
|
+
}
|
|
625
|
+
const attempt = claimed.document;
|
|
626
|
+
const delivery = this.bearerDeliveryOfAttempt(attempt);
|
|
627
|
+
if (!delivery) {
|
|
628
|
+
throw new RelyingPartyError('return_target_not_allowed');
|
|
629
|
+
}
|
|
630
|
+
const codeChallenge = attempt.bearerCodeChallenge;
|
|
631
|
+
if (!isPkceChallenge(codeChallenge)) {
|
|
632
|
+
throw new RelyingPartyError('invalid_or_replayed_login');
|
|
633
|
+
}
|
|
634
|
+
const code = randomToken(32);
|
|
635
|
+
let handoff;
|
|
636
|
+
const opened = await this.openProviderLogin(provider, callbackUrlArg, state, attempt, async (sessionArg) => {
|
|
637
|
+
const created = new bearer.models.BearerHandoff();
|
|
638
|
+
created.id = 'rbh_' + randomToken(18);
|
|
639
|
+
created.codeHash = sha256(code);
|
|
640
|
+
created.sessionId = sessionArg.id;
|
|
641
|
+
created.codeChallenge = codeChallenge;
|
|
642
|
+
created.createdAt = this.#now();
|
|
643
|
+
created.expiresAt = Math.min(created.createdAt + BEARER_HANDOFF_MAX_AGE_SECONDS * 1_000, sessionArg.expiresAt);
|
|
644
|
+
created.consumedAt = null;
|
|
645
|
+
await created.save();
|
|
646
|
+
handoff = created;
|
|
647
|
+
});
|
|
648
|
+
return {
|
|
649
|
+
session: this.snapshot(opened.document),
|
|
650
|
+
delivery,
|
|
651
|
+
code,
|
|
652
|
+
expiresAt: handoff.expiresAt,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
/** `abandonLogin` for a bearer login: the provider came back without a code. */
|
|
656
|
+
async abandonBearerLogin(callbackUrlArg) {
|
|
657
|
+
const state = singleStateOf(callbackUrlArg);
|
|
658
|
+
if (!state) {
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
await this.#models.LoginAttempt.atomicUpdate({ stateHash: sha256(state), consumedAt: null, bearerClientKind: { $exists: true } }, { $set: { consumedAt: this.#now() } });
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Trades a hand-off code and the verifier of its challenge for the first
|
|
665
|
+
* access and refresh token of the session. The code is consumed by the first
|
|
666
|
+
* claim whatever its verifier: a wrong verifier ends the session, and so
|
|
667
|
+
* does the code coming back after it was claimed (RFC 6749 §4.1.2). A code
|
|
668
|
+
* that expired unclaimed ends its session too.
|
|
669
|
+
*/
|
|
670
|
+
async claimBearerHandoff(codeArg, codeVerifierArg) {
|
|
671
|
+
const bearer = this.requireBearer();
|
|
672
|
+
const code = bearerCredentialOf(codeArg);
|
|
673
|
+
if (!code || !isPkceVerifier(codeVerifierArg)) {
|
|
674
|
+
throw new RelyingPartyError('invalid_bearer_request');
|
|
675
|
+
}
|
|
676
|
+
const codeHash = sha256(code);
|
|
677
|
+
const now = this.#now();
|
|
678
|
+
const claimed = await bearer.models.BearerHandoff.atomicFindOneAndUpdate({ codeHash, consumedAt: null, expiresAt: { $gt: now } }, { $set: { consumedAt: now } }, { returnDocument: 'after' });
|
|
679
|
+
if (claimed.status !== 'matched' || !claimed.document) {
|
|
680
|
+
const known = await bearer.models.BearerHandoff.getInstance({ codeHash });
|
|
681
|
+
if (known?.consumedAt === null) {
|
|
682
|
+
await this.endUnclaimedHandoff(known);
|
|
683
|
+
}
|
|
684
|
+
else if (known && known.consumedAt !== null && known.consumedAt < known.expiresAt) {
|
|
685
|
+
// a claim took it while it was valid; one taken after its expiry was
|
|
686
|
+
// ended unclaimed, and coming back late is no reuse
|
|
687
|
+
await this.bearerCredentialReused(known.sessionId, 'handoff_code_reused');
|
|
688
|
+
}
|
|
689
|
+
throw new RelyingPartyError('invalid_bearer_handoff');
|
|
690
|
+
}
|
|
691
|
+
const handoff = claimed.document;
|
|
692
|
+
if (!verifyPkceChallenge(codeVerifierArg, handoff.codeChallenge)) {
|
|
693
|
+
await this.endSession(handoff.sessionId, 'handoff_verifier_mismatch');
|
|
694
|
+
throw new RelyingPartyError('invalid_bearer_handoff');
|
|
695
|
+
}
|
|
696
|
+
const live = await this.liveSession(await this.#models.Session.getInstance({ id: handoff.sessionId }));
|
|
697
|
+
if (!live) {
|
|
698
|
+
throw new RelyingPartyError('invalid_bearer_handoff');
|
|
699
|
+
}
|
|
700
|
+
return this.issueBearerTokens(bearer, live.document);
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Rotates a bearer session's tokens: the refresh token is spent, a new
|
|
704
|
+
* access and refresh token answer, and the old access token stops working.
|
|
705
|
+
* Rotation is strict — a client serializes its refreshes — because a
|
|
706
|
+
* refresh token that comes back after it was spent ends the whole session.
|
|
707
|
+
* The provider login is checked on the way: a login idp.global ended ends
|
|
708
|
+
* the session here (`invalid_bearer_grant`), an unreachable provider fails
|
|
709
|
+
* with `AuthorityTokenError('authority_unavailable')` and spends nothing.
|
|
710
|
+
*/
|
|
711
|
+
async refreshBearerTokens(refreshTokenArg) {
|
|
712
|
+
const bearer = this.requireBearer();
|
|
713
|
+
const refreshToken = bearerCredentialOf(refreshTokenArg);
|
|
714
|
+
if (!refreshToken) {
|
|
715
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
716
|
+
}
|
|
717
|
+
const refreshTokenHash = sha256(refreshToken);
|
|
718
|
+
const current = await bearer.models.BearerToken.getInstance({ refreshTokenHash });
|
|
719
|
+
if (!current) {
|
|
720
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
721
|
+
}
|
|
722
|
+
if (current.rotatedAt !== null) {
|
|
723
|
+
await this.bearerCredentialReused(current.sessionId, 'refresh_token_reused');
|
|
724
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
725
|
+
}
|
|
726
|
+
if (current.expiresAt <= this.#now()) {
|
|
727
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
728
|
+
}
|
|
729
|
+
const live = await this.liveSession(await this.#models.Session.getInstance({ id: current.sessionId }));
|
|
730
|
+
if (!live) {
|
|
731
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
732
|
+
}
|
|
733
|
+
try {
|
|
734
|
+
await this.liveProviderToken(live.document.id, live.document.userId);
|
|
735
|
+
}
|
|
736
|
+
catch (error) {
|
|
737
|
+
if (error instanceof AuthorityTokenError && error.code === 'authority_login_required') {
|
|
738
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
739
|
+
}
|
|
740
|
+
throw error;
|
|
741
|
+
}
|
|
742
|
+
// the next generation first: a rotation that fails half way leaves an
|
|
743
|
+
// unknown generation behind, never a session without a current one
|
|
744
|
+
const issued = await this.issueBearerTokens(bearer, live.document);
|
|
745
|
+
const rotated = await bearer.models.BearerToken.atomicUpdate({ refreshTokenHash, rotatedAt: null }, { $set: { rotatedAt: this.#now() } });
|
|
746
|
+
if (rotated.matchedCount !== 1) {
|
|
747
|
+
// a concurrent refresh spent it first; the generation just issued never
|
|
748
|
+
// left this call and dies with the session
|
|
749
|
+
await this.bearerCredentialReused(current.sessionId, 'refresh_token_reused');
|
|
750
|
+
throw new RelyingPartyError('invalid_bearer_grant');
|
|
751
|
+
}
|
|
752
|
+
return issued;
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* The live session behind a bearer access token, or `null`: the token of the
|
|
756
|
+
* session's current generation, not expired, its session live and its
|
|
757
|
+
* principal active. A read touches the session at most once a minute.
|
|
758
|
+
*/
|
|
759
|
+
async resolveBearerAccessToken(accessTokenArg) {
|
|
760
|
+
const accessToken = this.#bearer ? bearerCredentialOf(accessTokenArg) : null;
|
|
761
|
+
if (!this.#bearer || !accessToken) {
|
|
762
|
+
return null;
|
|
763
|
+
}
|
|
764
|
+
const generation = await this.#bearer.models.BearerToken.getInstance({ accessTokenHash: sha256(accessToken) });
|
|
765
|
+
if (!generation || generation.rotatedAt !== null || generation.accessTokenExpiresAt <= this.#now()) {
|
|
766
|
+
return null;
|
|
767
|
+
}
|
|
768
|
+
const live = await this.liveSession(await this.#models.Session.getInstance({ id: generation.sessionId }));
|
|
769
|
+
return live ? { session: this.snapshot(live.document), principal: live.principal } : null;
|
|
770
|
+
}
|
|
771
|
+
/** `resolveBearerAccessToken` for an `Authorization: Bearer <token>` header. */
|
|
772
|
+
async resolveBearerSession(authorizationHeaderArg) {
|
|
773
|
+
return this.resolveBearerAccessToken(parseBearerAuthorization(authorizationHeaderArg));
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Ends the session of a bearer token — a live access token or the current
|
|
777
|
+
* refresh token — like `endSession`. A refresh token that was already spent
|
|
778
|
+
* is reuse and ends the session as such. Answers whether this call ended it.
|
|
779
|
+
*/
|
|
780
|
+
async endBearerSession(tokenArg) {
|
|
781
|
+
const token = this.#bearer ? bearerCredentialOf(tokenArg) : null;
|
|
782
|
+
if (!this.#bearer || !token) {
|
|
783
|
+
return false;
|
|
784
|
+
}
|
|
785
|
+
const tokenHash = sha256(token);
|
|
786
|
+
const byAccessToken = await this.#bearer.models.BearerToken.getInstance({ accessTokenHash: tokenHash });
|
|
787
|
+
if (byAccessToken) {
|
|
788
|
+
if (byAccessToken.rotatedAt !== null || byAccessToken.accessTokenExpiresAt <= this.#now()) {
|
|
789
|
+
return false;
|
|
790
|
+
}
|
|
791
|
+
return this.endSession(byAccessToken.sessionId, 'logout');
|
|
792
|
+
}
|
|
793
|
+
const byRefreshToken = await this.#bearer.models.BearerToken.getInstance({ refreshTokenHash: tokenHash });
|
|
794
|
+
if (!byRefreshToken) {
|
|
795
|
+
return false;
|
|
796
|
+
}
|
|
797
|
+
if (byRefreshToken.rotatedAt !== null) {
|
|
798
|
+
return this.bearerCredentialReused(byRefreshToken.sessionId, 'refresh_token_reused');
|
|
799
|
+
}
|
|
800
|
+
return this.endSession(byRefreshToken.sessionId, 'logout');
|
|
801
|
+
}
|
|
802
|
+
// ==========================================================================
|
|
419
803
|
// provider tokens
|
|
420
804
|
// ==========================================================================
|
|
421
805
|
/**
|
|
@@ -424,8 +808,18 @@ export class RelyingPartySessions {
|
|
|
424
808
|
* is unknown — is rotated first. The session has to belong to
|
|
425
809
|
* `expectedPrincipalIdArg`, so a credential is never evaluated with another
|
|
426
810
|
* person's tokens.
|
|
811
|
+
*
|
|
812
|
+
* With `rejectedAccessToken` (`IAuthorityTokenSource`) the call rotates the
|
|
813
|
+
* session's token whatever is stored, and only a rotation that it starts
|
|
814
|
+
* marks its answer `rotatedAfterRejection`: one that started before it, in
|
|
815
|
+
* this process or another replica's, says nothing about the rejection, so
|
|
816
|
+
* the call awaits it and throws `authority_unavailable`. A refused rotation
|
|
817
|
+
* ends the session (`refresh_token_refused`) and throws
|
|
818
|
+
* `authority_login_required`. A session without a refresh token has nothing
|
|
819
|
+
* to rotate with: it throws `authority_unavailable`, or ends as
|
|
820
|
+
* `access_token_unusable` when its token is dead.
|
|
427
821
|
*/
|
|
428
|
-
async liveProviderToken(sessionIdArg, expectedPrincipalIdArg) {
|
|
822
|
+
async liveProviderToken(sessionIdArg, expectedPrincipalIdArg, optionsArg = {}) {
|
|
429
823
|
const session = await this.#models.Session.getInstance({ id: sessionIdArg });
|
|
430
824
|
const now = this.#now();
|
|
431
825
|
if (!session
|
|
@@ -438,33 +832,50 @@ export class RelyingPartySessions {
|
|
|
438
832
|
const subject = session.idpSubject;
|
|
439
833
|
const expiresAt = typeof session.accessTokenExpiresAt === 'number' ? session.accessTokenExpiresAt : 0;
|
|
440
834
|
const accessToken = this.openSealed(session.sealedAccessToken);
|
|
835
|
+
const forced = optionsArg.rejectedAccessToken !== undefined;
|
|
441
836
|
// an unknown expiry is rotated too: afterwards the lifetime is known
|
|
442
|
-
const due =
|
|
837
|
+
const due = forced
|
|
838
|
+
|| accessToken === undefined
|
|
839
|
+
|| expiresAt === 0
|
|
840
|
+
|| expiresAt <= now + ACCESS_TOKEN_REFRESH_SKEW_MS;
|
|
443
841
|
if (!due && accessToken !== undefined) {
|
|
444
842
|
return { accessToken, subject, expiresAt };
|
|
445
843
|
}
|
|
446
844
|
if (!session.sealedRefreshToken) {
|
|
447
845
|
if (accessToken !== undefined && (expiresAt === 0 || expiresAt > now)) {
|
|
448
846
|
// nothing to rotate with, and the token is not known to be dead
|
|
847
|
+
if (forced) {
|
|
848
|
+
throw new AuthorityTokenError('authority_unavailable');
|
|
849
|
+
}
|
|
449
850
|
return { accessToken, subject, expiresAt };
|
|
450
851
|
}
|
|
451
852
|
await this.endProviderSession(sessionIdArg, 'access_token_unusable');
|
|
452
853
|
throw new AuthorityTokenError('authority_login_required');
|
|
453
854
|
}
|
|
454
|
-
return this.refreshProviderToken(sessionIdArg, subject);
|
|
855
|
+
return this.refreshProviderToken(sessionIdArg, subject, forced);
|
|
455
856
|
}
|
|
456
|
-
|
|
857
|
+
/**
|
|
858
|
+
* One rotation of the session in this process at a time. A forced call that
|
|
859
|
+
* finds one running waits for it, so a refusal still ends it, and is
|
|
860
|
+
* unavailable otherwise: that rotation started before the call.
|
|
861
|
+
*/
|
|
862
|
+
async refreshProviderToken(sessionIdArg, subjectArg, forcedArg) {
|
|
457
863
|
const running = this.#refreshesInFlight.get(sessionIdArg);
|
|
458
864
|
if (running) {
|
|
459
|
-
|
|
865
|
+
const joined = await running;
|
|
866
|
+
if (forcedArg) {
|
|
867
|
+
throw new AuthorityTokenError('authority_unavailable');
|
|
868
|
+
}
|
|
869
|
+
return joined;
|
|
460
870
|
}
|
|
461
|
-
const pending = this.runProviderRefresh(sessionIdArg, subjectArg).finally(() => {
|
|
871
|
+
const pending = this.runProviderRefresh(sessionIdArg, subjectArg, forcedArg).finally(() => {
|
|
462
872
|
this.#refreshesInFlight.delete(sessionIdArg);
|
|
463
873
|
});
|
|
464
874
|
this.#refreshesInFlight.set(sessionIdArg, pending);
|
|
465
|
-
|
|
875
|
+
// only the call that started the rotation is told so; others that join it are not
|
|
876
|
+
return forcedArg ? { ...(await pending), rotatedAfterRejection: true } : pending;
|
|
466
877
|
}
|
|
467
|
-
async runProviderRefresh(sessionIdArg, subjectArg) {
|
|
878
|
+
async runProviderRefresh(sessionIdArg, subjectArg, forcedArg) {
|
|
468
879
|
const provider = this.#provider;
|
|
469
880
|
if (!provider) {
|
|
470
881
|
throw new AuthorityTokenError('authority_unavailable');
|
|
@@ -479,15 +890,21 @@ export class RelyingPartySessions {
|
|
|
479
890
|
$or: [{ refreshLockUntil: { $lt: now } }, { refreshLockUntil: { $exists: false } }],
|
|
480
891
|
}, { $set: { refreshLockUntil: lockUntil } }, { returnDocument: 'after' });
|
|
481
892
|
if (claimed.status !== 'matched' || !claimed.document) {
|
|
893
|
+
if (forcedArg) {
|
|
894
|
+
// nothing tells when the other replica's rotation started
|
|
895
|
+
throw new AuthorityTokenError('authority_unavailable');
|
|
896
|
+
}
|
|
482
897
|
return this.tokenAfterForeignRefresh(sessionIdArg, subjectArg);
|
|
483
898
|
}
|
|
484
899
|
const session = claimed.document;
|
|
485
900
|
// the lock holder decides on the state it just read: a rotation that
|
|
486
901
|
// landed in between is used as it stands, because spending a superseded
|
|
487
|
-
// refresh token would be reuse and would kill the family
|
|
902
|
+
// refresh token would be reuse and would kill the family; a forced call
|
|
903
|
+
// rotates the stored pair however long its token would last, since only a
|
|
904
|
+
// rotation it starts comes after the rejection
|
|
488
905
|
const claimedExpiry = typeof session.accessTokenExpiresAt === 'number' ? session.accessTokenExpiresAt : 0;
|
|
489
906
|
const claimedToken = this.openSealed(session.sealedAccessToken);
|
|
490
|
-
if (claimedToken !== undefined && claimedExpiry > this.#now() + ACCESS_TOKEN_REFRESH_SKEW_MS) {
|
|
907
|
+
if (!forcedArg && claimedToken !== undefined && claimedExpiry > this.#now() + ACCESS_TOKEN_REFRESH_SKEW_MS) {
|
|
491
908
|
await this.#models.Session.atomicUpdate({ id: sessionIdArg, revokedAt: { $exists: false }, refreshLockUntil: lockUntil }, { $set: { refreshLockUntil: 0 } });
|
|
492
909
|
return { accessToken: claimedToken, subject: subjectArg, expiresAt: claimedExpiry };
|
|
493
910
|
}
|
|
@@ -565,6 +982,81 @@ export class RelyingPartySessions {
|
|
|
565
982
|
}
|
|
566
983
|
return this.#provider;
|
|
567
984
|
}
|
|
985
|
+
requireCookieSessions() {
|
|
986
|
+
if (!this.#cookieSessions) {
|
|
987
|
+
throw new RelyingPartyError('login_method_unavailable');
|
|
988
|
+
}
|
|
989
|
+
return this.#cookieSessions;
|
|
990
|
+
}
|
|
991
|
+
requireBearer() {
|
|
992
|
+
if (!this.#bearer) {
|
|
993
|
+
throw new RelyingPartyError('login_method_unavailable');
|
|
994
|
+
}
|
|
995
|
+
return this.#bearer;
|
|
996
|
+
}
|
|
997
|
+
checkLoginOptions(optionsArg) {
|
|
998
|
+
const { intent, prompt } = optionsArg;
|
|
999
|
+
if (intent !== undefined && (typeof intent !== 'string' || intent.length === 0 || intent.length > RELYING_PARTY_MAX_INTENT_LENGTH)) {
|
|
1000
|
+
throw new RangeError(`a login intent is text of 1 to ${RELYING_PARTY_MAX_INTENT_LENGTH} characters`);
|
|
1001
|
+
}
|
|
1002
|
+
if (prompt !== undefined && !OIDC_PROMPTS.includes(prompt)) {
|
|
1003
|
+
throw new RangeError(`a login prompt is one of ${OIDC_PROMPTS.join(', ')}`);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
/** An unsaved attempt with its state, nonce and sealed verifier; the caller binds it and names where it returns. */
|
|
1007
|
+
newLoginAttempt(intentArg) {
|
|
1008
|
+
const state = randomToken(32);
|
|
1009
|
+
const nonce = randomToken(32);
|
|
1010
|
+
const pkceVerifier = randomToken(32);
|
|
1011
|
+
const now = this.#now();
|
|
1012
|
+
const attempt = new this.#models.LoginAttempt();
|
|
1013
|
+
attempt.id = 'lga_' + randomToken(18);
|
|
1014
|
+
attempt.stateHash = sha256(state);
|
|
1015
|
+
attempt.sealedPkceVerifier = this.#secretBox.seal(pkceVerifier);
|
|
1016
|
+
attempt.nonce = nonce;
|
|
1017
|
+
if (intentArg !== undefined) {
|
|
1018
|
+
attempt.sealedIntent = this.#secretBox.seal(intentArg);
|
|
1019
|
+
}
|
|
1020
|
+
attempt.createdAt = now;
|
|
1021
|
+
attempt.expiresAt = now + LOGIN_ATTEMPT_MAX_AGE_SECONDS * 1_000;
|
|
1022
|
+
return { attempt, state, nonce, pkceVerifier };
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* The provider half of a consumed attempt: exchanges the code, admits the
|
|
1026
|
+
* principal and opens the session. Nothing of a failed login survives: its
|
|
1027
|
+
* tokens are handed back before the failure leaves.
|
|
1028
|
+
*/
|
|
1029
|
+
async openProviderLogin(providerArg, callbackUrlArg, stateArg, attemptArg, beforeOpenedArg) {
|
|
1030
|
+
let completion;
|
|
1031
|
+
let stage = 'token_exchange';
|
|
1032
|
+
try {
|
|
1033
|
+
completion = await providerArg.completeAuthorization({
|
|
1034
|
+
callbackUrl: callbackUrlArg,
|
|
1035
|
+
state: stateArg,
|
|
1036
|
+
nonce: attemptArg.nonce,
|
|
1037
|
+
pkceVerifier: this.#secretBox.open(attemptArg.sealedPkceVerifier),
|
|
1038
|
+
});
|
|
1039
|
+
stage = 'principal_admission';
|
|
1040
|
+
const { principalId } = await this.#admit(completion, {
|
|
1041
|
+
loginAttemptId: attemptArg.id,
|
|
1042
|
+
...(attemptArg.sealedIntent ? { intent: this.#secretBox.open(attemptArg.sealedIntent) } : {}),
|
|
1043
|
+
});
|
|
1044
|
+
stage = 'session_persistence';
|
|
1045
|
+
return await this.createProviderSession(attemptArg, principalId, completion, beforeOpenedArg);
|
|
1046
|
+
}
|
|
1047
|
+
catch (error) {
|
|
1048
|
+
if (completion) {
|
|
1049
|
+
await this.revokeCompletionTokens(completion);
|
|
1050
|
+
}
|
|
1051
|
+
if (error instanceof RelyingPartyError || error instanceof RelyingPartyRefusal) {
|
|
1052
|
+
throw error;
|
|
1053
|
+
}
|
|
1054
|
+
if (error instanceof OidcCompletionError) {
|
|
1055
|
+
throw new LoginCallbackError(error.stage, error);
|
|
1056
|
+
}
|
|
1057
|
+
throw new LoginCallbackError(stage, error);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
568
1060
|
newSessionDoc(tokenArg, principalIdArg, maxAgeSecondsArg = this.sessionMaxAgeSeconds) {
|
|
569
1061
|
const now = this.#now();
|
|
570
1062
|
const session = new this.#models.Session();
|
|
@@ -577,7 +1069,8 @@ export class RelyingPartySessions {
|
|
|
577
1069
|
return session;
|
|
578
1070
|
}
|
|
579
1071
|
csrfTokenOf(tokenArg) {
|
|
580
|
-
|
|
1072
|
+
const { csrfKey, csrfLabel } = this.requireCookieSessions();
|
|
1073
|
+
return deriveCsrfToken(tokenArg, csrfKey, csrfLabel);
|
|
581
1074
|
}
|
|
582
1075
|
opening(sessionArg, tokenArg, maxAgeSecondsArg = this.sessionMaxAgeSeconds) {
|
|
583
1076
|
return {
|
|
@@ -623,7 +1116,12 @@ export class RelyingPartySessions {
|
|
|
623
1116
|
}
|
|
624
1117
|
return { document: sessionArg, principal: active.principal };
|
|
625
1118
|
}
|
|
626
|
-
|
|
1119
|
+
/**
|
|
1120
|
+
* Stores the session of a provider login and links it to its attempt.
|
|
1121
|
+
* `beforeOpenedArg` stores what the session is handed out with besides its
|
|
1122
|
+
* cookie; like the hook after it, a throw discards the session.
|
|
1123
|
+
*/
|
|
1124
|
+
async createProviderSession(attemptArg, principalIdArg, completionArg, beforeOpenedArg) {
|
|
627
1125
|
const token = randomToken(32);
|
|
628
1126
|
const session = this.newSessionDoc(token, principalIdArg);
|
|
629
1127
|
session.idpSubject = completionArg.subject;
|
|
@@ -639,14 +1137,14 @@ export class RelyingPartySessions {
|
|
|
639
1137
|
await this.discardUnopenedSession(session.id);
|
|
640
1138
|
throw new RelyingPartyError('invalid_or_replayed_login');
|
|
641
1139
|
}
|
|
642
|
-
const opening = this.opening(session, token);
|
|
643
1140
|
try {
|
|
644
|
-
await
|
|
1141
|
+
await beforeOpenedArg?.(session);
|
|
1142
|
+
await this.#hooks.onProviderSessionOpened?.({ session: this.snapshot(session) });
|
|
645
1143
|
}
|
|
646
1144
|
catch (error) {
|
|
647
|
-
// the cookie never leaves, so the session is
|
|
648
|
-
// and its sealed tokens erased before the
|
|
649
|
-
// the caller hands the provider tokens back
|
|
1145
|
+
// the cookie (or the hand-off code) never leaves, so the session is
|
|
1146
|
+
// unreachable: it is revoked and its sealed tokens erased before the
|
|
1147
|
+
// error goes on; the caller hands the provider tokens back
|
|
650
1148
|
try {
|
|
651
1149
|
await this.discardUnopenedSession(session.id);
|
|
652
1150
|
}
|
|
@@ -655,11 +1153,90 @@ export class RelyingPartySessions {
|
|
|
655
1153
|
}
|
|
656
1154
|
throw error;
|
|
657
1155
|
}
|
|
658
|
-
return
|
|
1156
|
+
return { document: session, token };
|
|
1157
|
+
}
|
|
1158
|
+
/** Where a bearer attempt's outcome goes, while its return target is still configured; `null` otherwise. */
|
|
1159
|
+
bearerDeliveryOfAttempt(attemptArg) {
|
|
1160
|
+
const clientKind = attemptArg.bearerClientKind;
|
|
1161
|
+
const returnTarget = attemptArg.bearerReturnTarget;
|
|
1162
|
+
if (!this.#bearer
|
|
1163
|
+
|| !isBearerClientKind(clientKind)
|
|
1164
|
+
|| typeof returnTarget !== 'string'
|
|
1165
|
+
|| !isBearerReturnTargetAllowed(this.#bearer.returnTargets, clientKind, returnTarget)) {
|
|
1166
|
+
return null;
|
|
1167
|
+
}
|
|
1168
|
+
return {
|
|
1169
|
+
clientKind,
|
|
1170
|
+
returnTarget,
|
|
1171
|
+
...(attemptArg.bearerClientState !== undefined ? { state: attemptArg.bearerClientState } : {}),
|
|
1172
|
+
};
|
|
1173
|
+
}
|
|
1174
|
+
/** Stores the next token generation of a live session and answers its tokens; none of them is stored in the clear. */
|
|
1175
|
+
async issueBearerTokens(bearerArg, sessionArg) {
|
|
1176
|
+
const accessToken = randomToken(32);
|
|
1177
|
+
const refreshToken = randomToken(32);
|
|
1178
|
+
const now = this.#now();
|
|
1179
|
+
const generation = new bearerArg.models.BearerToken();
|
|
1180
|
+
generation.id = 'rbt_' + randomToken(18);
|
|
1181
|
+
generation.accessTokenHash = sha256(accessToken);
|
|
1182
|
+
generation.refreshTokenHash = sha256(refreshToken);
|
|
1183
|
+
generation.sessionId = sessionArg.id;
|
|
1184
|
+
generation.createdAt = now;
|
|
1185
|
+
generation.accessTokenExpiresAt = Math.min(now + bearerArg.accessTokenMaxAgeSeconds * 1_000, sessionArg.expiresAt);
|
|
1186
|
+
generation.expiresAt = sessionArg.expiresAt;
|
|
1187
|
+
generation.rotatedAt = null;
|
|
1188
|
+
await generation.save();
|
|
1189
|
+
return {
|
|
1190
|
+
session: this.snapshot(sessionArg),
|
|
1191
|
+
issuedAt: now,
|
|
1192
|
+
accessToken,
|
|
1193
|
+
accessTokenExpiresAt: generation.accessTokenExpiresAt,
|
|
1194
|
+
refreshToken,
|
|
1195
|
+
refreshTokenExpiresAt: generation.expiresAt,
|
|
1196
|
+
};
|
|
1197
|
+
}
|
|
1198
|
+
/** A spent hand-off code or refresh token came back: whoever holds it, the session ends. */
|
|
1199
|
+
async bearerCredentialReused(sessionIdArg, reasonArg) {
|
|
1200
|
+
this.emit({ event: 'bearer_credential_reused', sessionId: sessionIdArg, reason: reasonArg });
|
|
1201
|
+
return this.endSession(sessionIdArg, reasonArg);
|
|
1202
|
+
}
|
|
1203
|
+
/**
|
|
1204
|
+
* Takes a hand-off whose code expired unclaimed and ends its session, which
|
|
1205
|
+
* nothing can reach any more. The caller has read it expired; expiry never
|
|
1206
|
+
* moves, so only a claim in between can stop this.
|
|
1207
|
+
*/
|
|
1208
|
+
async endUnclaimedHandoff(handoffArg) {
|
|
1209
|
+
const taken = await this.requireBearer().models.BearerHandoff.atomicUpdate({ id: handoffArg.id, consumedAt: null }, { $set: { consumedAt: this.#now() } });
|
|
1210
|
+
if (taken.matchedCount === 1) {
|
|
1211
|
+
await this.endSession(handoffArg.sessionId, 'handoff_unclaimed');
|
|
1212
|
+
}
|
|
659
1213
|
}
|
|
660
1214
|
/** Revokes a session that was never handed out and erases its sealed tokens. */
|
|
661
1215
|
async discardUnopenedSession(sessionIdArg) {
|
|
662
|
-
await this
|
|
1216
|
+
await this.revokeSessionDocument(sessionIdArg);
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* Revokes a session not revoked yet and erases its sealed tokens; answers
|
|
1220
|
+
* the document as it was before, `null` when it was over already. Its
|
|
1221
|
+
* expiry comes forward to the revocation, never later, so the sweep finds
|
|
1222
|
+
* an ended session by its expiry alone and `revokedAt` keeps when and that
|
|
1223
|
+
* it was ended. Two conditional writes keep the earlier of the two times:
|
|
1224
|
+
* the first ends a session within its expiry, the second one past it. A
|
|
1225
|
+
* crash between them leaves an expired row unrevoked, which reads as over
|
|
1226
|
+
* and is swept; a row revoked before 19.4.0 kept its later expiry, which is
|
|
1227
|
+
* harmless because every reader checks `revokedAt` or reads live rows only,
|
|
1228
|
+
* and it ages out.
|
|
1229
|
+
*/
|
|
1230
|
+
async revokeSessionDocument(sessionIdArg) {
|
|
1231
|
+
const now = this.#now();
|
|
1232
|
+
const withinExpiry = await this.#models.Session.atomicFindOneAndUpdate({ id: sessionIdArg, revokedAt: { $exists: false }, expiresAt: { $gt: now } }, { $set: { revokedAt: now, expiresAt: now, ...REVOKED_TOKEN_FIELDS } }, { returnDocument: 'before' });
|
|
1233
|
+
if (withinExpiry.status === 'matched' && withinExpiry.document !== null) {
|
|
1234
|
+
return withinExpiry.document;
|
|
1235
|
+
}
|
|
1236
|
+
const pastExpiry = await this.#models.Session.atomicFindOneAndUpdate({ id: sessionIdArg, revokedAt: { $exists: false } }, { $set: { revokedAt: now, ...REVOKED_TOKEN_FIELDS } }, { returnDocument: 'before' });
|
|
1237
|
+
return pastExpiry.status === 'matched' && pastExpiry.document !== null
|
|
1238
|
+
? pastExpiry.document
|
|
1239
|
+
: null;
|
|
663
1240
|
}
|
|
664
1241
|
/**
|
|
665
1242
|
* Tells the application a session ended. Its hook never stands between the
|
|
@@ -693,13 +1270,11 @@ export class RelyingPartySessions {
|
|
|
693
1270
|
if (typeof sessionIdArg !== 'string' || sessionIdArg.length === 0) {
|
|
694
1271
|
return null;
|
|
695
1272
|
}
|
|
696
|
-
const
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
if (!revokedHere) {
|
|
1273
|
+
const before = await this.revokeSessionDocument(sessionIdArg);
|
|
1274
|
+
this.notifySessionEnded({ sessionId: sessionIdArg, reason: reasonArg, revokedHere: before !== null });
|
|
1275
|
+
if (!before) {
|
|
700
1276
|
return null;
|
|
701
1277
|
}
|
|
702
|
-
const before = revoked.document;
|
|
703
1278
|
return { sealedAccessToken: before.sealedAccessToken, sealedRefreshToken: before.sealedRefreshToken };
|
|
704
1279
|
}
|
|
705
1280
|
/** The provider says the login is over: the session ends here without asking it anything more. */
|
|
@@ -818,6 +1393,78 @@ export class RelyingPartySessions {
|
|
|
818
1393
|
this.emit({ event: 'login_attempt_sweep_failed', message: errorMessage(error) });
|
|
819
1394
|
}
|
|
820
1395
|
}
|
|
1396
|
+
/**
|
|
1397
|
+
* One bounded page per bearer login start, oldest first: hand-offs whose
|
|
1398
|
+
* code expired unclaimed end their session, and hand-offs and token
|
|
1399
|
+
* generations an hour past their expiry are removed — an unclaimed hand-off
|
|
1400
|
+
* only after its session was ended. A sweep that cannot run never blocks a
|
|
1401
|
+
* sign-in.
|
|
1402
|
+
*/
|
|
1403
|
+
async sweepBearerState() {
|
|
1404
|
+
const bearer = this.requireBearer();
|
|
1405
|
+
try {
|
|
1406
|
+
const now = this.#now();
|
|
1407
|
+
const unclaimed = await bearer.models.BearerHandoff.getPagedInstances({
|
|
1408
|
+
filter: { consumedAt: null, expiresAt: { $lt: now } },
|
|
1409
|
+
sortField: 'expiresAt',
|
|
1410
|
+
sortDirection: 'asc',
|
|
1411
|
+
limit: LOGIN_ATTEMPT_SWEEP_BATCH,
|
|
1412
|
+
});
|
|
1413
|
+
for (const handoff of unclaimed.documents) {
|
|
1414
|
+
await this.endUnclaimedHandoff(handoff);
|
|
1415
|
+
}
|
|
1416
|
+
const staleHandoffs = await bearer.models.BearerHandoff.getPagedInstances({
|
|
1417
|
+
filter: { expiresAt: { $lt: now - LOGIN_ATTEMPT_SWEEP_GRACE_MS } },
|
|
1418
|
+
sortField: 'expiresAt',
|
|
1419
|
+
sortDirection: 'asc',
|
|
1420
|
+
limit: LOGIN_ATTEMPT_SWEEP_BATCH,
|
|
1421
|
+
});
|
|
1422
|
+
for (const handoff of staleHandoffs.documents) {
|
|
1423
|
+
if (handoff.consumedAt !== null) {
|
|
1424
|
+
await bearer.models.BearerHandoff.atomicDelete({ id: handoff.id });
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
const staleGenerations = await bearer.models.BearerToken.getPagedInstances({
|
|
1428
|
+
filter: { expiresAt: { $lt: now - LOGIN_ATTEMPT_SWEEP_GRACE_MS } },
|
|
1429
|
+
sortField: 'expiresAt',
|
|
1430
|
+
sortDirection: 'asc',
|
|
1431
|
+
limit: LOGIN_ATTEMPT_SWEEP_BATCH,
|
|
1432
|
+
});
|
|
1433
|
+
for (const generation of staleGenerations.documents) {
|
|
1434
|
+
await bearer.models.BearerToken.atomicDelete({ id: generation.id });
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
catch (error) {
|
|
1438
|
+
this.emit({ event: 'bearer_sweep_failed', message: errorMessage(error) });
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
/**
|
|
1442
|
+
* Removes sessions an hour past their expiry, oldest first, one bounded
|
|
1443
|
+
* page per login start and per session the application opens. An ended
|
|
1444
|
+
* session's expiry is its revocation at the latest, so the expiry index
|
|
1445
|
+
* finds expired and revoked sessions alike. Each of them ended already: the
|
|
1446
|
+
* row goes without an end, a hook or a provider call. A row is deleted only
|
|
1447
|
+
* while its expiry is still past the cutoff, so a row whose expiry moved
|
|
1448
|
+
* after the page was read stays. A sweep that cannot run never blocks a
|
|
1449
|
+
* sign-in.
|
|
1450
|
+
*/
|
|
1451
|
+
async sweepEndedSessions() {
|
|
1452
|
+
try {
|
|
1453
|
+
const cutoff = this.#now() - LOGIN_ATTEMPT_SWEEP_GRACE_MS;
|
|
1454
|
+
const page = await this.#models.Session.getPagedInstances({
|
|
1455
|
+
filter: { expiresAt: { $lt: cutoff } },
|
|
1456
|
+
sortField: 'expiresAt',
|
|
1457
|
+
sortDirection: 'asc',
|
|
1458
|
+
limit: LOGIN_ATTEMPT_SWEEP_BATCH,
|
|
1459
|
+
});
|
|
1460
|
+
for (const session of page.documents) {
|
|
1461
|
+
await this.#models.Session.atomicDelete({ id: session.id, expiresAt: { $lt: cutoff } });
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
catch (error) {
|
|
1465
|
+
this.emit({ event: 'session_sweep_failed', message: errorMessage(error) });
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
821
1468
|
/**
|
|
822
1469
|
* Reports one diagnostic. Every cleanup step reports through here, so a
|
|
823
1470
|
* throwing sink must not end it: the event and the sink's failure go to
|
|
@@ -845,4 +1492,4 @@ export class RelyingPartySessions {
|
|
|
845
1492
|
}
|
|
846
1493
|
}
|
|
847
1494
|
}
|
|
848
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWx5aW5ncGFydHlzZXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3JlbHlpbmdwYXJ0eS9jbGFzc2VzLnJlbHlpbmdwYXJ0eXNlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBS3hCLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQWtCN0QsTUFBTSxDQUFDLE1BQU0sNkNBQTZDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDMUUsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQUcsUUFBUSxDQUFDO0FBQ2hFLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxrQ0FBa0MsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTVHLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBQ3BDLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDO0FBQ3pDLG9HQUFvRztBQUNwRyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3JELDhGQUE4RjtBQUM5RixNQUFNLENB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
|
|
1495
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWx5aW5ncGFydHlzZXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3JlbHlpbmdwYXJ0eS9jbGFzc2VzLnJlbHlpbmdwYXJ0eXNlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBS3hCLE1BQU0sOEJBQThCLENBQUM7QUFRdEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZixjQUFjLEVBQ2QsNEJBQTRCLEVBQzVCLHdCQUF3QixFQUN4QixtQkFBbUIsR0FDcEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMkI3RCxNQUFNLENBQUMsTUFBTSw2Q0FBNkMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMxRSxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxRQUFRLENBQUM7QUFDaEUsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFNUcsTUFBTSx1QkFBdUIsR0FBRyxHQUFH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
|