@idp.global/sdk 19.4.0 → 19.5.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 +26 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_browser/classes.relyingpartybearerclient.d.ts +40 -3
- package/dist_ts_browser/classes.relyingpartybearerclient.js +67 -12
- package/dist_ts_relyingparty/classes.errors.d.ts +2 -0
- package/dist_ts_relyingparty/classes.errors.js +2 -1
- package/dist_ts_relyingparty/classes.relyingpartysessions.d.ts +64 -9
- package/dist_ts_relyingparty/classes.relyingpartysessions.js +158 -31
- package/dist_ts_relyingparty/contract.bearer.d.ts +37 -0
- package/dist_ts_relyingparty/contract.bearer.js +5 -1
- package/dist_ts_relyingparty/helpers.bearer.d.ts +2 -3
- package/dist_ts_relyingparty/helpers.bearer.js +4 -6
- package/dist_ts_relyingparty/interfaces.d.ts +42 -3
- package/package.json +1 -1
- package/readme.md +156 -10
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_browser/classes.relyingpartybearerclient.ts +98 -18
- package/ts_relyingparty/classes.errors.ts +3 -0
- package/ts_relyingparty/classes.relyingpartysessions.ts +170 -36
- package/ts_relyingparty/contract.bearer.ts +46 -0
- package/ts_relyingparty/helpers.bearer.ts +3 -6
- package/ts_relyingparty/interfaces.ts +44 -7
package/changelog.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-10-26 - 19.5.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- pairing a device: `openBearerHandoff({ openerSessionId, codeChallenge, maxAgeSeconds? })` (relyingparty)
|
|
8
|
+
- An application that has signed a person in opens a bearer session for a second device of theirs, such as a TV or a browser extension, and answers its single-use hand-off code. The device claims the code at the existing `bearer/claim` with the verifier of its challenge, under the rules of a bearer login's code: one claim within at most 60 seconds, never past the session, stored only as a hash, and a reused code, a wrong verifier or an unclaimed code ends the session.
|
|
9
|
+
- The opener must be a live provider login: not ended or expired, with an active principal and its own `idpSubject`. A session from `openSession` or from `openBearerHandoff` does not qualify, so a paired device cannot pair another. Any other opener throws the new `RelyingPartyError` code `invalid_handoff_opener` (400) and stores nothing; a consumer with an exhaustive switch over `TRelyingPartyErrorCode` adds that case. A malformed challenge throws `invalid_bearer_request`, a `maxAgeSeconds` outside 1 to `sessionMaxAgeSeconds` throws a `RangeError`, and without `bearer` the call throws `login_method_unavailable`. It works in bearer-only mode, and like every way to create a session it sweeps first.
|
|
10
|
+
- The session acts as the opener's principal, without `idpSubject` or `loginAttemptId`, and lives `maxAgeSeconds` (by default `sessionMaxAgeSeconds`), the same rule as every session. It refreshes without the provider. Its expiry, `endSession`, `endSessionsOfPrincipal`, `bearer/logout` and the reuse of a credential end it. An idp.global logout does not reach it, and `AuthorityObserver` refuses it with `authority_login_required` without ending it; the readme lists what an application does about that.
|
|
11
|
+
- `refreshBearerTokens` asks the provider exactly when the session stores a provider subject, as every session from a bearer login does, so provider sessions refresh as before.
|
|
12
|
+
- erasing a principal's sessions: `eraseSessionsOfPrincipal(principalId)` (relyingparty)
|
|
13
|
+
- For deleting an account, after the application's own erasers and before its user record. It ends every session of the principal not revoked yet, an expired one too, as `endSession` does (`onSessionEnded` fires and the provider tokens go back), then deletes every session row of the principal, live or ended, with the login attempt a provider session came out of and, in bearer mode, its hand-offs, claimed or not, and its token generations. It does not wait for a sweep, deletes each session row last so a failed erase can be retried, and answers the counts (`IRelyingPartySessionsErasure`).
|
|
14
|
+
- `onSessionEnded` names the principal of a session it revoked (relyingparty)
|
|
15
|
+
- The event is `{ sessionId, reason, revokedHere: true, principalId }` when this call revoked the session and `{ sessionId, reason, revokedHere: false }` when it was over already, so an application can end a person's other sessions on `refresh_token_refused` without keeping a table of its own. A handler that reads `sessionId`, `reason` and `revokedHere` compiles unchanged; code that builds the event itself with `revokedHere: true` adds `principalId`.
|
|
16
|
+
- `onProviderSessionOpened` carries the bearer delivery (relyingparty)
|
|
17
|
+
- A bearer login's session opens with `delivery` (`IRelyingPartyBearerDelivery`: client kind, return target and the client's `state`); a cookie login's has none.
|
|
18
|
+
- `createPkce()` and `claimCode(pkce, code)` on `RelyingPartyBearerClient` (browser)
|
|
19
|
+
- `createPkce()` makes a verifier and its S256 challenge. `claimCode` claims a code bound to that challenge that reached the client another way than its own login, such as a device pairing. It keeps the client's rules: one claim, never retried, under `requestTimeoutMs`, and the pair replaces the stored one under the Web Lock, ending that pair's session.
|
|
20
|
+
- A pair is claimed with once; a second call, after a failed claim as well, is `already_received` and sends nothing. A malformed verifier, a challenge that is not the verifier's S256, or a code that is not text throws before anything is sent. Neither method needs a window.
|
|
21
|
+
- In Chromium 149 the client runs in a Manifest V3 extension's service worker that imports `@idp.global/sdk/browser/bearer`. The extension needs a host permission for the relying party's origin, because the bearer routes answer CORS for popup origins only.
|
|
22
|
+
- the requests of the bearer routes are exported types (relyingparty, browser)
|
|
23
|
+
- `IRelyingPartyBearerLoginQuery` (the `bearer/login` query by its parameter names), `IRelyingPartyBearerClaimRequest`, `IRelyingPartyBearerRefreshRequest` and `IRelyingPartyBearerLogoutRequest` come from the import-free contract module beside the answer types. `@idp.global/sdk/relyingparty`, `@idp.global/sdk/browser` and `@idp.global/sdk/browser/bearer` export them, and the browser client sends exactly these shapes.
|
|
24
|
+
|
|
25
|
+
### Maintenance
|
|
26
|
+
|
|
27
|
+
- release tooling: pnpm 12.14.0
|
|
28
|
+
|
|
3
29
|
## 2026-10-22 - 19.4.0
|
|
4
30
|
|
|
5
31
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@idp.global/sdk',
|
|
6
|
-
version: '19.
|
|
6
|
+
version: '19.5.0',
|
|
7
7
|
description: 'Reusable browser and server SDK for idp.global authentication.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdFQUFnRTtDQUM5RSxDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RELYING_PARTY_BEARER_MESSAGE_TYPE, type IRelyingPartyBearerTokenAnswer } from '../dist_ts_relyingparty/contract.bearer.js';
|
|
2
|
-
export type { IRelyingPartyBearerErrorAnswer, IRelyingPartyBearerLogoutAnswer, IRelyingPartyBearerMessage, IRelyingPartyBearerSessionAnswer, IRelyingPartyBearerSessionInfo, IRelyingPartyBearerTokenAnswer, TRelyingPartyBearerDeliveryError, TRelyingPartyBearerErrorCode, } from '../dist_ts_relyingparty/contract.bearer.js';
|
|
2
|
+
export type { IRelyingPartyBearerClaimRequest, IRelyingPartyBearerErrorAnswer, IRelyingPartyBearerLoginQuery, IRelyingPartyBearerLogoutAnswer, IRelyingPartyBearerLogoutRequest, IRelyingPartyBearerMessage, IRelyingPartyBearerRefreshRequest, IRelyingPartyBearerSessionAnswer, IRelyingPartyBearerSessionInfo, IRelyingPartyBearerTokenAnswer, TRelyingPartyBearerDeliveryError, TRelyingPartyBearerErrorCode, } from '../dist_ts_relyingparty/contract.bearer.js';
|
|
3
3
|
export { RELYING_PARTY_BEARER_MESSAGE_TYPE };
|
|
4
4
|
/** The client kinds a browser signs in as; native clients use `loopback` and `custom_scheme` themselves. */
|
|
5
5
|
export type TRelyingPartyBearerBrowserClientKind = 'web' | 'popup';
|
|
@@ -35,6 +35,18 @@ export interface IRelyingPartyBearerTokenStorage {
|
|
|
35
35
|
signal: AbortSignal;
|
|
36
36
|
}): Promise<void>;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* A PKCE pair (RFC 7636): the verifier the client keeps and the S256
|
|
40
|
+
* challenge it hands out. `codeVerifier` is the secret that makes a code
|
|
41
|
+
* worth anything; keep it like a pending login, never in a URL, a log or a
|
|
42
|
+
* message.
|
|
43
|
+
*/
|
|
44
|
+
export interface IRelyingPartyBearerPkce {
|
|
45
|
+
/** 43 characters from 32 random bytes */
|
|
46
|
+
codeVerifier: string;
|
|
47
|
+
/** BASE64URL(SHA-256(codeVerifier)) */
|
|
48
|
+
codeChallenge: string;
|
|
49
|
+
}
|
|
38
50
|
/**
|
|
39
51
|
* A login on its way: what `createLogin` made and the receiver needs back.
|
|
40
52
|
* A `web` login leaves the page, so the application keeps it until the
|
|
@@ -129,7 +141,7 @@ export type TRelyingPartyBearerClientErrorCode =
|
|
|
129
141
|
'state_mismatch'
|
|
130
142
|
/** the delivery carries no code; `deliveryError` says why */
|
|
131
143
|
| 'login_failed'
|
|
132
|
-
/** this login was received once already; a code is claimed once, never again */
|
|
144
|
+
/** this login, or this PKCE pair, was received once already; a code is claimed once, never again */
|
|
133
145
|
| 'already_received'
|
|
134
146
|
/** the browser opened no popup */
|
|
135
147
|
| 'popup_blocked'
|
|
@@ -172,7 +184,9 @@ export declare class RelyingPartyBearerClientError extends Error {
|
|
|
172
184
|
* request or write never holds the other tabs. A login replaces the stored
|
|
173
185
|
* pair and ends that pair's session. Rotation is strict at the relying
|
|
174
186
|
* party: a refresh token spent once ends the session when it comes back, so
|
|
175
|
-
* nothing here retries a claim or a refresh.
|
|
187
|
+
* nothing here retries a claim or a refresh. A code that reaches the client
|
|
188
|
+
* another way, such as a device pairing, is claimed through `createPkce` and
|
|
189
|
+
* `claimCode` under the same rules, without a window.
|
|
176
190
|
*
|
|
177
191
|
* It needs the Web Locks API and Web Crypto, both of them only in a secure
|
|
178
192
|
* context, and has no fallback for either.
|
|
@@ -191,6 +205,27 @@ export declare class RelyingPartyBearerClient {
|
|
|
191
205
|
clientKind: TRelyingPartyBearerBrowserClientKind;
|
|
192
206
|
returnTarget: string;
|
|
193
207
|
}): Promise<IRelyingPartyBearerClientLogin>;
|
|
208
|
+
/**
|
|
209
|
+
* A fresh PKCE pair: a verifier from 32 random bytes and its S256
|
|
210
|
+
* challenge. For a code the client does not receive through its own login,
|
|
211
|
+
* such as one the application delivers to a device it pairs: the challenge
|
|
212
|
+
* goes to the application, and `claimCode` claims the code with the pair.
|
|
213
|
+
* Needs no window.
|
|
214
|
+
*/
|
|
215
|
+
createPkce(): Promise<IRelyingPartyBearerPkce>;
|
|
216
|
+
/**
|
|
217
|
+
* Claims a hand-off code that was bound to `pkceArg`'s challenge and
|
|
218
|
+
* reached this client some other way than its own login, such as a device
|
|
219
|
+
* pairing (`openBearerHandoff` at the relying party). It is received like
|
|
220
|
+
* a login: one claim, never retried, under `requestTimeoutMs`, and the
|
|
221
|
+
* claimed pair replaces the stored one under the lock, whose session is
|
|
222
|
+
* ended then (`IRelyingPartyBearerLoginResult`). A pair is claimed with
|
|
223
|
+
* once: a second call with it, after a failed claim too, is
|
|
224
|
+
* `already_received` and sends nothing. A pair that is not one (a
|
|
225
|
+
* malformed verifier, a challenge that is not its S256) or a code that is
|
|
226
|
+
* not text is refused before anything is sent. Needs no window.
|
|
227
|
+
*/
|
|
228
|
+
claimCode(pkceArg: IRelyingPartyBearerPkce, codeArg: string): Promise<IRelyingPartyBearerLoginResult>;
|
|
194
229
|
/**
|
|
195
230
|
* Receives a `web` login on its return target page. The delivery leaves
|
|
196
231
|
* the address first, before anything is checked, so neither a reload nor
|
|
@@ -238,6 +273,8 @@ export declare class RelyingPartyBearerClient {
|
|
|
238
273
|
private isFresh;
|
|
239
274
|
/** Takes a delivery for its login, once, claims its code and stores the pair in place of the one before. */
|
|
240
275
|
private receive;
|
|
276
|
+
/** Claims a code once with its verifier and stores the pair in place of the one before. */
|
|
277
|
+
private claim;
|
|
241
278
|
/**
|
|
242
279
|
* Stores a claimed pair in place of the stored one and then ends the
|
|
243
280
|
* session of that one with its tokens, held here, through the logout
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RELYING_PARTY_BEARER_MESSAGE_TYPE, } from '../dist_ts_relyingparty/contract.bearer.js';
|
|
1
|
+
import { isPkceVerifier, RELYING_PARTY_BEARER_MESSAGE_TYPE, } from '../dist_ts_relyingparty/contract.bearer.js';
|
|
2
2
|
export { RELYING_PARTY_BEARER_MESSAGE_TYPE };
|
|
3
3
|
export class RelyingPartyBearerClientError extends Error {
|
|
4
4
|
code;
|
|
@@ -99,7 +99,9 @@ const tokenAnswerOf = (answerArg) => {
|
|
|
99
99
|
* request or write never holds the other tabs. A login replaces the stored
|
|
100
100
|
* pair and ends that pair's session. Rotation is strict at the relying
|
|
101
101
|
* party: a refresh token spent once ends the session when it comes back, so
|
|
102
|
-
* nothing here retries a claim or a refresh.
|
|
102
|
+
* nothing here retries a claim or a refresh. A code that reaches the client
|
|
103
|
+
* another way, such as a device pairing, is claimed through `createPkce` and
|
|
104
|
+
* `claimCode` under the same rules, without a window.
|
|
103
105
|
*
|
|
104
106
|
* It needs the Web Locks API and Web Crypto, both of them only in a secure
|
|
105
107
|
* context, and has no fallback for either.
|
|
@@ -117,6 +119,8 @@ export class RelyingPartyBearerClient {
|
|
|
117
119
|
#now;
|
|
118
120
|
/** the states of the logins received here; a login is received once */
|
|
119
121
|
#receivedStates = new Set();
|
|
122
|
+
/** the challenges of the pairs `claimCode` claimed with here; a pair is claimed with once */
|
|
123
|
+
#claimedChallenges = new Set();
|
|
120
124
|
constructor(optionsArg) {
|
|
121
125
|
const origin = optionsArg?.origin;
|
|
122
126
|
let parsedOrigin = null;
|
|
@@ -190,16 +194,60 @@ export class RelyingPartyBearerClient {
|
|
|
190
194
|
if (!isText(returnTarget)) {
|
|
191
195
|
throw new Error('returnTarget must name the configured return target');
|
|
192
196
|
}
|
|
193
|
-
const codeVerifier =
|
|
197
|
+
const { codeVerifier, codeChallenge } = await this.createPkce();
|
|
194
198
|
const state = randomBase64Url();
|
|
199
|
+
const query = {
|
|
200
|
+
client_kind: clientKind,
|
|
201
|
+
return_target: returnTarget,
|
|
202
|
+
code_challenge: codeChallenge,
|
|
203
|
+
code_challenge_method: 'S256',
|
|
204
|
+
state,
|
|
205
|
+
};
|
|
195
206
|
const url = new URL(this.#paths.login);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
url.searchParams.set('code_challenge_method', 'S256');
|
|
200
|
-
url.searchParams.set('state', state);
|
|
207
|
+
for (const [name, value] of Object.entries(query)) {
|
|
208
|
+
url.searchParams.set(name, value);
|
|
209
|
+
}
|
|
201
210
|
return { clientKind, returnTarget, state, codeVerifier, url: url.href };
|
|
202
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* A fresh PKCE pair: a verifier from 32 random bytes and its S256
|
|
214
|
+
* challenge. For a code the client does not receive through its own login,
|
|
215
|
+
* such as one the application delivers to a device it pairs: the challenge
|
|
216
|
+
* goes to the application, and `claimCode` claims the code with the pair.
|
|
217
|
+
* Needs no window.
|
|
218
|
+
*/
|
|
219
|
+
async createPkce() {
|
|
220
|
+
const codeVerifier = randomBase64Url();
|
|
221
|
+
return { codeVerifier, codeChallenge: await pkceChallengeOf(codeVerifier) };
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Claims a hand-off code that was bound to `pkceArg`'s challenge and
|
|
225
|
+
* reached this client some other way than its own login, such as a device
|
|
226
|
+
* pairing (`openBearerHandoff` at the relying party). It is received like
|
|
227
|
+
* a login: one claim, never retried, under `requestTimeoutMs`, and the
|
|
228
|
+
* claimed pair replaces the stored one under the lock, whose session is
|
|
229
|
+
* ended then (`IRelyingPartyBearerLoginResult`). A pair is claimed with
|
|
230
|
+
* once: a second call with it, after a failed claim too, is
|
|
231
|
+
* `already_received` and sends nothing. A pair that is not one (a
|
|
232
|
+
* malformed verifier, a challenge that is not its S256) or a code that is
|
|
233
|
+
* not text is refused before anything is sent. Needs no window.
|
|
234
|
+
*/
|
|
235
|
+
async claimCode(pkceArg, codeArg) {
|
|
236
|
+
const codeVerifier = pkceArg?.codeVerifier;
|
|
237
|
+
const codeChallenge = pkceArg?.codeChallenge;
|
|
238
|
+
if (!isPkceVerifier(codeVerifier) || typeof codeChallenge !== 'string' || codeChallenge !== await pkceChallengeOf(codeVerifier)) {
|
|
239
|
+
throw new Error('claimCode needs a PKCE pair: a verifier and its S256 challenge, as createPkce makes them');
|
|
240
|
+
}
|
|
241
|
+
if (!isText(codeArg)) {
|
|
242
|
+
throw new Error('claimCode needs the hand-off code as text');
|
|
243
|
+
}
|
|
244
|
+
if (this.#claimedChallenges.has(codeChallenge)) {
|
|
245
|
+
throw new RelyingPartyBearerClientError('already_received');
|
|
246
|
+
}
|
|
247
|
+
// taken before the claim is sent: a failed claim uses the pair up too
|
|
248
|
+
this.#claimedChallenges.add(codeChallenge);
|
|
249
|
+
return this.claim(codeArg, codeVerifier);
|
|
250
|
+
}
|
|
203
251
|
/**
|
|
204
252
|
* Receives a `web` login on its return target page. The delivery leaves
|
|
205
253
|
* the address first, before anything is checked, so neither a reload nor
|
|
@@ -349,8 +397,13 @@ export class RelyingPartyBearerClient {
|
|
|
349
397
|
if (!isText(codeArg)) {
|
|
350
398
|
throw new RelyingPartyBearerClientError('unexpected_answer');
|
|
351
399
|
}
|
|
400
|
+
return this.claim(codeArg, loginArg.codeVerifier);
|
|
401
|
+
}
|
|
402
|
+
/** Claims a code once with its verifier and stores the pair in place of the one before. */
|
|
403
|
+
async claim(codeArg, codeVerifierArg) {
|
|
404
|
+
const body = { code: codeArg, codeVerifier: codeVerifierArg };
|
|
352
405
|
// the claim touches no stored pair, so it holds no lock, only its own deadline; a failed one leaves the stored pair as it was
|
|
353
|
-
const answer = tokenAnswerOf(await this.withDeadline((signalArg) => this.post(this.#paths.claim,
|
|
406
|
+
const answer = tokenAnswerOf(await this.withDeadline((signalArg) => this.post(this.#paths.claim, body, {}, signalArg)));
|
|
354
407
|
if (!answer) {
|
|
355
408
|
throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
|
|
356
409
|
}
|
|
@@ -475,8 +528,9 @@ export class RelyingPartyBearerClient {
|
|
|
475
528
|
return current;
|
|
476
529
|
}
|
|
477
530
|
let answer;
|
|
531
|
+
const body = { refreshToken: current.refreshToken };
|
|
478
532
|
try {
|
|
479
|
-
answer = tokenAnswerOf(await this.post(this.#paths.refresh,
|
|
533
|
+
answer = tokenAnswerOf(await this.post(this.#paths.refresh, body, {}, signalArg));
|
|
480
534
|
}
|
|
481
535
|
catch (error) {
|
|
482
536
|
if (error instanceof RelyingPartyBearerClientError && error.answerError === 'invalid_bearer_grant') {
|
|
@@ -498,7 +552,8 @@ export class RelyingPartyBearerClient {
|
|
|
498
552
|
}
|
|
499
553
|
/** Ends the session of a pair through the logout route and answers whether that ended a live one. */
|
|
500
554
|
async endSessionOf(pairArg, signalArg) {
|
|
501
|
-
const
|
|
555
|
+
const body = { refreshToken: pairArg.refreshToken };
|
|
556
|
+
const answer = await this.post(this.#paths.logout, body, { authorization: `Bearer ${pairArg.accessToken}` }, signalArg);
|
|
502
557
|
if (!isRecord(answer) || typeof answer.endedLiveSession !== 'boolean') {
|
|
503
558
|
throw new RelyingPartyBearerClientError('unexpected_answer', { status: 200 });
|
|
504
559
|
}
|
|
@@ -588,4 +643,4 @@ export class RelyingPartyBearerClient {
|
|
|
588
643
|
return answer;
|
|
589
644
|
}
|
|
590
645
|
}
|
|
591
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWx5aW5ncGFydHliZWFyZXJjbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19icm93c2VyL2NsYXNzZXMucmVseWluZ3BhcnR5YmVhcmVyY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSx1Q0FBdUMsQ0FBQztBQVkvQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQztBQXdKN0MsTUFBTSxPQUFPLDZCQUE4QixTQUFRLEtBQUs7SUFRcEMsSUFBSTtJQVBOLE1BQU0sQ0FBVTtJQUNoQyw4RUFBOEU7SUFDOUQsV0FBVyxDQUFVO0lBQ3JDLDBFQUEwRTtJQUMxRCxhQUFhLENBQVU7SUFFdkMsWUFDa0IsSUFBd0MsRUFDeEQsVUFBVSxHQUF1RixFQUFFO1FBRW5HLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBSHRFLElBQUk7UUFJcEIsSUFBSSxDQUFDLElBQUksR0FBRywrQkFBK0IsQ0FBQztRQUM1QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNyRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNwRixJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUFFRCxNQUFNLHlCQUF5QixHQUFHLFFBQVEsQ0FBQztBQUMzQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0s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
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWx5aW5ncGFydHliZWFyZXJjbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19icm93c2VyL2NsYXNzZXMucmVseWluZ3BhcnR5YmVhcmVyY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUNBQWlDLEdBT2xDLE1BQU0sdUNBQXVDLENBQUM7QUFnQi9DLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxDQUFDO0FBcUs3QyxNQUFNLE9BQU8sNkJBQThCLFNBQVEsS0FBSztJQVFwQyxJQUFJO0lBUE4sTUFBTSxDQUFVO0lBQ2hDLDhFQUE4RTtJQUM5RCxXQUFXLENBQVU7SUFDckMsMEVBQTBFO0lBQzFELGFBQWEsQ0FBVTtJQUV2QyxZQUNrQixJQUF3QyxFQUN4RCxVQUFVLEdBQXVGLEVBQUU7UUFFbkcsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFIdEUsSUFBSTtRQUlwQixJQUFJLENBQUMsSUFBSSxHQUFHLCtCQUErQixDQUFDO1FBQzVDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3JFLElBQUksVUFBVSxDQUFDLFdBQVcsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQ3BGLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQzVGLENBQUM7Q0FDRjtBQUVELE1BQU0seUJBQXlCLEdBQUcsUUFBUSxDQUFDO0FBQzNDLE1BQU0sdUJBQXVC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
|
|
@@ -8,6 +8,8 @@ export type TRelyingPartyErrorCode = 'login_method_unavailable' | 'invalid_login
|
|
|
8
8
|
| 'invalid_bearer_handoff'
|
|
9
9
|
/** a refresh token that is unknown, rotated, expired, or of a session that is over */
|
|
10
10
|
| 'invalid_bearer_grant'
|
|
11
|
+
/** `openBearerHandoff` named an opener that is no live provider login: unknown, ended, expired, of an inactive principal, or without a provider login of its own */
|
|
12
|
+
| 'invalid_handoff_opener'
|
|
11
13
|
/** a `sessionsOfPrincipal` cursor that no page of it answered */
|
|
12
14
|
| 'invalid_sessions_cursor';
|
|
13
15
|
/** A request the login flow refuses; the code is safe to answer, the browser learns nothing more. */
|
|
@@ -8,6 +8,7 @@ const RELYING_PARTY_ERROR_STATUS = {
|
|
|
8
8
|
return_target_not_allowed: 400,
|
|
9
9
|
invalid_bearer_handoff: 400,
|
|
10
10
|
invalid_bearer_grant: 400,
|
|
11
|
+
invalid_handoff_opener: 400,
|
|
11
12
|
invalid_sessions_cursor: 400,
|
|
12
13
|
};
|
|
13
14
|
/** A request the login flow refuses; the code is safe to answer, the browser learns nothing more. */
|
|
@@ -71,4 +72,4 @@ export class RelyingPartyDatabaseUnavailableError extends Error {
|
|
|
71
72
|
this.name = 'RelyingPartyDatabaseUnavailableError';
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19yZWx5aW5ncGFydHkvY2xhc3Nlcy5lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLE1BQU0sMEJBQTBCLEdBQXFEO0lBQ25GLHdCQUF3QixFQUFFLEdBQUc7SUFDN0Isc0JBQXNCLEVBQUUsR0FBRztJQUMzQixvQkFBb0IsRUFBRSxHQUFHO0lBQ3pCLHlCQUF5QixFQUFFLEdBQUc7SUFDOUIsc0JBQXNCLEVBQUUsR0FBRztJQUMzQixzQkFBc0IsRUFBRSxHQUFHO0lBQzNCLHlCQUF5QixFQUFFLEdBQUc7SUFDOUIsc0JBQXNCLEVBQUUsR0FBRztJQUMzQixvQkFBb0IsRUFBRSxHQUFHO0lBQ3pCLHNCQUFzQixFQUFFLEdBQUc7SUFDM0IsdUJBQXVCLEVBQUUsR0FBRztDQUM3QixDQUFDO0FBRUYscUdBQXFHO0FBQ3JHLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBR2QsSUFBSTtJQUZoQixNQUFNLENBQVM7SUFFL0IsWUFBNEIsSUFBNEI7UUFDdEQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQURjLElBQUk7UUFFOUIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxLQUFLO0lBSTFCLElBQUk7SUFDSixNQUFNO0lBSlIsUUFBUSxDQUFVO0lBRWxDLFlBQ2tCLElBQVksRUFDWixNQUFjLEVBQzlCLFVBQVUsR0FBMEIsRUFBRTtRQUV0QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBSkksSUFBSTtzQkFDSixNQUFNO1FBSXRCLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQscUdBQXFHO0FBQ3JHLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxLQUFLO0lBRXpCLEtBQUs7SUFEdkIsWUFDa0IsS0FBMEIsRUFDMUMsUUFBaUI7UUFFakIsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7cUJBSHhELEtBQUs7UUFJckIsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFRRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUdoQixJQUFJO0lBRmhCLE1BQU0sQ0FBUztJQUUvQixZQUE0QixJQUE4QixFQUFFLFFBQWtCO1FBQzVFLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFEUCxJQUFJO1FBRTlCLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQUVELGdGQUFnRjtBQUNoRixNQUFNLE9BQU8sb0NBQXFDLFNBQVEsS0FBSztJQUM3RCxZQUFZLFFBQWtCO1FBQzVCLEtBQUssQ0FBQyxpRUFBaUUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxJQUFJLEdBQUcsc0NBQXNDLENBQUM7SUFDckQsQ0FBQztDQUNGIn0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type IOidcProvider } from './classes.idpoidcprovider.js';
|
|
2
2
|
import type { IRelyingPartyModels } from './classes.rpmodels.js';
|
|
3
|
-
import type { IAuthorityTokenSource, IProviderToken, IRelyingPartyBearerDelivery, IRelyingPartyBearerHandoff, IRelyingPartyBearerLoginRequest, IRelyingPartyBearerLoginStart, IRelyingPartyBearerOptions, IRelyingPartyBearerReturnTargets, IRelyingPartyBearerTokens, IRelyingPartyHooks, IRelyingPartyLiveSession, IRelyingPartyLoginOptions, IRelyingPartyLoginStart, IRelyingPartySession, IRelyingPartySessionOpening, IRelyingPartySessionsPage, IRelyingPartySessionsPageOptions, IResolvedRelyingPartySession, TRelyingPartyPrincipals, TRelyingPartySessionEndReason } from './interfaces.js';
|
|
3
|
+
import type { IAuthorityTokenSource, IProviderToken, IRelyingPartyBearerDelivery, IRelyingPartyBearerHandoff, IRelyingPartyBearerHandoffOpening, IRelyingPartyBearerLoginRequest, IRelyingPartyBearerLoginStart, IRelyingPartyBearerOptions, IRelyingPartyBearerReturnTargets, IRelyingPartyBearerTokens, IRelyingPartyHooks, IRelyingPartyLiveSession, IRelyingPartyLoginOptions, IRelyingPartyLoginStart, IRelyingPartySession, IRelyingPartySessionOpening, IRelyingPartySessionsErasure, IRelyingPartySessionsPage, IRelyingPartySessionsPageOptions, IResolvedRelyingPartySession, TRelyingPartyPrincipals, TRelyingPartySessionEndReason } from './interfaces.js';
|
|
4
4
|
export declare const RELYING_PARTY_DEFAULT_SESSION_MAX_AGE_SECONDS: number;
|
|
5
5
|
export declare const RELYING_PARTY_DEFAULT_LOGIN_PATH_PREFIX = "/auth/";
|
|
6
6
|
/** The label the CSRF HMAC starts with unless the application names its own. */
|
|
@@ -86,7 +86,7 @@ export interface IRelyingPartySessionsOptions<TPrincipal extends object | undefi
|
|
|
86
86
|
*/
|
|
87
87
|
export interface IRelyingPartyBearerOnlySessionsOptions<TPrincipal extends object | undefined = undefined> extends Omit<IRelyingPartySessionsOptions<TPrincipal>, 'provider' | 'csrfKey' | 'csrfLabel' | 'cookieNames' | 'cookieSessions' | 'bearer'> {
|
|
88
88
|
cookieSessions: false;
|
|
89
|
-
/** every bearer session
|
|
89
|
+
/** every bearer session comes from a live provider login, directly or through a hand-off opened from one */
|
|
90
90
|
provider: IOidcProvider;
|
|
91
91
|
bearer: IRelyingPartyBearerOptions;
|
|
92
92
|
csrfKey?: never;
|
|
@@ -106,10 +106,10 @@ export interface IRelyingPartyBearerOnlySessionsOptions<TPrincipal extends objec
|
|
|
106
106
|
* ended sessions are swept one bounded batch at a time when a login starts or
|
|
107
107
|
* the application opens a session, and the only timer — the revocation
|
|
108
108
|
* budget — is unreferenced and cleared on every path. Every session comes
|
|
109
|
-
* from a login start or
|
|
110
|
-
* of at least one first, so removal keeps pace with creation
|
|
111
|
-
* sessions kept stay bounded. Nothing here does I/O while it is
|
|
112
|
-
* so it is built before the database connects.
|
|
109
|
+
* from a login start, `openSession` or `openBearerHandoff`, and each of those
|
|
110
|
+
* sweeps a batch of at least one first, so removal keeps pace with creation
|
|
111
|
+
* and the ended sessions kept stay bounded. Nothing here does I/O while it is
|
|
112
|
+
* constructed, so it is built before the database connects.
|
|
113
113
|
*
|
|
114
114
|
* `TPrincipal` is what a `principals.resolve` answers; with `isActive`
|
|
115
115
|
* principals it stays `undefined`.
|
|
@@ -185,6 +185,24 @@ export declare class RelyingPartySessions<TPrincipal extends object | undefined
|
|
|
185
185
|
endSessionsOfPrincipal(principalIdArg: string, optionsArg?: {
|
|
186
186
|
keepSessionId?: string;
|
|
187
187
|
}): Promise<number>;
|
|
188
|
+
/**
|
|
189
|
+
* Erases every session of a principal, live or ended, and every row that
|
|
190
|
+
* belongs to one, without waiting for a sweep: what an application runs
|
|
191
|
+
* when it deletes an account, after its own erasers and before its user
|
|
192
|
+
* record.
|
|
193
|
+
*
|
|
194
|
+
* First each session not revoked yet, an expired one too, ends as
|
|
195
|
+
* `endSession` ends it: its tokens stop working at once, `onSessionEnded`
|
|
196
|
+
* names the principal, and its provider tokens go back to idp.global,
|
|
197
|
+
* which a deleted row could no longer do. Then each session's rows go: in
|
|
198
|
+
* bearer mode its hand-offs, claimed or not, and its token generations;
|
|
199
|
+
* the login attempt a provider session came out of; and the session row
|
|
200
|
+
* last, because it is the only link from the principal to the others, so
|
|
201
|
+
* an erase that fails half way leaves a retry everything it needs. A
|
|
202
|
+
* session opened or a token issued while the erase runs is not covered;
|
|
203
|
+
* it works only while the principal is active.
|
|
204
|
+
*/
|
|
205
|
+
eraseSessionsOfPrincipal(principalIdArg: string): Promise<IRelyingPartySessionsErasure>;
|
|
188
206
|
/**
|
|
189
207
|
* One page of a principal's live sessions, newest first: the ones neither
|
|
190
208
|
* ended nor expired, and none at all while the principal is not active —
|
|
@@ -248,6 +266,35 @@ export declare class RelyingPartySessions<TPrincipal extends object | undefined
|
|
|
248
266
|
* at most and only its hash is stored. A code nobody claims ends its session.
|
|
249
267
|
*/
|
|
250
268
|
completeBearerLogin(callbackUrlArg: URL): Promise<IRelyingPartyBearerHandoff>;
|
|
269
|
+
/**
|
|
270
|
+
* Opens a bearer session for a device the application pairs to a person
|
|
271
|
+
* who is signed in here, and answers its single-use hand-off code, which
|
|
272
|
+
* the device claims at `bearer/claim` with the verifier of `codeChallenge`,
|
|
273
|
+
* exactly like the code of a bearer login.
|
|
274
|
+
*
|
|
275
|
+
* `openerSessionId` names the session that confirmed the pairing, taken
|
|
276
|
+
* from the application's own record, never from the device. It must be a
|
|
277
|
+
* live provider login: not ended, not expired, its principal active, and
|
|
278
|
+
* with a provider login of its own. A session the application opened
|
|
279
|
+
* itself or one opened here does not qualify, so a paired device never
|
|
280
|
+
* pairs another one. Anything else throws
|
|
281
|
+
* `RelyingPartyError('invalid_handoff_opener')`.
|
|
282
|
+
*
|
|
283
|
+
* The new session acts as the opener's principal and has no provider login
|
|
284
|
+
* of its own: it ends by its expiry, `endSession`, `endSessionsOfPrincipal`,
|
|
285
|
+
* `bearer/logout` or the reuse of one of its credentials, never by an
|
|
286
|
+
* idp.global logout, and `AuthorityObserver` refuses it
|
|
287
|
+
* (`authority_login_required`). `maxAgeSeconds` is a whole number from 1 to
|
|
288
|
+
* `sessionMaxAgeSeconds`, the default, as for `openSession`. The code lives
|
|
289
|
+
* `BEARER_HANDOFF_MAX_AGE_SECONDS` at most and never past the session, and
|
|
290
|
+
* only its hash is stored; a code nobody claims ends its session. Nothing
|
|
291
|
+
* is stored for a refused opening.
|
|
292
|
+
*/
|
|
293
|
+
openBearerHandoff(optionsArg: {
|
|
294
|
+
openerSessionId: string;
|
|
295
|
+
codeChallenge: string;
|
|
296
|
+
maxAgeSeconds?: number;
|
|
297
|
+
}): Promise<IRelyingPartyBearerHandoffOpening>;
|
|
251
298
|
/** `abandonLogin` for a bearer login: the provider came back without a code. */
|
|
252
299
|
abandonBearerLogin(callbackUrlArg: URL): Promise<void>;
|
|
253
300
|
/**
|
|
@@ -263,9 +310,11 @@ export declare class RelyingPartySessions<TPrincipal extends object | undefined
|
|
|
263
310
|
* access and refresh token answer, and the old access token stops working.
|
|
264
311
|
* Rotation is strict — a client serializes its refreshes — because a
|
|
265
312
|
* refresh token that comes back after it was spent ends the whole session.
|
|
266
|
-
* The provider login is checked on the way: a login
|
|
267
|
-
* the session here (`invalid_bearer_grant`), an
|
|
268
|
-
* with `AuthorityTokenError('authority_unavailable')`
|
|
313
|
+
* The provider login of a bearer login is checked on the way: a login
|
|
314
|
+
* idp.global ended ends the session here (`invalid_bearer_grant`), an
|
|
315
|
+
* unreachable provider fails with `AuthorityTokenError('authority_unavailable')`
|
|
316
|
+
* and spends nothing. A session `openBearerHandoff` opened has no provider
|
|
317
|
+
* login (no `idpSubject` is stored) and rotates without the provider.
|
|
269
318
|
*/
|
|
270
319
|
refreshBearerTokens(refreshTokenArg: unknown): Promise<IRelyingPartyBearerTokens>;
|
|
271
320
|
/**
|
|
@@ -341,6 +390,12 @@ export declare class RelyingPartySessions<TPrincipal extends object | undefined
|
|
|
341
390
|
private createProviderSession;
|
|
342
391
|
/** Where a bearer attempt's outcome goes, while its return target is still configured; `null` otherwise. */
|
|
343
392
|
private bearerDeliveryOfAttempt;
|
|
393
|
+
/**
|
|
394
|
+
* Stores a new hand-off of a session, bound to the client's challenge, and
|
|
395
|
+
* answers its code, which is stored only as a hash. The code lives
|
|
396
|
+
* `BEARER_HANDOFF_MAX_AGE_SECONDS` at most and never past the session.
|
|
397
|
+
*/
|
|
398
|
+
private storeBearerHandoff;
|
|
344
399
|
/** Stores the next token generation of a live session and answers its tokens; none of them is stored in the clear. */
|
|
345
400
|
private issueBearerTokens;
|
|
346
401
|
/** A spent hand-off code or refresh token came back: whoever holds it, the session ends. */
|