@idp.global/sdk 19.3.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 +66 -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 +313 -0
- package/dist_ts_browser/classes.relyingpartybearerclient.js +646 -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 +5 -1
- package/dist_ts_relyingparty/classes.errors.js +3 -1
- package/dist_ts_relyingparty/classes.relyingpartyroutes.d.ts +12 -0
- package/dist_ts_relyingparty/classes.relyingpartyroutes.js +33 -6
- package/dist_ts_relyingparty/classes.relyingpartysessions.d.ts +161 -11
- package/dist_ts_relyingparty/classes.relyingpartysessions.js +381 -55
- package/dist_ts_relyingparty/classes.rpmodels.d.ts +6 -4
- package/dist_ts_relyingparty/classes.rpmodels.js +8 -6
- package/dist_ts_relyingparty/contract.bearer.d.ts +119 -0
- package/dist_ts_relyingparty/contract.bearer.js +13 -0
- package/dist_ts_relyingparty/helpers.bearer.d.ts +3 -4
- package/dist_ts_relyingparty/helpers.bearer.js +4 -6
- package/dist_ts_relyingparty/interfaces.d.ts +75 -26
- package/package.json +2 -1
- package/readme.md +363 -21
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_browser/classes.relyingpartybearerclient.ts +901 -0
- package/ts_browser/index.ts +1 -0
- package/ts_relyingparty/classes.authorityobserver.ts +80 -12
- package/ts_relyingparty/classes.errors.ts +7 -1
- package/ts_relyingparty/classes.relyingpartyroutes.ts +38 -7
- package/ts_relyingparty/classes.relyingpartysessions.ts +463 -65
- package/ts_relyingparty/classes.rpmodels.ts +7 -4
- package/ts_relyingparty/contract.bearer.ts +145 -0
- package/ts_relyingparty/helpers.bearer.ts +10 -14
- package/ts_relyingparty/interfaces.ts +93 -33
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import type { TRelyingPartyBearerClientKind } from './interfaces.js';
|
|
3
3
|
/**
|
|
4
|
-
* One browser session of a relying party. The persisted field names
|
|
5
|
-
* types
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* One browser session of a relying party. The persisted field names and their
|
|
5
|
+
* types are the ones nevermind.finance has stored under `SessionDoc` since
|
|
6
|
+
* before this module existed, so its collection is read and written
|
|
7
|
+
* unchanged; its indexes are those and the `expiresAt` index the sweep of
|
|
8
|
+
* ended sessions reads.
|
|
8
9
|
*/
|
|
9
10
|
export declare class RelyingPartySessionDoc extends plugins.nosqldb.SmartDataDbDoc<RelyingPartySessionDoc, RelyingPartySessionDoc> {
|
|
10
11
|
id: string;
|
|
@@ -14,6 +15,7 @@ export declare class RelyingPartySessionDoc extends plugins.nosqldb.SmartDataDbD
|
|
|
14
15
|
userId: string;
|
|
15
16
|
createdAt: number;
|
|
16
17
|
lastSeenAt: number;
|
|
18
|
+
/** a revocation lowers it to `revokedAt` when that is earlier, so the sweep finds every ended session by it */
|
|
17
19
|
expiresAt: number;
|
|
18
20
|
/** absent while the session is valid */
|
|
19
21
|
revokedAt?: number;
|
|
@@ -35,10 +35,11 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from './plugins.js';
|
|
36
36
|
import { RelyingPartyDatabaseUnavailableError } from './classes.errors.js';
|
|
37
37
|
/**
|
|
38
|
-
* One browser session of a relying party. The persisted field names
|
|
39
|
-
* types
|
|
40
|
-
*
|
|
41
|
-
*
|
|
38
|
+
* One browser session of a relying party. The persisted field names and their
|
|
39
|
+
* types are the ones nevermind.finance has stored under `SessionDoc` since
|
|
40
|
+
* before this module existed, so its collection is read and written
|
|
41
|
+
* unchanged; its indexes are those and the `expiresAt` index the sweep of
|
|
42
|
+
* ended sessions reads.
|
|
42
43
|
*/
|
|
43
44
|
let RelyingPartySessionDoc = (() => {
|
|
44
45
|
let _classSuper = plugins.nosqldb.SmartDataDbDoc;
|
|
@@ -89,7 +90,7 @@ let RelyingPartySessionDoc = (() => {
|
|
|
89
90
|
_userId_decorators = [plugins.nosqldb.svDb(), plugins.nosqldb.index()];
|
|
90
91
|
_createdAt_decorators = [plugins.nosqldb.svDb()];
|
|
91
92
|
_lastSeenAt_decorators = [plugins.nosqldb.svDb()];
|
|
92
|
-
_expiresAt_decorators = [plugins.nosqldb.svDb()];
|
|
93
|
+
_expiresAt_decorators = [plugins.nosqldb.svDb(), plugins.nosqldb.index()];
|
|
93
94
|
_revokedAt_decorators = [plugins.nosqldb.svDb()];
|
|
94
95
|
_idpSubject_decorators = [plugins.nosqldb.svDb()];
|
|
95
96
|
_loginAttemptId_decorators = [plugins.nosqldb.svDb()];
|
|
@@ -119,6 +120,7 @@ let RelyingPartySessionDoc = (() => {
|
|
|
119
120
|
userId = (__runInitializers(this, _tokenHash_extraInitializers), __runInitializers(this, _userId_initializers, ''));
|
|
120
121
|
createdAt = (__runInitializers(this, _userId_extraInitializers), __runInitializers(this, _createdAt_initializers, 0));
|
|
121
122
|
lastSeenAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _lastSeenAt_initializers, 0));
|
|
123
|
+
/** a revocation lowers it to `revokedAt` when that is earlier, so the sweep finds every ended session by it */
|
|
122
124
|
expiresAt = (__runInitializers(this, _lastSeenAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, 0));
|
|
123
125
|
/** absent while the session is valid */
|
|
124
126
|
revokedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _revokedAt_initializers, void 0));
|
|
@@ -518,4 +520,4 @@ export const createRelyingPartyModels = (optionsArg) => {
|
|
|
518
520
|
BearerToken: BoundBearerTokenDoc,
|
|
519
521
|
};
|
|
520
522
|
};
|
|
521
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ycG1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3JlbHlpbmdwYXJ0eS9jbGFzc2VzLnJwbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUczRTs7Ozs7O0dBTUc7SUFDVSxzQkFBc0I7c0JBQVMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQUE3RCxzQkFBdUIsU0FBUSxXQUE4RTs7OzhCQUN2SCxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtxQ0FJckIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7a0NBSXJCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO3FDQUd2QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtzQ0FHdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7cUNBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO3FDQUl2QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtzQ0FJdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7MENBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFOzZDQUl0QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTs4Q0FHdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0RBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFOzRDQUl0QixP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
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire contract of the bearer hand-off routes: what a bearer client sends
|
|
3
|
+
* and what it is answered. This module imports nothing, so the browser client
|
|
4
|
+
* (`@idp.global/sdk/browser`) shares it with the routes without reaching any
|
|
5
|
+
* server code; keep it that way.
|
|
6
|
+
*/
|
|
7
|
+
/** The `type` of every message a popup delivery posts. */
|
|
8
|
+
export declare const RELYING_PARTY_BEARER_MESSAGE_TYPE = "idp.global/relyingparty:bearer-handoff";
|
|
9
|
+
/**
|
|
10
|
+
* How a bearer client receives the outcome of its login:
|
|
11
|
+
*
|
|
12
|
+
* - `web`: a redirect to a same-origin path of the application
|
|
13
|
+
* - `loopback`: a redirect to `http://127.0.0.1:<port>/…` or `http://[::1]:<port>/…`, any port (RFC 8252)
|
|
14
|
+
* - `custom_scheme`: a redirect to a registered private-use URI scheme such as `com.example.app:/signed-in` (RFC 8252)
|
|
15
|
+
* - `popup`: a page that posts the outcome to `window.opener` at exactly one registered origin
|
|
16
|
+
*/
|
|
17
|
+
export type TRelyingPartyBearerClientKind = 'web' | 'loopback' | 'custom_scheme' | 'popup';
|
|
18
|
+
/**
|
|
19
|
+
* What the popup page of a `popup` delivery posts to `window.opener`. The
|
|
20
|
+
* receiver accepts it only when `event.origin` is the relying party's public
|
|
21
|
+
* origin, `event.source` is the popup it opened, `type` is
|
|
22
|
+
* `RELYING_PARTY_BEARER_MESSAGE_TYPE` and `state` is its own.
|
|
23
|
+
*/
|
|
24
|
+
export interface IRelyingPartyBearerMessage {
|
|
25
|
+
type: string;
|
|
26
|
+
/** the hand-off code; absent when the login failed */
|
|
27
|
+
code?: string;
|
|
28
|
+
/** why the login failed (`TRelyingPartyBearerDeliveryError`); absent when it succeeded */
|
|
29
|
+
error?: string;
|
|
30
|
+
state?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Why a bearer login delivered no code, as the `error` of its redirect or
|
|
34
|
+
* popup message: `access_denied` when the provider came back without one,
|
|
35
|
+
* `authentication_failed` when the login could not be completed, or the code
|
|
36
|
+
* of the application's own refusal (`RelyingPartyRefusal.code`).
|
|
37
|
+
*/
|
|
38
|
+
export type TRelyingPartyBearerDeliveryError = 'access_denied' | 'authentication_failed' | (string & {});
|
|
39
|
+
/** Whether a value is a well-formed PKCE code verifier (RFC 7636 §4.1). */
|
|
40
|
+
export declare const isPkceVerifier: (valueArg: unknown) => valueArg is string;
|
|
41
|
+
/**
|
|
42
|
+
* The query of `GET <prefix>bearer/login`, by its parameter names on the
|
|
43
|
+
* wire. The routes check every parameter as untrusted input.
|
|
44
|
+
*/
|
|
45
|
+
export interface IRelyingPartyBearerLoginQuery {
|
|
46
|
+
client_kind: TRelyingPartyBearerClientKind;
|
|
47
|
+
/** one of the configured return targets of the kind, exactly; a loopback target with the client's port */
|
|
48
|
+
return_target: string;
|
|
49
|
+
/** BASE64URL(SHA-256(code verifier)), 43 characters */
|
|
50
|
+
code_challenge: string;
|
|
51
|
+
/** only `S256` is accepted */
|
|
52
|
+
code_challenge_method: 'S256';
|
|
53
|
+
/** the client's own correlation value, 1 to 256 characters of `A-Z a-z 0-9 . _ ~ -`, handed back with the outcome */
|
|
54
|
+
state?: string;
|
|
55
|
+
}
|
|
56
|
+
/** The JSON body of `POST <prefix>bearer/claim`. */
|
|
57
|
+
export interface IRelyingPartyBearerClaimRequest {
|
|
58
|
+
/** the hand-off code, claimed once */
|
|
59
|
+
code: string;
|
|
60
|
+
/** the verifier of the challenge the code is bound to (`isPkceVerifier`) */
|
|
61
|
+
codeVerifier: string;
|
|
62
|
+
}
|
|
63
|
+
/** The JSON body of `POST <prefix>bearer/refresh`. */
|
|
64
|
+
export interface IRelyingPartyBearerRefreshRequest {
|
|
65
|
+
/** the current refresh token; this call spends it */
|
|
66
|
+
refreshToken: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The JSON body of `POST <prefix>bearer/logout`. The session is named by
|
|
70
|
+
* `Authorization: Bearer <accessToken>`, or by `refreshToken` once that access
|
|
71
|
+
* token has expired.
|
|
72
|
+
*/
|
|
73
|
+
export interface IRelyingPartyBearerLogoutRequest {
|
|
74
|
+
refreshToken?: string;
|
|
75
|
+
}
|
|
76
|
+
/** The session a bearer answer names. */
|
|
77
|
+
export interface IRelyingPartyBearerSessionInfo {
|
|
78
|
+
sessionId: string;
|
|
79
|
+
principalId: string;
|
|
80
|
+
/** epoch milliseconds: the end of the session, which no refresh extends */
|
|
81
|
+
expiresAt: number;
|
|
82
|
+
}
|
|
83
|
+
/** What `POST <prefix>bearer/claim` and `POST <prefix>bearer/refresh` answer with status 200. */
|
|
84
|
+
export interface IRelyingPartyBearerTokenAnswer {
|
|
85
|
+
tokenType: 'Bearer';
|
|
86
|
+
accessToken: string;
|
|
87
|
+
/** epoch milliseconds on the relying party's clock */
|
|
88
|
+
accessTokenExpiresAt: number;
|
|
89
|
+
/** seconds the access token lives from the answer, for a client whose clock differs */
|
|
90
|
+
expiresIn: number;
|
|
91
|
+
/** spent by the next refresh; it never comes back after that */
|
|
92
|
+
refreshToken: string;
|
|
93
|
+
/** epoch milliseconds: the end of the session */
|
|
94
|
+
refreshTokenExpiresAt: number;
|
|
95
|
+
session: IRelyingPartyBearerSessionInfo;
|
|
96
|
+
}
|
|
97
|
+
/** What `GET <prefix>bearer/session` answers with status 200; `null` for any token that is not live. */
|
|
98
|
+
export interface IRelyingPartyBearerSessionAnswer {
|
|
99
|
+
session: IRelyingPartyBearerSessionInfo | null;
|
|
100
|
+
}
|
|
101
|
+
/** What `POST <prefix>bearer/logout` answers with status 200; `true` only when this call ended a live session. */
|
|
102
|
+
export interface IRelyingPartyBearerLogoutAnswer {
|
|
103
|
+
endedLiveSession: boolean;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The `error` of a failed bearer route, answered as `{ error }`:
|
|
107
|
+
*
|
|
108
|
+
* - `invalid_bearer_request` (400): a login start or claim with a missing or malformed parameter
|
|
109
|
+
* - `return_target_not_allowed` (400): a login start naming a return target not configured for its kind
|
|
110
|
+
* - `invalid_bearer_handoff` (400): a claim with a code that is unknown, expired, already claimed or of the wrong verifier
|
|
111
|
+
* - `invalid_bearer_grant` (400): a refresh token that is unknown, spent, expired or of a session that is over
|
|
112
|
+
* - `authority_unavailable` (503): a refresh that could not reach the provider; nothing was spent, retry it
|
|
113
|
+
* - `authentication_unavailable` (503): any other failure on the relying party's side
|
|
114
|
+
* - `forbidden` (403): a CORS preflight from an origin that is no popup return target
|
|
115
|
+
*/
|
|
116
|
+
export type TRelyingPartyBearerErrorCode = 'invalid_bearer_request' | 'return_target_not_allowed' | 'invalid_bearer_handoff' | 'invalid_bearer_grant' | 'authority_unavailable' | 'authentication_unavailable' | 'forbidden';
|
|
117
|
+
export interface IRelyingPartyBearerErrorAnswer {
|
|
118
|
+
error: TRelyingPartyBearerErrorCode;
|
|
119
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire contract of the bearer hand-off routes: what a bearer client sends
|
|
3
|
+
* and what it is answered. This module imports nothing, so the browser client
|
|
4
|
+
* (`@idp.global/sdk/browser`) shares it with the routes without reaching any
|
|
5
|
+
* server code; keep it that way.
|
|
6
|
+
*/
|
|
7
|
+
/** The `type` of every message a popup delivery posts. */
|
|
8
|
+
export const RELYING_PARTY_BEARER_MESSAGE_TYPE = 'idp.global/relyingparty:bearer-handoff';
|
|
9
|
+
/** RFC 7636 §4.1: a code verifier is 43 to 128 characters of `A-Z a-z 0-9 . _ ~ -`. */
|
|
10
|
+
const PKCE_VERIFIER = /^[A-Za-z0-9._~-]{43,128}$/u;
|
|
11
|
+
/** Whether a value is a well-formed PKCE code verifier (RFC 7636 §4.1). */
|
|
12
|
+
export const isPkceVerifier = (valueArg) => typeof valueArg === 'string' && PKCE_VERIFIER.test(valueArg);
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3QuYmVhcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfcmVseWluZ3BhcnR5L2NvbnRyYWN0LmJlYXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyx3Q0FBd0MsQ0FBQztBQW1DMUYsdUZBQXVGO0FBQ3ZGLE1BQU0sYUFBYSxHQUFHLDRCQUE0QixDQUFDO0FBRW5ELDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQ3RFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDIn0=
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isPkceVerifier, RELYING_PARTY_BEARER_MESSAGE_TYPE, type IRelyingPartyBearerMessage, type TRelyingPartyBearerClientKind } from './contract.bearer.js';
|
|
2
|
+
import type { IRelyingPartyBearerDelivery, IRelyingPartyBearerReturnTargets } from './interfaces.js';
|
|
3
|
+
export { isPkceVerifier, RELYING_PARTY_BEARER_MESSAGE_TYPE };
|
|
2
4
|
export declare const RELYING_PARTY_BEARER_CLIENT_KINDS: readonly TRelyingPartyBearerClientKind[];
|
|
3
|
-
/** The `type` of every message a popup delivery posts. */
|
|
4
|
-
export declare const RELYING_PARTY_BEARER_MESSAGE_TYPE = "idp.global/relyingparty:bearer-handoff";
|
|
5
5
|
export declare const isBearerClientKind: (valueArg: unknown) => valueArg is TRelyingPartyBearerClientKind;
|
|
6
6
|
export declare const isPkceChallenge: (valueArg: unknown) => valueArg is string;
|
|
7
|
-
export declare const isPkceVerifier: (valueArg: unknown) => valueArg is string;
|
|
8
7
|
export declare const isBearerClientState: (valueArg: unknown) => valueArg is string;
|
|
9
8
|
/** The S256 challenge of a verifier: BASE64URL(SHA-256(ASCII(verifier))). */
|
|
10
9
|
export declare const pkceChallengeOf: (verifierArg: string) => string;
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
+
import { isPkceVerifier, RELYING_PARTY_BEARER_MESSAGE_TYPE, } from './contract.bearer.js';
|
|
1
2
|
import { sha256, timingSafeEqualString } from './helpers.crypto.js';
|
|
2
3
|
import { sanitizeReturnPath } from './helpers.returnpath.js';
|
|
4
|
+
// the verifier check lives in the import-free contract, which the browser client shares
|
|
5
|
+
export { isPkceVerifier, RELYING_PARTY_BEARER_MESSAGE_TYPE };
|
|
3
6
|
export const RELYING_PARTY_BEARER_CLIENT_KINDS = Object.freeze([
|
|
4
7
|
'web',
|
|
5
8
|
'loopback',
|
|
6
9
|
'custom_scheme',
|
|
7
10
|
'popup',
|
|
8
11
|
]);
|
|
9
|
-
/** The `type` of every message a popup delivery posts. */
|
|
10
|
-
export const RELYING_PARTY_BEARER_MESSAGE_TYPE = 'idp.global/relyingparty:bearer-handoff';
|
|
11
12
|
/** A return target is a location the application configured, not a place to park data. */
|
|
12
13
|
const MAX_RETURN_TARGET_LENGTH = 2_048;
|
|
13
14
|
/** BASE64URL of a SHA-256 digest, without padding (RFC 7636 §4.2). */
|
|
14
15
|
const PKCE_CHALLENGE = /^[A-Za-z0-9_-]{43}$/u;
|
|
15
|
-
/** RFC 7636 §4.1: 43 to 128 unreserved characters. */
|
|
16
|
-
const PKCE_VERIFIER = /^[A-Za-z0-9._~-]{43,128}$/u;
|
|
17
16
|
const CLIENT_STATE = /^[A-Za-z0-9._~-]{1,256}$/u;
|
|
18
17
|
const LOOPBACK_HOSTS = ['127.0.0.1', '[::1]'];
|
|
19
18
|
/** A private-use scheme is a reverse domain name: it has a dot, and no web scheme has one (RFC 8252 §7.1). */
|
|
20
19
|
const CUSTOM_SCHEME = /^[a-z][a-z0-9+-]*(\.[a-z0-9+-]+)+:$/u;
|
|
21
20
|
export const isBearerClientKind = (valueArg) => typeof valueArg === 'string' && RELYING_PARTY_BEARER_CLIENT_KINDS.includes(valueArg);
|
|
22
21
|
export const isPkceChallenge = (valueArg) => typeof valueArg === 'string' && PKCE_CHALLENGE.test(valueArg);
|
|
23
|
-
export const isPkceVerifier = (valueArg) => typeof valueArg === 'string' && PKCE_VERIFIER.test(valueArg);
|
|
24
22
|
export const isBearerClientState = (valueArg) => typeof valueArg === 'string' && CLIENT_STATE.test(valueArg);
|
|
25
23
|
/** The S256 challenge of a verifier: BASE64URL(SHA-256(ASCII(verifier))). */
|
|
26
24
|
export const pkceChallengeOf = (verifierArg) => sha256(verifierArg);
|
|
@@ -196,4 +194,4 @@ export const bearerPopupPage = (deliveryArg, outcomeArg, nonceArg) => {
|
|
|
196
194
|
};
|
|
197
195
|
/** The policy of a popup page: its nonce script and nothing else. */
|
|
198
196
|
export const bearerPopupContentSecurityPolicy = (nonceArg) => `default-src 'none'; script-src 'nonce-${nonceArg}'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`;
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5iZWFyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19yZWx5aW5ncGFydHkvaGVscGVycy5iZWFyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxpQ0FBaUMsR0FHbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0Qsd0ZBQXdGO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBNkMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RyxLQUFLO0lBQ0wsVUFBVTtJQUNWLGVBQWU7SUFDZixPQUFPO0NBQ1IsQ0FBQyxDQUFDO0FBRUgsMEZBQTBGO0FBQzFGLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLHNFQUFzRTtBQUN0RSxNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQztBQUM5QyxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUNqRCxNQUFNLGNBQWMsR0FBc0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakUsOEdBQThHO0FBQzlHLE1BQU0sYUFBYSxHQUFHLHNDQUFzQyxDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBaUIsRUFBNkMsRUFBRSxDQUNqRyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUssaUNBQXVELENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTlHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDdkUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENB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
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { IOidcCompletion, TOidcCompletionFailureStage, TOidcPrompt, TOidcTokenHint } from './classes.idpoidcprovider.js';
|
|
2
|
+
import type { TRelyingPartyBearerClientKind } from './contract.bearer.js';
|
|
3
|
+
export type { IRelyingPartyBearerClaimRequest, IRelyingPartyBearerErrorAnswer, IRelyingPartyBearerLoginQuery, IRelyingPartyBearerLogoutAnswer, IRelyingPartyBearerLogoutRequest, IRelyingPartyBearerMessage, IRelyingPartyBearerRefreshRequest, IRelyingPartyBearerSessionAnswer, IRelyingPartyBearerSessionInfo, IRelyingPartyBearerTokenAnswer, TRelyingPartyBearerClientKind, TRelyingPartyBearerDeliveryError, TRelyingPartyBearerErrorCode, } from './contract.bearer.js';
|
|
2
4
|
/** A session as the application reads it; no token and no sealed value is part of it. */
|
|
3
5
|
export interface IRelyingPartySession {
|
|
4
6
|
id: string;
|
|
@@ -30,6 +32,19 @@ export interface IRelyingPartySessionOpening {
|
|
|
30
32
|
csrfToken: string;
|
|
31
33
|
sessionCookie: string;
|
|
32
34
|
}
|
|
35
|
+
/** What `sessionsOfPrincipal` reads: how many sessions, and after which page. */
|
|
36
|
+
export interface IRelyingPartySessionsPageOptions {
|
|
37
|
+
/** 1 to `RELYING_PARTY_MAX_SESSIONS_PAGE_LIMIT`; `RELYING_PARTY_DEFAULT_SESSIONS_PAGE_LIMIT` when absent */
|
|
38
|
+
limit?: number;
|
|
39
|
+
/** the `nextCursor` of the page before; absent for the first page */
|
|
40
|
+
cursor?: string;
|
|
41
|
+
}
|
|
42
|
+
/** One page of a principal's live sessions, newest first. */
|
|
43
|
+
export interface IRelyingPartySessionsPage {
|
|
44
|
+
sessions: IRelyingPartySession[];
|
|
45
|
+
/** opaque; reads the next page as `cursor`. Absent on the last page. */
|
|
46
|
+
nextCursor?: string;
|
|
47
|
+
}
|
|
33
48
|
/**
|
|
34
49
|
* What `startLogin` carries besides the return path. `intent` is the
|
|
35
50
|
* application's own text — the invitation a login accepts, the account it
|
|
@@ -54,15 +69,6 @@ export interface IRelyingPartyLoginStart {
|
|
|
54
69
|
authorizationUrl: URL;
|
|
55
70
|
intentCookie: string;
|
|
56
71
|
}
|
|
57
|
-
/**
|
|
58
|
-
* How a bearer client receives the outcome of its login:
|
|
59
|
-
*
|
|
60
|
-
* - `web`: a redirect to a same-origin path of the application
|
|
61
|
-
* - `loopback`: a redirect to `http://127.0.0.1:<port>/…` or `http://[::1]:<port>/…`, any port (RFC 8252)
|
|
62
|
-
* - `custom_scheme`: a redirect to a registered private-use URI scheme such as `com.example.app:/signed-in` (RFC 8252)
|
|
63
|
-
* - `popup`: a page that posts the outcome to `window.opener` at exactly one registered origin
|
|
64
|
-
*/
|
|
65
|
-
export type TRelyingPartyBearerClientKind = 'web' | 'loopback' | 'custom_scheme' | 'popup';
|
|
66
72
|
/**
|
|
67
73
|
* The exact return targets a bearer client may name, per client kind. A kind
|
|
68
74
|
* without targets is not offered. Matching is by equality, never by prefix
|
|
@@ -123,6 +129,35 @@ export interface IRelyingPartyBearerHandoff {
|
|
|
123
129
|
/** epoch milliseconds, at most `BEARER_HANDOFF_MAX_AGE_SECONDS` after the callback */
|
|
124
130
|
expiresAt: number;
|
|
125
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* A bearer session the application opened for a device it paired
|
|
134
|
+
* (`openBearerHandoff`): the session, which has no provider login of its own
|
|
135
|
+
* (`idpSubject` and `loginAttemptId` are absent), and the single-use code the
|
|
136
|
+
* device claims at `bearer/claim` with the verifier of its challenge. The
|
|
137
|
+
* code is no token; only its hash is stored.
|
|
138
|
+
*/
|
|
139
|
+
export interface IRelyingPartyBearerHandoffOpening {
|
|
140
|
+
session: IRelyingPartySession;
|
|
141
|
+
code: string;
|
|
142
|
+
/** epoch milliseconds, at most `BEARER_HANDOFF_MAX_AGE_SECONDS` after the opening and never past the session */
|
|
143
|
+
expiresAt: number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* What `eraseSessionsOfPrincipal` removed of one principal: the sessions it
|
|
147
|
+
* ended first, and the rows it deleted.
|
|
148
|
+
*/
|
|
149
|
+
export interface IRelyingPartySessionsErasure {
|
|
150
|
+
/** sessions not revoked yet (an expired one too) that it ended, each with `onSessionEnded` and its provider tokens handed back */
|
|
151
|
+
endedSessions: number;
|
|
152
|
+
/** session rows, live or ended */
|
|
153
|
+
deletedSessions: number;
|
|
154
|
+
/** the sign-in transactions the provider sessions came out of */
|
|
155
|
+
deletedLoginAttempts: number;
|
|
156
|
+
/** bearer hand-offs, claimed or not */
|
|
157
|
+
deletedBearerHandoffs: number;
|
|
158
|
+
/** bearer token generations, current or rotated */
|
|
159
|
+
deletedBearerTokens: number;
|
|
160
|
+
}
|
|
126
161
|
/**
|
|
127
162
|
* The relying party's own tokens of a bearer session. The refresh token
|
|
128
163
|
* rotates on every use; a rotated one coming back ends the session.
|
|
@@ -138,34 +173,36 @@ export interface IRelyingPartyBearerTokens {
|
|
|
138
173
|
/** epoch milliseconds: the end of the session, which no refresh extends */
|
|
139
174
|
refreshTokenExpiresAt: number;
|
|
140
175
|
}
|
|
141
|
-
/**
|
|
142
|
-
* What the popup page of a `popup` delivery posts to `window.opener`. The
|
|
143
|
-
* receiver accepts it only when `event.origin` is the relying party's public
|
|
144
|
-
* origin, `event.source` is the popup it opened, `type` is
|
|
145
|
-
* `RELYING_PARTY_BEARER_MESSAGE_TYPE` and `state` is its own.
|
|
146
|
-
*/
|
|
147
|
-
export interface IRelyingPartyBearerMessage {
|
|
148
|
-
type: string;
|
|
149
|
-
/** the hand-off code; absent when the login failed */
|
|
150
|
-
code?: string;
|
|
151
|
-
/** why the login failed; absent when it succeeded */
|
|
152
|
-
error?: string;
|
|
153
|
-
state?: string;
|
|
154
|
-
}
|
|
155
176
|
/** A provider access token usable right now, with the subject it belongs to. */
|
|
156
177
|
export interface IProviderToken {
|
|
157
178
|
accessToken: string;
|
|
158
179
|
subject: string;
|
|
159
180
|
/** epoch milliseconds; `0` when the provider named no lifetime */
|
|
160
181
|
expiresAt: number;
|
|
182
|
+
/**
|
|
183
|
+
* `true` only on the answer to `rejectedAccessToken`, and only when a
|
|
184
|
+
* rotation that this call started issued the token.
|
|
185
|
+
*/
|
|
186
|
+
rotatedAfterRejection?: boolean;
|
|
161
187
|
}
|
|
162
188
|
/** What an authority observer needs from the session owner. `RelyingPartySessions` implements it. */
|
|
163
189
|
export interface IAuthorityTokenSource {
|
|
164
190
|
/**
|
|
165
191
|
* The access token of a login session, rotated first when it is due. The
|
|
166
192
|
* session must belong to `expectedPrincipalIdArg`. Throws `AuthorityTokenError`.
|
|
193
|
+
*
|
|
194
|
+
* `rejectedAccessToken` is a token idp.global answered inactive for. The
|
|
195
|
+
* source must rotate the session's token then, whatever is stored, and set
|
|
196
|
+
* `rotatedAfterRejection` only when a rotation that this call started issued
|
|
197
|
+
* the token. A refused refresh ends the session and throws
|
|
198
|
+
* `authority_login_required`. A rotation that started before the call, one
|
|
199
|
+
* another replica holds, or a session without a refresh token marks
|
|
200
|
+
* nothing. A source that never rotates or never marks its answer can never
|
|
201
|
+
* refuse: the observer answers `authority_unavailable` (fail-closed).
|
|
167
202
|
*/
|
|
168
|
-
liveProviderToken(sessionIdArg: string, expectedPrincipalIdArg: string
|
|
203
|
+
liveProviderToken(sessionIdArg: string, expectedPrincipalIdArg: string, optionsArg?: {
|
|
204
|
+
rejectedAccessToken?: string;
|
|
205
|
+
}): Promise<IProviderToken>;
|
|
169
206
|
}
|
|
170
207
|
/**
|
|
171
208
|
* The application's side of a provider login: who the verified subject is
|
|
@@ -222,6 +259,8 @@ export type TRelyingPartySessionEndReason =
|
|
|
222
259
|
export type TRelyingPartyEventName = 'idp_token_refresh_failed' | 'idp_token_store_failed' | 'idp_session_ended' | 'oidc_sealed_token_unreadable' | 'oidc_token_revocation_failed' | 'oidc_token_revocation_timed_out' | 'login_attempt_sweep_failed'
|
|
223
260
|
/** expired bearer hand-offs and token generations could not be swept */
|
|
224
261
|
| 'bearer_sweep_failed'
|
|
262
|
+
/** sessions an hour past their end could not be swept */
|
|
263
|
+
| 'session_sweep_failed'
|
|
225
264
|
/** a bearer hand-off code or refresh token came back after its use; `reason` names which, the session ended */
|
|
226
265
|
| 'bearer_credential_reused'
|
|
227
266
|
/** an application hook threw; the step it belonged to ran on regardless */
|
|
@@ -244,21 +283,31 @@ export interface IRelyingPartyHooks {
|
|
|
244
283
|
* A provider login opened a session, linked to its attempt. Runs before the
|
|
245
284
|
* login answers; a throw fails the login: the session is revoked, the
|
|
246
285
|
* provider tokens are handed back and the original error is rethrown.
|
|
286
|
+
* `delivery` is where a bearer login's outcome goes (its client kind, return
|
|
287
|
+
* target and the client's `state`); a cookie login has none.
|
|
247
288
|
*/
|
|
248
289
|
onProviderSessionOpened?(eventArg: {
|
|
249
290
|
session: IRelyingPartySession;
|
|
291
|
+
delivery?: IRelyingPartyBearerDelivery;
|
|
250
292
|
}): Promise<void>;
|
|
251
293
|
/**
|
|
252
294
|
* A session ended, or a caller tried to end one that was already over
|
|
253
295
|
* (`revokedHere: false`). Close its live connections when `revokedHere`,
|
|
254
296
|
* drop cached authority either way. Must not wait. A throw (or a rejected
|
|
255
297
|
* promise) is reported as a `hook_failed` event and never stops the end:
|
|
256
|
-
* the provider tokens go back regardless.
|
|
298
|
+
* the provider tokens go back regardless. An end that revoked the session
|
|
299
|
+
* here names its principal (`principalId`); one that found it over already
|
|
300
|
+
* does not.
|
|
257
301
|
*/
|
|
258
302
|
onSessionEnded?(eventArg: {
|
|
259
303
|
sessionId: string;
|
|
260
304
|
reason: TRelyingPartySessionEndReason;
|
|
261
|
-
revokedHere:
|
|
305
|
+
revokedHere: true;
|
|
306
|
+
principalId: string;
|
|
307
|
+
} | {
|
|
308
|
+
sessionId: string;
|
|
309
|
+
reason: TRelyingPartySessionEndReason;
|
|
310
|
+
revokedHere: false;
|
|
262
311
|
}): void;
|
|
263
312
|
/**
|
|
264
313
|
* Structured diagnostics; the default writes one JSON line to
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idp.global/sdk",
|
|
3
|
-
"version": "19.
|
|
3
|
+
"version": "19.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Reusable browser and server SDK for idp.global authentication.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./dist_ts/index.js",
|
|
9
9
|
"./browser": "./dist_ts_browser/index.js",
|
|
10
|
+
"./browser/bearer": "./dist_ts_browser/classes.relyingpartybearerclient.js",
|
|
10
11
|
"./server": "./dist_ts_server/index.js",
|
|
11
12
|
"./relyingparty": "./dist_ts_relyingparty/index.js",
|
|
12
13
|
"./relyingparty/testing": "./dist_ts_relyingparty/testing.js"
|