@idp.global/sdk 19.2.1 → 19.3.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 +18 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_relyingparty/classes.errors.d.ts +9 -1
- package/dist_ts_relyingparty/classes.errors.js +5 -1
- package/dist_ts_relyingparty/classes.relyingpartyroutes.d.ts +62 -2
- package/dist_ts_relyingparty/classes.relyingpartyroutes.js +260 -12
- package/dist_ts_relyingparty/classes.relyingpartysessions.d.ts +108 -1
- package/dist_ts_relyingparty/classes.relyingpartysessions.js +508 -60
- package/dist_ts_relyingparty/classes.rpmodels.d.ts +65 -4
- package/dist_ts_relyingparty/classes.rpmodels.js +217 -5
- 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 +111 -1
- package/dist_ts_relyingparty/testing.d.ts +22 -0
- package/dist_ts_relyingparty/testing.js +42 -1
- package/package.json +8 -11
- package/readme.md +153 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_relyingparty/classes.errors.ts +13 -1
- package/ts_relyingparty/classes.relyingpartyroutes.ts +307 -14
- package/ts_relyingparty/classes.relyingpartysessions.ts +610 -61
- package/ts_relyingparty/classes.rpmodels.ts +124 -5
- package/ts_relyingparty/helpers.bearer.ts +260 -0
- package/ts_relyingparty/index.ts +1 -0
- package/ts_relyingparty/interfaces.ts +120 -1
- package/ts_relyingparty/testing.ts +60 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import type { TRelyingPartyBearerClientKind } from './interfaces.js';
|
|
2
3
|
/**
|
|
3
4
|
* One browser session of a relying party. The persisted field names, their
|
|
4
5
|
* types and the index declarations are the ones nevermind.finance has stored
|
|
@@ -33,7 +34,8 @@ export declare class RelyingPartySessionDoc extends plugins.nosqldb.SmartDataDbD
|
|
|
33
34
|
* against, the binding to the browser that started it, the sealed PKCE
|
|
34
35
|
* verifier and the return path. Consumed exactly once by a conditional update.
|
|
35
36
|
* Field names and indexes are the ones nevermind.finance stores under
|
|
36
|
-
* `LoginAttemptDoc
|
|
37
|
+
* `LoginAttemptDoc`; the `bearer…` fields exist only on the attempt of a
|
|
38
|
+
* bearer login, whose binding token is never issued.
|
|
37
39
|
*/
|
|
38
40
|
export declare class RelyingPartyLoginAttemptDoc extends plugins.nosqldb.SmartDataDbDoc<RelyingPartyLoginAttemptDoc, RelyingPartyLoginAttemptDoc> {
|
|
39
41
|
id: string;
|
|
@@ -53,10 +55,57 @@ export declare class RelyingPartyLoginAttemptDoc extends plugins.nosqldb.SmartDa
|
|
|
53
55
|
consumedAt?: number | null;
|
|
54
56
|
/** the session the callback created; finalize releases the return path against it */
|
|
55
57
|
createdSessionId?: string | null;
|
|
58
|
+
/** how the bearer client of this login receives its outcome; absent on a cookie login */
|
|
59
|
+
bearerClientKind?: TRelyingPartyBearerClientKind;
|
|
60
|
+
/** the return target the bearer client named, exactly */
|
|
61
|
+
bearerReturnTarget?: string;
|
|
62
|
+
/** the bearer client's S256 code challenge; its hand-off is claimed with the matching verifier */
|
|
63
|
+
bearerCodeChallenge?: string;
|
|
64
|
+
/** the bearer client's own `state`, handed back with the outcome */
|
|
65
|
+
bearerClientState?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The single-use code a bearer login hands its client. Only the hash of the
|
|
69
|
+
* code is stored; the code is bound to the client's S256 challenge, lives at
|
|
70
|
+
* most a minute and is consumed by one conditional update.
|
|
71
|
+
*/
|
|
72
|
+
export declare class RelyingPartyBearerHandoffDoc extends plugins.nosqldb.SmartDataDbDoc<RelyingPartyBearerHandoffDoc, RelyingPartyBearerHandoffDoc> {
|
|
73
|
+
id: string;
|
|
74
|
+
/** sha256 of the code */
|
|
75
|
+
codeHash: string;
|
|
76
|
+
/** the session the login opened; the code is its only way out */
|
|
77
|
+
sessionId: string;
|
|
78
|
+
codeChallenge: string;
|
|
79
|
+
createdAt: number;
|
|
80
|
+
/** at most a minute after the callback; the sweep ends the session of a code nobody claimed by then */
|
|
81
|
+
expiresAt: number;
|
|
82
|
+
/** `null` until a claim consumes the code */
|
|
83
|
+
consumedAt: number | null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* One generation of a bearer session's tokens: an access token and the
|
|
87
|
+
* refresh token that replaces both. Only hashes are stored. Exactly one
|
|
88
|
+
* generation of a session is current (`rotatedAt` `null`); a rotated one is
|
|
89
|
+
* kept until the session expires, so its refresh token coming back is
|
|
90
|
+
* recognized as reuse.
|
|
91
|
+
*/
|
|
92
|
+
export declare class RelyingPartyBearerTokenDoc extends plugins.nosqldb.SmartDataDbDoc<RelyingPartyBearerTokenDoc, RelyingPartyBearerTokenDoc> {
|
|
93
|
+
id: string;
|
|
94
|
+
accessTokenHash: string;
|
|
95
|
+
refreshTokenHash: string;
|
|
96
|
+
sessionId: string;
|
|
97
|
+
createdAt: number;
|
|
98
|
+
accessTokenExpiresAt: number;
|
|
99
|
+
/** the session's end; the refresh token never outlives it, and the sweep removes the generation after it */
|
|
100
|
+
expiresAt: number;
|
|
101
|
+
/** `null` while this generation is current; when its refresh token was spent otherwise */
|
|
102
|
+
rotatedAt: number | null;
|
|
56
103
|
}
|
|
57
104
|
export declare const RELYING_PARTY_DEFAULT_COLLECTION_NAMES: {
|
|
58
105
|
readonly sessions: 'IdpRelyingPartySession';
|
|
59
106
|
readonly loginAttempts: 'IdpRelyingPartyLoginAttempt';
|
|
107
|
+
readonly bearerHandoffs: 'IdpRelyingPartyBearerHandoff';
|
|
108
|
+
readonly bearerTokens: 'IdpRelyingPartyBearerToken';
|
|
60
109
|
};
|
|
61
110
|
export interface IRelyingPartyModelsOptions {
|
|
62
111
|
/**
|
|
@@ -73,17 +122,29 @@ export interface IRelyingPartyModelsOptions {
|
|
|
73
122
|
collectionNames?: {
|
|
74
123
|
sessions?: string;
|
|
75
124
|
loginAttempts?: string;
|
|
125
|
+
bearerHandoffs?: string;
|
|
126
|
+
bearerTokens?: string;
|
|
76
127
|
};
|
|
77
128
|
}
|
|
78
|
-
|
|
129
|
+
/** The models bearer hand-off mode stores its codes and tokens in. */
|
|
130
|
+
export interface IRelyingPartyBearerModels {
|
|
131
|
+
readonly BearerHandoff: typeof RelyingPartyBearerHandoffDoc;
|
|
132
|
+
readonly BearerToken: typeof RelyingPartyBearerTokenDoc;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The models of the session layer. The bearer models are needed only when
|
|
136
|
+
* `RelyingPartySessions` runs with `bearer`; `createRelyingPartyModels`
|
|
137
|
+
* always binds them.
|
|
138
|
+
*/
|
|
139
|
+
export interface IRelyingPartyModels extends Partial<IRelyingPartyBearerModels> {
|
|
79
140
|
readonly Session: typeof RelyingPartySessionDoc;
|
|
80
141
|
readonly LoginAttempt: typeof RelyingPartyLoginAttemptDoc;
|
|
81
142
|
}
|
|
82
143
|
/**
|
|
83
|
-
* Binds the
|
|
144
|
+
* Binds the relying-party models to one database. Each call declares its
|
|
84
145
|
* own model classes, so several databases — and several applications in one
|
|
85
146
|
* process — never share a binding. A deferred `db` is resolved on every use,
|
|
86
147
|
* the way `@Collection(() => db)` resolves it; a use before it answers a
|
|
87
148
|
* `SmartdataDb` throws `RelyingPartyDatabaseUnavailableError`.
|
|
88
149
|
*/
|
|
89
|
-
export declare const createRelyingPartyModels: (optionsArg: IRelyingPartyModelsOptions) => IRelyingPartyModels;
|
|
150
|
+
export declare const createRelyingPartyModels: (optionsArg: IRelyingPartyModelsOptions) => IRelyingPartyModels & IRelyingPartyBearerModels;
|
|
@@ -145,7 +145,8 @@ export { RelyingPartySessionDoc };
|
|
|
145
145
|
* against, the binding to the browser that started it, the sealed PKCE
|
|
146
146
|
* verifier and the return path. Consumed exactly once by a conditional update.
|
|
147
147
|
* Field names and indexes are the ones nevermind.finance stores under
|
|
148
|
-
* `LoginAttemptDoc
|
|
148
|
+
* `LoginAttemptDoc`; the `bearer…` fields exist only on the attempt of a
|
|
149
|
+
* bearer login, whose binding token is never issued.
|
|
149
150
|
*/
|
|
150
151
|
let RelyingPartyLoginAttemptDoc = (() => {
|
|
151
152
|
let _classSuper = plugins.nosqldb.SmartDataDbDoc;
|
|
@@ -182,6 +183,18 @@ let RelyingPartyLoginAttemptDoc = (() => {
|
|
|
182
183
|
let _createdSessionId_decorators;
|
|
183
184
|
let _createdSessionId_initializers = [];
|
|
184
185
|
let _createdSessionId_extraInitializers = [];
|
|
186
|
+
let _bearerClientKind_decorators;
|
|
187
|
+
let _bearerClientKind_initializers = [];
|
|
188
|
+
let _bearerClientKind_extraInitializers = [];
|
|
189
|
+
let _bearerReturnTarget_decorators;
|
|
190
|
+
let _bearerReturnTarget_initializers = [];
|
|
191
|
+
let _bearerReturnTarget_extraInitializers = [];
|
|
192
|
+
let _bearerCodeChallenge_decorators;
|
|
193
|
+
let _bearerCodeChallenge_initializers = [];
|
|
194
|
+
let _bearerCodeChallenge_extraInitializers = [];
|
|
195
|
+
let _bearerClientState_decorators;
|
|
196
|
+
let _bearerClientState_initializers = [];
|
|
197
|
+
let _bearerClientState_extraInitializers = [];
|
|
185
198
|
return class RelyingPartyLoginAttemptDoc extends _classSuper {
|
|
186
199
|
static {
|
|
187
200
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
@@ -196,6 +209,10 @@ let RelyingPartyLoginAttemptDoc = (() => {
|
|
|
196
209
|
_expiresAt_decorators = [plugins.nosqldb.svDb()];
|
|
197
210
|
_consumedAt_decorators = [plugins.nosqldb.svDb()];
|
|
198
211
|
_createdSessionId_decorators = [plugins.nosqldb.svDb()];
|
|
212
|
+
_bearerClientKind_decorators = [plugins.nosqldb.svDb()];
|
|
213
|
+
_bearerReturnTarget_decorators = [plugins.nosqldb.svDb()];
|
|
214
|
+
_bearerCodeChallenge_decorators = [plugins.nosqldb.svDb()];
|
|
215
|
+
_bearerClientState_decorators = [plugins.nosqldb.svDb()];
|
|
199
216
|
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
200
217
|
__esDecorate(null, null, _stateHash_decorators, { kind: "field", name: "stateHash", static: false, private: false, access: { has: obj => "stateHash" in obj, get: obj => obj.stateHash, set: (obj, value) => { obj.stateHash = value; } }, metadata: _metadata }, _stateHash_initializers, _stateHash_extraInitializers);
|
|
201
218
|
__esDecorate(null, null, _bindingTokenHash_decorators, { kind: "field", name: "bindingTokenHash", static: false, private: false, access: { has: obj => "bindingTokenHash" in obj, get: obj => obj.bindingTokenHash, set: (obj, value) => { obj.bindingTokenHash = value; } }, metadata: _metadata }, _bindingTokenHash_initializers, _bindingTokenHash_extraInitializers);
|
|
@@ -207,6 +224,10 @@ let RelyingPartyLoginAttemptDoc = (() => {
|
|
|
207
224
|
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
208
225
|
__esDecorate(null, null, _consumedAt_decorators, { kind: "field", name: "consumedAt", static: false, private: false, access: { has: obj => "consumedAt" in obj, get: obj => obj.consumedAt, set: (obj, value) => { obj.consumedAt = value; } }, metadata: _metadata }, _consumedAt_initializers, _consumedAt_extraInitializers);
|
|
209
226
|
__esDecorate(null, null, _createdSessionId_decorators, { kind: "field", name: "createdSessionId", static: false, private: false, access: { has: obj => "createdSessionId" in obj, get: obj => obj.createdSessionId, set: (obj, value) => { obj.createdSessionId = value; } }, metadata: _metadata }, _createdSessionId_initializers, _createdSessionId_extraInitializers);
|
|
227
|
+
__esDecorate(null, null, _bearerClientKind_decorators, { kind: "field", name: "bearerClientKind", static: false, private: false, access: { has: obj => "bearerClientKind" in obj, get: obj => obj.bearerClientKind, set: (obj, value) => { obj.bearerClientKind = value; } }, metadata: _metadata }, _bearerClientKind_initializers, _bearerClientKind_extraInitializers);
|
|
228
|
+
__esDecorate(null, null, _bearerReturnTarget_decorators, { kind: "field", name: "bearerReturnTarget", static: false, private: false, access: { has: obj => "bearerReturnTarget" in obj, get: obj => obj.bearerReturnTarget, set: (obj, value) => { obj.bearerReturnTarget = value; } }, metadata: _metadata }, _bearerReturnTarget_initializers, _bearerReturnTarget_extraInitializers);
|
|
229
|
+
__esDecorate(null, null, _bearerCodeChallenge_decorators, { kind: "field", name: "bearerCodeChallenge", static: false, private: false, access: { has: obj => "bearerCodeChallenge" in obj, get: obj => obj.bearerCodeChallenge, set: (obj, value) => { obj.bearerCodeChallenge = value; } }, metadata: _metadata }, _bearerCodeChallenge_initializers, _bearerCodeChallenge_extraInitializers);
|
|
230
|
+
__esDecorate(null, null, _bearerClientState_decorators, { kind: "field", name: "bearerClientState", static: false, private: false, access: { has: obj => "bearerClientState" in obj, get: obj => obj.bearerClientState, set: (obj, value) => { obj.bearerClientState = value; } }, metadata: _metadata }, _bearerClientState_initializers, _bearerClientState_extraInitializers);
|
|
210
231
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
211
232
|
}
|
|
212
233
|
id = __runInitializers(this, _id_initializers, '');
|
|
@@ -226,19 +247,165 @@ let RelyingPartyLoginAttemptDoc = (() => {
|
|
|
226
247
|
consumedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _consumedAt_initializers, void 0));
|
|
227
248
|
/** the session the callback created; finalize releases the return path against it */
|
|
228
249
|
createdSessionId = (__runInitializers(this, _consumedAt_extraInitializers), __runInitializers(this, _createdSessionId_initializers, void 0));
|
|
250
|
+
/** how the bearer client of this login receives its outcome; absent on a cookie login */
|
|
251
|
+
bearerClientKind = (__runInitializers(this, _createdSessionId_extraInitializers), __runInitializers(this, _bearerClientKind_initializers, void 0));
|
|
252
|
+
/** the return target the bearer client named, exactly */
|
|
253
|
+
bearerReturnTarget = (__runInitializers(this, _bearerClientKind_extraInitializers), __runInitializers(this, _bearerReturnTarget_initializers, void 0));
|
|
254
|
+
/** the bearer client's S256 code challenge; its hand-off is claimed with the matching verifier */
|
|
255
|
+
bearerCodeChallenge = (__runInitializers(this, _bearerReturnTarget_extraInitializers), __runInitializers(this, _bearerCodeChallenge_initializers, void 0));
|
|
256
|
+
/** the bearer client's own `state`, handed back with the outcome */
|
|
257
|
+
bearerClientState = (__runInitializers(this, _bearerCodeChallenge_extraInitializers), __runInitializers(this, _bearerClientState_initializers, void 0));
|
|
229
258
|
constructor() {
|
|
230
259
|
super(...arguments);
|
|
231
|
-
__runInitializers(this,
|
|
260
|
+
__runInitializers(this, _bearerClientState_extraInitializers);
|
|
232
261
|
}
|
|
233
262
|
};
|
|
234
263
|
})();
|
|
235
264
|
export { RelyingPartyLoginAttemptDoc };
|
|
265
|
+
/**
|
|
266
|
+
* The single-use code a bearer login hands its client. Only the hash of the
|
|
267
|
+
* code is stored; the code is bound to the client's S256 challenge, lives at
|
|
268
|
+
* most a minute and is consumed by one conditional update.
|
|
269
|
+
*/
|
|
270
|
+
let RelyingPartyBearerHandoffDoc = (() => {
|
|
271
|
+
let _classSuper = plugins.nosqldb.SmartDataDbDoc;
|
|
272
|
+
let _id_decorators;
|
|
273
|
+
let _id_initializers = [];
|
|
274
|
+
let _id_extraInitializers = [];
|
|
275
|
+
let _codeHash_decorators;
|
|
276
|
+
let _codeHash_initializers = [];
|
|
277
|
+
let _codeHash_extraInitializers = [];
|
|
278
|
+
let _sessionId_decorators;
|
|
279
|
+
let _sessionId_initializers = [];
|
|
280
|
+
let _sessionId_extraInitializers = [];
|
|
281
|
+
let _codeChallenge_decorators;
|
|
282
|
+
let _codeChallenge_initializers = [];
|
|
283
|
+
let _codeChallenge_extraInitializers = [];
|
|
284
|
+
let _createdAt_decorators;
|
|
285
|
+
let _createdAt_initializers = [];
|
|
286
|
+
let _createdAt_extraInitializers = [];
|
|
287
|
+
let _expiresAt_decorators;
|
|
288
|
+
let _expiresAt_initializers = [];
|
|
289
|
+
let _expiresAt_extraInitializers = [];
|
|
290
|
+
let _consumedAt_decorators;
|
|
291
|
+
let _consumedAt_initializers = [];
|
|
292
|
+
let _consumedAt_extraInitializers = [];
|
|
293
|
+
return class RelyingPartyBearerHandoffDoc extends _classSuper {
|
|
294
|
+
static {
|
|
295
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
296
|
+
_id_decorators = [plugins.nosqldb.unI()];
|
|
297
|
+
_codeHash_decorators = [plugins.nosqldb.unI()];
|
|
298
|
+
_sessionId_decorators = [plugins.nosqldb.svDb()];
|
|
299
|
+
_codeChallenge_decorators = [plugins.nosqldb.svDb()];
|
|
300
|
+
_createdAt_decorators = [plugins.nosqldb.svDb()];
|
|
301
|
+
_expiresAt_decorators = [plugins.nosqldb.svDb(), plugins.nosqldb.index()];
|
|
302
|
+
_consumedAt_decorators = [plugins.nosqldb.svDb()];
|
|
303
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
304
|
+
__esDecorate(null, null, _codeHash_decorators, { kind: "field", name: "codeHash", static: false, private: false, access: { has: obj => "codeHash" in obj, get: obj => obj.codeHash, set: (obj, value) => { obj.codeHash = value; } }, metadata: _metadata }, _codeHash_initializers, _codeHash_extraInitializers);
|
|
305
|
+
__esDecorate(null, null, _sessionId_decorators, { kind: "field", name: "sessionId", static: false, private: false, access: { has: obj => "sessionId" in obj, get: obj => obj.sessionId, set: (obj, value) => { obj.sessionId = value; } }, metadata: _metadata }, _sessionId_initializers, _sessionId_extraInitializers);
|
|
306
|
+
__esDecorate(null, null, _codeChallenge_decorators, { kind: "field", name: "codeChallenge", static: false, private: false, access: { has: obj => "codeChallenge" in obj, get: obj => obj.codeChallenge, set: (obj, value) => { obj.codeChallenge = value; } }, metadata: _metadata }, _codeChallenge_initializers, _codeChallenge_extraInitializers);
|
|
307
|
+
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
308
|
+
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
309
|
+
__esDecorate(null, null, _consumedAt_decorators, { kind: "field", name: "consumedAt", static: false, private: false, access: { has: obj => "consumedAt" in obj, get: obj => obj.consumedAt, set: (obj, value) => { obj.consumedAt = value; } }, metadata: _metadata }, _consumedAt_initializers, _consumedAt_extraInitializers);
|
|
310
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
311
|
+
}
|
|
312
|
+
id = __runInitializers(this, _id_initializers, '');
|
|
313
|
+
/** sha256 of the code */
|
|
314
|
+
codeHash = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _codeHash_initializers, ''));
|
|
315
|
+
/** the session the login opened; the code is its only way out */
|
|
316
|
+
sessionId = (__runInitializers(this, _codeHash_extraInitializers), __runInitializers(this, _sessionId_initializers, ''));
|
|
317
|
+
codeChallenge = (__runInitializers(this, _sessionId_extraInitializers), __runInitializers(this, _codeChallenge_initializers, ''));
|
|
318
|
+
createdAt = (__runInitializers(this, _codeChallenge_extraInitializers), __runInitializers(this, _createdAt_initializers, 0));
|
|
319
|
+
/** at most a minute after the callback; the sweep ends the session of a code nobody claimed by then */
|
|
320
|
+
expiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, 0));
|
|
321
|
+
/** `null` until a claim consumes the code */
|
|
322
|
+
consumedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _consumedAt_initializers, null));
|
|
323
|
+
constructor() {
|
|
324
|
+
super(...arguments);
|
|
325
|
+
__runInitializers(this, _consumedAt_extraInitializers);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
})();
|
|
329
|
+
export { RelyingPartyBearerHandoffDoc };
|
|
330
|
+
/**
|
|
331
|
+
* One generation of a bearer session's tokens: an access token and the
|
|
332
|
+
* refresh token that replaces both. Only hashes are stored. Exactly one
|
|
333
|
+
* generation of a session is current (`rotatedAt` `null`); a rotated one is
|
|
334
|
+
* kept until the session expires, so its refresh token coming back is
|
|
335
|
+
* recognized as reuse.
|
|
336
|
+
*/
|
|
337
|
+
let RelyingPartyBearerTokenDoc = (() => {
|
|
338
|
+
let _classSuper = plugins.nosqldb.SmartDataDbDoc;
|
|
339
|
+
let _id_decorators;
|
|
340
|
+
let _id_initializers = [];
|
|
341
|
+
let _id_extraInitializers = [];
|
|
342
|
+
let _accessTokenHash_decorators;
|
|
343
|
+
let _accessTokenHash_initializers = [];
|
|
344
|
+
let _accessTokenHash_extraInitializers = [];
|
|
345
|
+
let _refreshTokenHash_decorators;
|
|
346
|
+
let _refreshTokenHash_initializers = [];
|
|
347
|
+
let _refreshTokenHash_extraInitializers = [];
|
|
348
|
+
let _sessionId_decorators;
|
|
349
|
+
let _sessionId_initializers = [];
|
|
350
|
+
let _sessionId_extraInitializers = [];
|
|
351
|
+
let _createdAt_decorators;
|
|
352
|
+
let _createdAt_initializers = [];
|
|
353
|
+
let _createdAt_extraInitializers = [];
|
|
354
|
+
let _accessTokenExpiresAt_decorators;
|
|
355
|
+
let _accessTokenExpiresAt_initializers = [];
|
|
356
|
+
let _accessTokenExpiresAt_extraInitializers = [];
|
|
357
|
+
let _expiresAt_decorators;
|
|
358
|
+
let _expiresAt_initializers = [];
|
|
359
|
+
let _expiresAt_extraInitializers = [];
|
|
360
|
+
let _rotatedAt_decorators;
|
|
361
|
+
let _rotatedAt_initializers = [];
|
|
362
|
+
let _rotatedAt_extraInitializers = [];
|
|
363
|
+
return class RelyingPartyBearerTokenDoc extends _classSuper {
|
|
364
|
+
static {
|
|
365
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
366
|
+
_id_decorators = [plugins.nosqldb.unI()];
|
|
367
|
+
_accessTokenHash_decorators = [plugins.nosqldb.unI()];
|
|
368
|
+
_refreshTokenHash_decorators = [plugins.nosqldb.unI()];
|
|
369
|
+
_sessionId_decorators = [plugins.nosqldb.svDb()];
|
|
370
|
+
_createdAt_decorators = [plugins.nosqldb.svDb()];
|
|
371
|
+
_accessTokenExpiresAt_decorators = [plugins.nosqldb.svDb()];
|
|
372
|
+
_expiresAt_decorators = [plugins.nosqldb.svDb(), plugins.nosqldb.index()];
|
|
373
|
+
_rotatedAt_decorators = [plugins.nosqldb.svDb()];
|
|
374
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
375
|
+
__esDecorate(null, null, _accessTokenHash_decorators, { kind: "field", name: "accessTokenHash", static: false, private: false, access: { has: obj => "accessTokenHash" in obj, get: obj => obj.accessTokenHash, set: (obj, value) => { obj.accessTokenHash = value; } }, metadata: _metadata }, _accessTokenHash_initializers, _accessTokenHash_extraInitializers);
|
|
376
|
+
__esDecorate(null, null, _refreshTokenHash_decorators, { kind: "field", name: "refreshTokenHash", static: false, private: false, access: { has: obj => "refreshTokenHash" in obj, get: obj => obj.refreshTokenHash, set: (obj, value) => { obj.refreshTokenHash = value; } }, metadata: _metadata }, _refreshTokenHash_initializers, _refreshTokenHash_extraInitializers);
|
|
377
|
+
__esDecorate(null, null, _sessionId_decorators, { kind: "field", name: "sessionId", static: false, private: false, access: { has: obj => "sessionId" in obj, get: obj => obj.sessionId, set: (obj, value) => { obj.sessionId = value; } }, metadata: _metadata }, _sessionId_initializers, _sessionId_extraInitializers);
|
|
378
|
+
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
379
|
+
__esDecorate(null, null, _accessTokenExpiresAt_decorators, { kind: "field", name: "accessTokenExpiresAt", static: false, private: false, access: { has: obj => "accessTokenExpiresAt" in obj, get: obj => obj.accessTokenExpiresAt, set: (obj, value) => { obj.accessTokenExpiresAt = value; } }, metadata: _metadata }, _accessTokenExpiresAt_initializers, _accessTokenExpiresAt_extraInitializers);
|
|
380
|
+
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
381
|
+
__esDecorate(null, null, _rotatedAt_decorators, { kind: "field", name: "rotatedAt", static: false, private: false, access: { has: obj => "rotatedAt" in obj, get: obj => obj.rotatedAt, set: (obj, value) => { obj.rotatedAt = value; } }, metadata: _metadata }, _rotatedAt_initializers, _rotatedAt_extraInitializers);
|
|
382
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
383
|
+
}
|
|
384
|
+
id = __runInitializers(this, _id_initializers, '');
|
|
385
|
+
accessTokenHash = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _accessTokenHash_initializers, ''));
|
|
386
|
+
refreshTokenHash = (__runInitializers(this, _accessTokenHash_extraInitializers), __runInitializers(this, _refreshTokenHash_initializers, ''));
|
|
387
|
+
sessionId = (__runInitializers(this, _refreshTokenHash_extraInitializers), __runInitializers(this, _sessionId_initializers, ''));
|
|
388
|
+
createdAt = (__runInitializers(this, _sessionId_extraInitializers), __runInitializers(this, _createdAt_initializers, 0));
|
|
389
|
+
accessTokenExpiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _accessTokenExpiresAt_initializers, 0));
|
|
390
|
+
/** the session's end; the refresh token never outlives it, and the sweep removes the generation after it */
|
|
391
|
+
expiresAt = (__runInitializers(this, _accessTokenExpiresAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, 0));
|
|
392
|
+
/** `null` while this generation is current; when its refresh token was spent otherwise */
|
|
393
|
+
rotatedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _rotatedAt_initializers, null));
|
|
394
|
+
constructor() {
|
|
395
|
+
super(...arguments);
|
|
396
|
+
__runInitializers(this, _rotatedAt_extraInitializers);
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
})();
|
|
400
|
+
export { RelyingPartyBearerTokenDoc };
|
|
236
401
|
export const RELYING_PARTY_DEFAULT_COLLECTION_NAMES = {
|
|
237
402
|
sessions: 'IdpRelyingPartySession',
|
|
238
403
|
loginAttempts: 'IdpRelyingPartyLoginAttempt',
|
|
404
|
+
bearerHandoffs: 'IdpRelyingPartyBearerHandoff',
|
|
405
|
+
bearerTokens: 'IdpRelyingPartyBearerToken',
|
|
239
406
|
};
|
|
240
407
|
/**
|
|
241
|
-
* Binds the
|
|
408
|
+
* Binds the relying-party models to one database. Each call declares its
|
|
242
409
|
* own model classes, so several databases — and several applications in one
|
|
243
410
|
* process — never share a binding. A deferred `db` is resolved on every use,
|
|
244
411
|
* the way `@Collection(() => db)` resolves it; a use before it answers a
|
|
@@ -268,6 +435,10 @@ export const createRelyingPartyModels = (optionsArg) => {
|
|
|
268
435
|
const sessions = optionsArg.collectionNames?.sessions ?? RELYING_PARTY_DEFAULT_COLLECTION_NAMES.sessions;
|
|
269
436
|
const loginAttempts = optionsArg.collectionNames?.loginAttempts
|
|
270
437
|
?? RELYING_PARTY_DEFAULT_COLLECTION_NAMES.loginAttempts;
|
|
438
|
+
const bearerHandoffs = optionsArg.collectionNames?.bearerHandoffs
|
|
439
|
+
?? RELYING_PARTY_DEFAULT_COLLECTION_NAMES.bearerHandoffs;
|
|
440
|
+
const bearerTokens = optionsArg.collectionNames?.bearerTokens
|
|
441
|
+
?? RELYING_PARTY_DEFAULT_COLLECTION_NAMES.bearerTokens;
|
|
271
442
|
let BoundSessionDoc = (() => {
|
|
272
443
|
let _classDecorators = [plugins.nosqldb.Collection(resolveDb, { collectionName: sessions })];
|
|
273
444
|
let _classDescriptor;
|
|
@@ -304,6 +475,47 @@ export const createRelyingPartyModels = (optionsArg) => {
|
|
|
304
475
|
};
|
|
305
476
|
return BoundLoginAttemptDoc = _classThis;
|
|
306
477
|
})();
|
|
307
|
-
|
|
478
|
+
let BoundBearerHandoffDoc = (() => {
|
|
479
|
+
let _classDecorators = [plugins.nosqldb.Collection(resolveDb, { collectionName: bearerHandoffs })];
|
|
480
|
+
let _classDescriptor;
|
|
481
|
+
let _classExtraInitializers = [];
|
|
482
|
+
let _classThis;
|
|
483
|
+
let _classSuper = RelyingPartyBearerHandoffDoc;
|
|
484
|
+
var BoundBearerHandoffDoc = class extends _classSuper {
|
|
485
|
+
static { _classThis = this; }
|
|
486
|
+
static {
|
|
487
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
488
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
489
|
+
BoundBearerHandoffDoc = _classThis = _classDescriptor.value;
|
|
490
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
491
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
return BoundBearerHandoffDoc = _classThis;
|
|
495
|
+
})();
|
|
496
|
+
let BoundBearerTokenDoc = (() => {
|
|
497
|
+
let _classDecorators = [plugins.nosqldb.Collection(resolveDb, { collectionName: bearerTokens })];
|
|
498
|
+
let _classDescriptor;
|
|
499
|
+
let _classExtraInitializers = [];
|
|
500
|
+
let _classThis;
|
|
501
|
+
let _classSuper = RelyingPartyBearerTokenDoc;
|
|
502
|
+
var BoundBearerTokenDoc = class extends _classSuper {
|
|
503
|
+
static { _classThis = this; }
|
|
504
|
+
static {
|
|
505
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
506
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
507
|
+
BoundBearerTokenDoc = _classThis = _classDescriptor.value;
|
|
508
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
509
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
return BoundBearerTokenDoc = _classThis;
|
|
513
|
+
})();
|
|
514
|
+
return {
|
|
515
|
+
Session: BoundSessionDoc,
|
|
516
|
+
LoginAttempt: BoundLoginAttemptDoc,
|
|
517
|
+
BearerHandoff: BoundBearerHandoffDoc,
|
|
518
|
+
BearerToken: BoundBearerTokenDoc,
|
|
519
|
+
};
|
|
308
520
|
};
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
521
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ycG1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3JlbHlpbmdwYXJ0eS9jbGFzc2VzLnJwbW9kZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUczRTs7Ozs7R0FLRztJQUNVLHNCQUFzQjtzQkFBUyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBQTdELHNCQUF1QixTQUFRLFdBQThFOzs7OEJBQ3ZILE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO3FDQUlyQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtrQ0FJckIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFDdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7cUNBR3ZCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO3NDQUd0QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtxQ0FHdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7cUNBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO3NDQUl0QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTswQ0FJdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7NkNBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFOzhDQUd0QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnREFJdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7NENBSXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBNUN2Qix3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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { IRelyingPartyBearerDelivery, IRelyingPartyBearerMessage, IRelyingPartyBearerReturnTargets, TRelyingPartyBearerClientKind } from './interfaces.js';
|
|
2
|
+
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
|
+
export declare const isBearerClientKind: (valueArg: unknown) => valueArg is TRelyingPartyBearerClientKind;
|
|
6
|
+
export declare const isPkceChallenge: (valueArg: unknown) => valueArg is string;
|
|
7
|
+
export declare const isPkceVerifier: (valueArg: unknown) => valueArg is string;
|
|
8
|
+
export declare const isBearerClientState: (valueArg: unknown) => valueArg is string;
|
|
9
|
+
/** The S256 challenge of a verifier: BASE64URL(SHA-256(ASCII(verifier))). */
|
|
10
|
+
export declare const pkceChallengeOf: (verifierArg: string) => string;
|
|
11
|
+
/** Whether a verifier answers a challenge under S256, compared in constant time. */
|
|
12
|
+
export declare const verifyPkceChallenge: (verifierArg: unknown, challengeArg: string) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The return targets of a deployment, checked once: every entry has to be
|
|
15
|
+
* the exact canonical form a client can name, or the configuration is
|
|
16
|
+
* refused. A target with a query or a fragment is refused too, because the
|
|
17
|
+
* delivery adds its own query, and so is one with a `*`: nothing is a wildcard.
|
|
18
|
+
*/
|
|
19
|
+
export declare const normalizeBearerReturnTargets: (targetsArg: IRelyingPartyBearerReturnTargets, publicOriginArg: string, loginPathPrefixArg: string) => Readonly<Required<IRelyingPartyBearerReturnTargets>>;
|
|
20
|
+
/**
|
|
21
|
+
* Whether a client may name this return target: an entry of its kind,
|
|
22
|
+
* exactly. A loopback target names its own port, which is the only part
|
|
23
|
+
* that is not compared; it has to be given in canonical form.
|
|
24
|
+
*/
|
|
25
|
+
export declare const isBearerReturnTargetAllowed: (targetsArg: Readonly<Required<IRelyingPartyBearerReturnTargets>>, kindArg: TRelyingPartyBearerClientKind, candidateArg: unknown) => boolean;
|
|
26
|
+
/** The token of an `Authorization: Bearer <token>` header, or `null`. */
|
|
27
|
+
export declare const parseBearerAuthorization: (headerArg: string | null | undefined) => string | null;
|
|
28
|
+
/** What a delivery hands the client: the code, or why there is none. */
|
|
29
|
+
export type TRelyingPartyBearerOutcome = {
|
|
30
|
+
code: string;
|
|
31
|
+
} | {
|
|
32
|
+
error: string;
|
|
33
|
+
};
|
|
34
|
+
/** The location a redirect delivery sends the client to, with the outcome and its `state` in the query. */
|
|
35
|
+
export declare const bearerDeliveryLocation: (deliveryArg: IRelyingPartyBearerDelivery, outcomeArg: TRelyingPartyBearerOutcome, publicOriginArg: string) => string;
|
|
36
|
+
/** The message a popup delivery posts. */
|
|
37
|
+
export declare const bearerDeliveryMessage: (deliveryArg: IRelyingPartyBearerDelivery, outcomeArg: TRelyingPartyBearerOutcome) => IRelyingPartyBearerMessage;
|
|
38
|
+
/** The id of the element a popup page keeps its delivery in. */
|
|
39
|
+
export declare const RELYING_PARTY_BEARER_POPUP_DATA_ID = "idp-rp-bearer-delivery";
|
|
40
|
+
/**
|
|
41
|
+
* The page of a popup delivery. Its one script, allowed by nonce alone,
|
|
42
|
+
* posts the message to `window.opener` with the registered origin as the
|
|
43
|
+
* target origin — never `*` — so a browser hands it to nobody else, and
|
|
44
|
+
* closes the window. The delivery is data in a JSON block, never script.
|
|
45
|
+
*/
|
|
46
|
+
export declare const bearerPopupPage: (deliveryArg: IRelyingPartyBearerDelivery, outcomeArg: TRelyingPartyBearerOutcome, nonceArg: string) => string;
|
|
47
|
+
/** The policy of a popup page: its nonce script and nothing else. */
|
|
48
|
+
export declare const bearerPopupContentSecurityPolicy: (nonceArg: string) => string;
|