@idp.global/sdk 14.4.1 → 15.0.1
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_server/classes.idp-global-server-client.d.ts +2 -2
- package/dist_ts_server/classes.idp-global-server-client.js +29 -13
- package/package.json +6 -5
- package/readme.md +14 -5
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_server/classes.idp-global-server-client.ts +107 -53
package/changelog.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-08-02 - 15.0.1
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
|
|
7
|
+
- default server client to app.idp.global TypedSocket endpoint (idp-global-server-client)
|
|
8
|
+
- Updated the default hosted base URL from https://idp.global to https://app.idp.global for server client requests.
|
|
9
|
+
- Adjusted tests and documentation to reflect the new default hosted endpoint.
|
|
10
|
+
|
|
11
|
+
## 2026-08-02 - 15.0.0
|
|
12
|
+
|
|
13
|
+
### Breaking Changes
|
|
14
|
+
|
|
15
|
+
- adopt explicit backend connection registration (server-client)
|
|
16
|
+
- Replace client-owned backend-service tag assignment with registerBackendServiceConnection requests.
|
|
17
|
+
- Authenticate backend physical connections and reconnects through TypedSocket restoration before they become available.
|
|
18
|
+
- Persist successful explicit backend token registration as reconnect restoration state.
|
|
19
|
+
- Upgrade TypedRequest, TypedSocket, idp.global interfaces, and add SmartServe for the updated RPC contract.
|
|
20
|
+
|
|
3
21
|
## 2026-07-27 - 14.4.1
|
|
4
22
|
|
|
5
23
|
### Fixes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@idp.global/sdk',
|
|
6
|
-
version: '
|
|
6
|
+
version: '15.0.1',
|
|
7
7
|
description: 'Reusable browser and server SDK for idp.global authentication.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdFQUFnRTtDQUM5RSxDQUFBIn0=
|
|
@@ -3,7 +3,7 @@ export interface IIdpGlobalServerClientOptions {
|
|
|
3
3
|
baseUrl?: string;
|
|
4
4
|
backendToken?: string;
|
|
5
5
|
}
|
|
6
|
-
export declare const defaultIdpGlobalBaseUrl = "https://idp.global";
|
|
6
|
+
export declare const defaultIdpGlobalBaseUrl = "https://app.idp.global";
|
|
7
7
|
export interface IIdpPasswordAuthResult {
|
|
8
8
|
user: plugins.idpInterfaces.dto.ICurrentUserDto;
|
|
9
9
|
jwt: string;
|
|
@@ -29,6 +29,7 @@ export declare class IdpGlobalServerClient {
|
|
|
29
29
|
private connectionAbortController?;
|
|
30
30
|
private stopWaiters;
|
|
31
31
|
private stopping;
|
|
32
|
+
private backendToken?;
|
|
32
33
|
constructor(optionsArg?: IIdpGlobalServerClientOptions);
|
|
33
34
|
connect(): Promise<plugins.typedsocket.TypedSocket>;
|
|
34
35
|
stop(): Promise<void>;
|
|
@@ -43,7 +44,6 @@ export declare class IdpGlobalServerClient {
|
|
|
43
44
|
}): Promise<IIdpPasswordAuthResult>;
|
|
44
45
|
private getTypedRequestUrl;
|
|
45
46
|
private requireBackendToken;
|
|
46
|
-
private applyBackendServiceTag;
|
|
47
47
|
private createConnectionDeferred;
|
|
48
48
|
private raceWithStop;
|
|
49
49
|
private rejectStopWaiters;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
export const defaultIdpGlobalBaseUrl = 'https://idp.global';
|
|
2
|
+
export const defaultIdpGlobalBaseUrl = 'https://app.idp.global';
|
|
3
3
|
export class IdpMfaRequiredError extends Error {
|
|
4
4
|
mfaChallengeToken;
|
|
5
5
|
availableMfaMethods;
|
|
@@ -22,8 +22,10 @@ export class IdpGlobalServerClient {
|
|
|
22
22
|
connectionAbortController;
|
|
23
23
|
stopWaiters = new Set();
|
|
24
24
|
stopping = false;
|
|
25
|
+
backendToken;
|
|
25
26
|
constructor(optionsArg = {}) {
|
|
26
27
|
this.optionsArg = optionsArg;
|
|
28
|
+
this.backendToken = optionsArg.backendToken;
|
|
27
29
|
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushPublicKeysForValidation', async (requestArg) => {
|
|
28
30
|
await Promise.all(this.publicKeysPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeys)));
|
|
29
31
|
return {};
|
|
@@ -50,7 +52,20 @@ export class IdpGlobalServerClient {
|
|
|
50
52
|
const connectionAbortController = new AbortController();
|
|
51
53
|
try {
|
|
52
54
|
this.connectionAbortController = connectionAbortController;
|
|
53
|
-
socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), {
|
|
55
|
+
socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), {
|
|
56
|
+
autoReconnect: true,
|
|
57
|
+
abortSignal: connectionAbortController.signal,
|
|
58
|
+
restoreConnection: async ({ createTypedRequest }) => {
|
|
59
|
+
const backendToken = this.backendToken;
|
|
60
|
+
if (!backendToken) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const response = await createTypedRequest('registerBackendServiceConnection').fire({ backendToken });
|
|
64
|
+
if (response.registered !== true) {
|
|
65
|
+
throw new Error('IdP rejected backend-service connection registration.');
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
54
69
|
this.pendingSocketPromise = socketPromise;
|
|
55
70
|
createdSocket = await this.raceWithStop(socketPromise);
|
|
56
71
|
if (generation !== this.connectionGeneration) {
|
|
@@ -64,7 +79,8 @@ export class IdpGlobalServerClient {
|
|
|
64
79
|
deferred.resolve(createdSocket);
|
|
65
80
|
}
|
|
66
81
|
catch (error) {
|
|
67
|
-
if (generation === this.connectionGeneration &&
|
|
82
|
+
if (generation === this.connectionGeneration &&
|
|
83
|
+
(!createdSocket || this.typedsocket === createdSocket)) {
|
|
68
84
|
this.typedsocket = undefined;
|
|
69
85
|
}
|
|
70
86
|
await createdSocket?.stop().catch(() => undefined);
|
|
@@ -120,12 +136,17 @@ export class IdpGlobalServerClient {
|
|
|
120
136
|
this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
|
|
121
137
|
};
|
|
122
138
|
}
|
|
123
|
-
async registerBackendService(backendTokenArg = this.
|
|
139
|
+
async registerBackendService(backendTokenArg = this.backendToken) {
|
|
124
140
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
125
141
|
const socket = await this.connect();
|
|
126
|
-
|
|
142
|
+
const request = socket.createTypedRequest('registerBackendServiceConnection');
|
|
143
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
144
|
+
if (response.registered !== true) {
|
|
145
|
+
throw new Error('IdP rejected backend-service connection registration.');
|
|
146
|
+
}
|
|
147
|
+
this.backendToken = backendToken;
|
|
127
148
|
}
|
|
128
|
-
async getPublicKeysForValidation(backendTokenArg = this.
|
|
149
|
+
async getPublicKeysForValidation(backendTokenArg = this.backendToken) {
|
|
129
150
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
130
151
|
const socket = await this.connect();
|
|
131
152
|
const request = socket.createTypedRequest('getPublicKeysForValidation');
|
|
@@ -135,7 +156,7 @@ export class IdpGlobalServerClient {
|
|
|
135
156
|
}
|
|
136
157
|
return response.publicKeys;
|
|
137
158
|
}
|
|
138
|
-
async getJwtIdBlocklist(backendTokenArg = this.
|
|
159
|
+
async getJwtIdBlocklist(backendTokenArg = this.backendToken) {
|
|
139
160
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
140
161
|
const socket = await this.connect();
|
|
141
162
|
const request = socket.createTypedRequest('pushOrGetJwtIdBlocklist');
|
|
@@ -187,11 +208,6 @@ export class IdpGlobalServerClient {
|
|
|
187
208
|
}
|
|
188
209
|
return backendTokenArg;
|
|
189
210
|
}
|
|
190
|
-
async applyBackendServiceTag(socketArg, backendTokenArg) {
|
|
191
|
-
await this.raceWithStop(socketArg.setTag('backend-service', {
|
|
192
|
-
backendToken: backendTokenArg,
|
|
193
|
-
}));
|
|
194
|
-
}
|
|
195
211
|
createConnectionDeferred() {
|
|
196
212
|
const deferred = plugins.smartpromise.defer();
|
|
197
213
|
deferred.promise.catch(() => undefined);
|
|
@@ -217,4 +233,4 @@ export class IdpGlobalServerClient {
|
|
|
217
233
|
this.stopWaiters.clear();
|
|
218
234
|
}
|
|
219
235
|
}
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBY1o7SUFiWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQsc0JBQXNCLEdBRUQsRUFBRSxDQUFDO0lBQ3hCLHFCQUFxQixHQUFnRSxFQUFFLENBQUM7SUFDeEYsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLG9CQUFvQixDQUE0QztJQUNoRSx5QkFBeUIsQ0FBbUI7SUFDNUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBQ25ELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFekIsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdB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
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7QUFRaEUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFHWDtRQUNDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHFCQUFxQjtJQWlCWjtJQWhCWixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQsc0JBQXNCLEdBRUQsRUFBRSxDQUFDO0lBQ3hCLHFCQUFxQixHQUV6QixFQUFFLENBQUM7SUFDQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsb0JBQW9CLENBQTRDO0lBQ2hFLHlCQUF5QixDQUFtQjtJQUM1QyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFDbkQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLENBQVU7SUFFOUIsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQztRQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBRW5DLDZCQUE2QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUNwRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUNuRixDQUFDO1lBQ0YsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBRW5DLHlCQUF5QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUNoRCxJQUFJLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUM1QyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxDQUN0QyxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzdDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixJQUFJLGFBQTBELENBQUM7UUFDL0QsSUFBSSxhQUFtRSxDQUFDO1FBQ3hFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7WUFDM0QsYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDMUQsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pCO2dCQUNFLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixXQUFXLEVBQUUseUJBQXlCLENBQUMsTUFBTTtnQkFDN0MsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFO29CQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUN2QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2xCLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUV2QyxrQ0FBa0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7b0JBQzdELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO29CQUMzRSxDQUFDO2dCQUNILENBQUM7YUFDRixDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO1lBQzFDLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzdDLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDO2dCQUNELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7WUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQ0UsVUFBVSxLQUFLLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3hDLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxhQUFhLENBQUMsRUFDdEQsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsTUFBTSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7WUFDeEMsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNoQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN2RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNyQixNQUFNLGFBQWEsR0FBRyxNQUFNLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLGFBQWEsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDOUMsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRU0sZ0JBQWdCLENBQ3JCLFVBRXlCO1FBRXpCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDOUQsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQ3BDLENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZSxDQUNwQixVQUFnRTtRQUVoRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQzVELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUNwQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FDakMsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZO1FBRW5DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBRXZDLGtDQUFrQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVNLEtBQUssQ0FBQywwQkFBMEIsQ0FDckMsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZO1FBRW5DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBRXZDLDRCQUE0QixDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQzVCLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWTtRQUVuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUV2Qyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sUUFBUSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxVQUd0QztRQUNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFNUMscUNBQXFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDaEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQzFCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtTQUM5QixDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQztnQkFDNUIsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEQsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLG1CQUFtQjthQUN2RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFOUMsWUFBWSxDQUFDLENBQUM7UUFDaEIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUM3QyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUNsRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFNUMsT0FBTyxDQUFDLENBQUM7UUFDWCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQ2hELENBQUM7UUFDRixPQUFPO1lBQ0wsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQ3hCLEdBQUcsRUFBRSxlQUFlLENBQUMsR0FBRztZQUN4QixZQUFZLEVBQUUsZUFBZSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWTtTQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxHQUFHLEdBQUcsT0FBTyxlQUFlLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxlQUF3QjtRQUNsRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFtQyxDQUFDO1FBQy9FLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxZQUFZLENBQUksVUFBc0I7UUFDNUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBZSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFlO1FBQ3ZDLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idp.global/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.0.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Reusable browser and server SDK for idp.global authentication.",
|
|
6
6
|
"type": "module",
|
|
@@ -14,14 +14,15 @@
|
|
|
14
14
|
"author": "Task Venture Capital GmbH",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@api.global/typedrequest": "^
|
|
18
|
-
"@api.global/typedrequest-interfaces": "^
|
|
19
|
-
"@api.global/typedsocket": "^
|
|
20
|
-
"@idp.global/interfaces": "^
|
|
17
|
+
"@api.global/typedrequest": "^5.2.1",
|
|
18
|
+
"@api.global/typedrequest-interfaces": "^5.1.1",
|
|
19
|
+
"@api.global/typedsocket": "^6.0.0",
|
|
20
|
+
"@idp.global/interfaces": "^29.0.0",
|
|
21
21
|
"@push.rocks/smartdata": "^7.2.1",
|
|
22
22
|
"@push.rocks/smartjson": "^6.0.1",
|
|
23
23
|
"@push.rocks/smartpromise": "^4.2.4",
|
|
24
24
|
"@push.rocks/smartrx": "^3.0.12",
|
|
25
|
+
"@push.rocks/smartserve": "^4.3.0",
|
|
25
26
|
"@push.rocks/smarttime": "^4.2.3",
|
|
26
27
|
"@push.rocks/smarturl": "^3.1.0",
|
|
27
28
|
"@push.rocks/webjwt": "^1.0.10",
|
package/readme.md
CHANGED
|
@@ -251,9 +251,12 @@ if (!authResult) {
|
|
|
251
251
|
console.log(authResult.account.role, authResult.authSource);
|
|
252
252
|
```
|
|
253
253
|
|
|
254
|
-
In `auto` mode, the service tries local auth first when the account allows `local`; if that fails and the account allows `idp.global`, it uses the configured `IdpGlobalServerClient`. `IdpGlobalServerClient` defaults to the hosted `https://idp.global` endpoint; pass `{ baseUrl }` only for self-hosted or staging IdP instances. Pass `{ backendToken }` when a backend service should fetch JWT validation data or subscribe to key/blocklist pushes. idp.global authentication is accepted only when the returned user email matches the local account email and the returned user ID matches the stored `idpSubject` when one is already set.
|
|
254
|
+
In `auto` mode, the service tries local auth first when the account allows `local`; if that fails and the account allows `idp.global`, it uses the configured `IdpGlobalServerClient`. `IdpGlobalServerClient` defaults to the hosted `https://app.idp.global` TypedSocket endpoint; pass `{ baseUrl }` only for self-hosted or staging IdP instances. Pass `{ backendToken }` when a backend service should fetch JWT validation data or subscribe to key/blocklist pushes. idp.global authentication is accepted only when the returned user email matches the local account email and the returned user ID matches the stored `idpSubject` when one is already set.
|
|
255
255
|
|
|
256
|
-
Backend services
|
|
256
|
+
Backend services register for JWT validation updates by constructing a server
|
|
257
|
+
client with a backend token. The SDK authenticates every physical connection
|
|
258
|
+
and reconnect through TypedSocket's bounded restoration callback before the
|
|
259
|
+
connection becomes available:
|
|
257
260
|
|
|
258
261
|
```ts
|
|
259
262
|
const idpClient = new IdpGlobalServerClient({
|
|
@@ -269,11 +272,17 @@ idpClient.onBlocklistPush((blockedJwtIds) => {
|
|
|
269
272
|
// replace the local JWT ID blocklist with this complete persisted snapshot
|
|
270
273
|
});
|
|
271
274
|
|
|
272
|
-
await idpClient.registerBackendService();
|
|
273
275
|
const publicKeys = await idpClient.getPublicKeysForValidation();
|
|
274
276
|
const blockedJwtIds = await idpClient.getJwtIdBlocklist();
|
|
275
277
|
```
|
|
276
278
|
|
|
279
|
+
`registerBackendService()` remains available for an explicit registration. A
|
|
280
|
+
successful explicit token becomes the client's restoration state, so every
|
|
281
|
+
later physical reconnect authenticates with that token before the connection
|
|
282
|
+
becomes available. Both paths fire the exact `registerBackendServiceConnection`
|
|
283
|
+
request; clients never assign the protected backend-service role tag
|
|
284
|
+
themselves.
|
|
285
|
+
|
|
277
286
|
Verification is keyset-only. Replace the cached snapshot on every push, select
|
|
278
287
|
the verification key by the JWT header `kid`, and reject unknown key IDs.
|
|
279
288
|
|
|
@@ -285,7 +294,7 @@ the verification key by the JWT header `kid`, and reject unknown key IDs.
|
|
|
285
294
|
| `AccountAuthService` | Existing-account authentication orchestration for `local`, `idp.global`, and `auto`. |
|
|
286
295
|
| `IdpGlobalServerClient` | Typed-socket client for idp.global password login, JWT refresh, `whoIs` lookup, backend JWT validation fetches, and JWT key/blocklist pushes. |
|
|
287
296
|
| `IdpMfaRequiredError` | Password-login error carrying the MFA challenge token and available factor methods. |
|
|
288
|
-
| `defaultIdpGlobalBaseUrl` | Default hosted server origin: `https://idp.global`. |
|
|
297
|
+
| `defaultIdpGlobalBaseUrl` | Default hosted server origin: `https://app.idp.global`. |
|
|
289
298
|
| `PasswordHasher` | Static `hashPassword()` and `verifyPassword()` helpers using `scrypt:v1`. |
|
|
290
299
|
| `IdpSdkAccountDoc` | Smartdata document class backing persisted SDK accounts. |
|
|
291
300
|
| `setAccountDocSmartdataDb()` | Configure the active Smartdata DB for `IdpSdkAccountDoc`. Usually handled by `SmartdataAccountStore`. |
|
|
@@ -303,7 +312,7 @@ The server export includes these TypeScript types:
|
|
|
303
312
|
| `ICreateIdpSdkAccountOptions` | Input for account creation. |
|
|
304
313
|
| `IAuthenticateAccountOptions` | Input for `AccountAuthService.authenticate()`. |
|
|
305
314
|
| `IAuthenticatedAccountResult` | Successful auth result with account, auth source, and optional idp.global tokens. |
|
|
306
|
-
| `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl` and `backendToken`; defaults to `https://idp.global`. |
|
|
315
|
+
| `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl` and `backendToken`; defaults to `https://app.idp.global`. |
|
|
307
316
|
| `IIdpPasswordAuthResult` | Privacy-safe current-user DTO, JWT, and refresh-token result. |
|
|
308
317
|
|
|
309
318
|
## Runtime Notes
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -5,7 +5,7 @@ export interface IIdpGlobalServerClientOptions {
|
|
|
5
5
|
backendToken?: string;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export const defaultIdpGlobalBaseUrl = 'https://idp.global';
|
|
8
|
+
export const defaultIdpGlobalBaseUrl = 'https://app.idp.global';
|
|
9
9
|
|
|
10
10
|
export interface IIdpPasswordAuthResult {
|
|
11
11
|
user: plugins.idpInterfaces.dto.ICurrentUserDto;
|
|
@@ -17,7 +17,10 @@ export class IdpMfaRequiredError extends Error {
|
|
|
17
17
|
public mfaChallengeToken: string;
|
|
18
18
|
public availableMfaMethods: plugins.idpInterfaces.data.TMfaMethod[];
|
|
19
19
|
|
|
20
|
-
constructor(optionsArg: {
|
|
20
|
+
constructor(optionsArg: {
|
|
21
|
+
mfaChallengeToken?: string;
|
|
22
|
+
availableMfaMethods?: plugins.idpInterfaces.data.TMfaMethod[];
|
|
23
|
+
}) {
|
|
21
24
|
super('Two-factor authentication is required');
|
|
22
25
|
this.name = 'IdpMfaRequiredError';
|
|
23
26
|
this.mfaChallengeToken = optionsArg.mfaChallengeToken || '';
|
|
@@ -26,41 +29,47 @@ export class IdpMfaRequiredError extends Error {
|
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
export class IdpGlobalServerClient {
|
|
29
|
-
private typedrouter
|
|
32
|
+
private typedrouter = new plugins.typedrequest.TypedRouter();
|
|
30
33
|
private typedsocket?: plugins.typedsocket.TypedSocket;
|
|
31
34
|
private typedsocketDeferred = this.createConnectionDeferred();
|
|
32
35
|
private publicKeysPushHandlers: Array<(
|
|
33
36
|
publicKeysArg: plugins.idpInterfaces.data.IJwtVerificationKey[]
|
|
34
37
|
) => void | Promise<void>> = [];
|
|
35
|
-
private blocklistPushHandlers: Array<
|
|
38
|
+
private blocklistPushHandlers: Array<
|
|
39
|
+
(blockedJwtIdsArg: string[]) => void | Promise<void>
|
|
40
|
+
> = [];
|
|
36
41
|
private connectionGeneration = 0;
|
|
37
42
|
private pendingSocketPromise?: Promise<plugins.typedsocket.TypedSocket>;
|
|
38
43
|
private connectionAbortController?: AbortController;
|
|
39
44
|
private stopWaiters = new Set<(errorArg: Error) => void>();
|
|
40
45
|
private stopping = false;
|
|
46
|
+
private backendToken?: string;
|
|
41
47
|
|
|
42
48
|
constructor(private optionsArg: IIdpGlobalServerClientOptions = {}) {
|
|
49
|
+
this.backendToken = optionsArg.backendToken;
|
|
43
50
|
this.typedrouter.addTypedHandler(
|
|
44
|
-
new plugins.typedrequest.TypedHandler<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
)
|
|
51
|
+
new plugins.typedrequest.TypedHandler<
|
|
52
|
+
plugins.idpInterfaces.request.IReq_PushPublicKeysForValidation
|
|
53
|
+
>('pushPublicKeysForValidation', async (requestArg) => {
|
|
54
|
+
await Promise.all(
|
|
55
|
+
this.publicKeysPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeys))
|
|
56
|
+
);
|
|
57
|
+
return {};
|
|
58
|
+
})
|
|
53
59
|
);
|
|
54
60
|
this.typedrouter.addTypedHandler(
|
|
55
|
-
new plugins.typedrequest.TypedHandler<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
new plugins.typedrequest.TypedHandler<
|
|
62
|
+
plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist
|
|
63
|
+
>('pushOrGetJwtIdBlocklist', async (requestArg) => {
|
|
64
|
+
if (requestArg.blockedJwtIds) {
|
|
65
|
+
await Promise.all(
|
|
66
|
+
this.blocklistPushHandlers.map((handlerArg) =>
|
|
67
|
+
handlerArg(requestArg.blockedJwtIds!)
|
|
68
|
+
)
|
|
69
|
+
);
|
|
62
70
|
}
|
|
63
|
-
|
|
71
|
+
return {};
|
|
72
|
+
})
|
|
64
73
|
);
|
|
65
74
|
}
|
|
66
75
|
|
|
@@ -82,7 +91,22 @@ export class IdpGlobalServerClient {
|
|
|
82
91
|
socketPromise = plugins.typedsocket.TypedSocket.createClient(
|
|
83
92
|
this.typedrouter,
|
|
84
93
|
this.getTypedRequestUrl(),
|
|
85
|
-
{
|
|
94
|
+
{
|
|
95
|
+
autoReconnect: true,
|
|
96
|
+
abortSignal: connectionAbortController.signal,
|
|
97
|
+
restoreConnection: async ({ createTypedRequest }) => {
|
|
98
|
+
const backendToken = this.backendToken;
|
|
99
|
+
if (!backendToken) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const response = await createTypedRequest<
|
|
103
|
+
plugins.idpInterfaces.request.IReq_RegisterBackendServiceConnection
|
|
104
|
+
>('registerBackendServiceConnection').fire({ backendToken });
|
|
105
|
+
if (response.registered !== true) {
|
|
106
|
+
throw new Error('IdP rejected backend-service connection registration.');
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
}
|
|
86
110
|
);
|
|
87
111
|
this.pendingSocketPromise = socketPromise;
|
|
88
112
|
createdSocket = await this.raceWithStop(socketPromise);
|
|
@@ -96,7 +120,10 @@ export class IdpGlobalServerClient {
|
|
|
96
120
|
this.typedsocket = createdSocket;
|
|
97
121
|
deferred.resolve(createdSocket);
|
|
98
122
|
} catch (error) {
|
|
99
|
-
if (
|
|
123
|
+
if (
|
|
124
|
+
generation === this.connectionGeneration &&
|
|
125
|
+
(!createdSocket || this.typedsocket === createdSocket)
|
|
126
|
+
) {
|
|
100
127
|
this.typedsocket = undefined;
|
|
101
128
|
}
|
|
102
129
|
await createdSocket?.stop().catch(() => undefined);
|
|
@@ -148,29 +175,46 @@ export class IdpGlobalServerClient {
|
|
|
148
175
|
): () => void {
|
|
149
176
|
this.publicKeysPushHandlers.push(handlerArg);
|
|
150
177
|
return () => {
|
|
151
|
-
this.publicKeysPushHandlers = this.publicKeysPushHandlers.filter(
|
|
178
|
+
this.publicKeysPushHandlers = this.publicKeysPushHandlers.filter(
|
|
179
|
+
(handler) => handler !== handlerArg
|
|
180
|
+
);
|
|
152
181
|
};
|
|
153
182
|
}
|
|
154
183
|
|
|
155
|
-
public onBlocklistPush(
|
|
184
|
+
public onBlocklistPush(
|
|
185
|
+
handlerArg: (blockedJwtIdsArg: string[]) => void | Promise<void>
|
|
186
|
+
): () => void {
|
|
156
187
|
this.blocklistPushHandlers.push(handlerArg);
|
|
157
188
|
return () => {
|
|
158
|
-
this.blocklistPushHandlers = this.blocklistPushHandlers.filter(
|
|
189
|
+
this.blocklistPushHandlers = this.blocklistPushHandlers.filter(
|
|
190
|
+
(handler) => handler !== handlerArg
|
|
191
|
+
);
|
|
159
192
|
};
|
|
160
193
|
}
|
|
161
194
|
|
|
162
|
-
public async registerBackendService(
|
|
195
|
+
public async registerBackendService(
|
|
196
|
+
backendTokenArg = this.backendToken
|
|
197
|
+
): Promise<void> {
|
|
163
198
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
164
199
|
const socket = await this.connect();
|
|
165
|
-
|
|
200
|
+
const request = socket.createTypedRequest<
|
|
201
|
+
plugins.idpInterfaces.request.IReq_RegisterBackendServiceConnection
|
|
202
|
+
>('registerBackendServiceConnection');
|
|
203
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
204
|
+
if (response.registered !== true) {
|
|
205
|
+
throw new Error('IdP rejected backend-service connection registration.');
|
|
206
|
+
}
|
|
207
|
+
this.backendToken = backendToken;
|
|
166
208
|
}
|
|
167
209
|
|
|
168
210
|
public async getPublicKeysForValidation(
|
|
169
|
-
backendTokenArg = this.
|
|
211
|
+
backendTokenArg = this.backendToken
|
|
170
212
|
): Promise<plugins.idpInterfaces.data.IJwtVerificationKey[]> {
|
|
171
213
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
172
214
|
const socket = await this.connect();
|
|
173
|
-
const request = socket.createTypedRequest<
|
|
215
|
+
const request = socket.createTypedRequest<
|
|
216
|
+
plugins.idpInterfaces.request.IReq_GetPublicKeysForValidation
|
|
217
|
+
>('getPublicKeysForValidation');
|
|
174
218
|
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
175
219
|
if (!Array.isArray(response.publicKeys) || response.publicKeys.length === 0) {
|
|
176
220
|
throw new Error('IdP returned an invalid JWT verification key set.');
|
|
@@ -178,39 +222,58 @@ export class IdpGlobalServerClient {
|
|
|
178
222
|
return response.publicKeys;
|
|
179
223
|
}
|
|
180
224
|
|
|
181
|
-
public async getJwtIdBlocklist(
|
|
225
|
+
public async getJwtIdBlocklist(
|
|
226
|
+
backendTokenArg = this.backendToken
|
|
227
|
+
): Promise<string[]> {
|
|
182
228
|
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
183
229
|
const socket = await this.connect();
|
|
184
|
-
const request = socket.createTypedRequest<
|
|
230
|
+
const request = socket.createTypedRequest<
|
|
231
|
+
plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist
|
|
232
|
+
>('pushOrGetJwtIdBlocklist');
|
|
185
233
|
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
186
234
|
return response.blockedJwtIds || [];
|
|
187
235
|
}
|
|
188
236
|
|
|
189
|
-
public async loginWithEmailAndPassword(optionsArg: {
|
|
237
|
+
public async loginWithEmailAndPassword(optionsArg: {
|
|
238
|
+
email: string;
|
|
239
|
+
password: string;
|
|
240
|
+
}): Promise<IIdpPasswordAuthResult> {
|
|
190
241
|
const socket = await this.connect();
|
|
191
|
-
const loginRequest = socket.createTypedRequest<
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
242
|
+
const loginRequest = socket.createTypedRequest<
|
|
243
|
+
plugins.idpInterfaces.request.IReq_LoginWithEmailOrUsernameAndPassword
|
|
244
|
+
>('loginWithEmailOrUsernameAndPassword');
|
|
245
|
+
const loginResponse = await this.raceWithStop(
|
|
246
|
+
loginRequest.fire({
|
|
247
|
+
username: optionsArg.email,
|
|
248
|
+
password: optionsArg.password,
|
|
249
|
+
})
|
|
250
|
+
);
|
|
196
251
|
if (loginResponse.twoFaNeeded) {
|
|
197
252
|
throw new IdpMfaRequiredError({
|
|
198
|
-
mfaChallengeToken:
|
|
199
|
-
availableMfaMethods:
|
|
253
|
+
mfaChallengeToken: loginResponse.mfaChallengeToken,
|
|
254
|
+
availableMfaMethods: loginResponse.availableMfaMethods,
|
|
200
255
|
});
|
|
201
256
|
}
|
|
202
257
|
if (!loginResponse.refreshToken) {
|
|
203
258
|
throw new Error('IdP login failed');
|
|
204
259
|
}
|
|
205
260
|
|
|
206
|
-
const refreshRequest = socket.createTypedRequest<
|
|
207
|
-
|
|
261
|
+
const refreshRequest = socket.createTypedRequest<
|
|
262
|
+
plugins.idpInterfaces.request.IReq_RefreshJwt
|
|
263
|
+
>('refreshJwt');
|
|
264
|
+
const refreshResponse = await this.raceWithStop(
|
|
265
|
+
refreshRequest.fire({ refreshToken: loginResponse.refreshToken })
|
|
266
|
+
);
|
|
208
267
|
if (!refreshResponse.jwt) {
|
|
209
268
|
throw new Error('IdP did not return a JWT');
|
|
210
269
|
}
|
|
211
270
|
|
|
212
|
-
const whoIsRequest = socket.createTypedRequest<
|
|
213
|
-
|
|
271
|
+
const whoIsRequest = socket.createTypedRequest<
|
|
272
|
+
plugins.idpInterfaces.request.IReq_WhoIs
|
|
273
|
+
>('whoIs');
|
|
274
|
+
const whoIsResponse = await this.raceWithStop(
|
|
275
|
+
whoIsRequest.fire({ jwt: refreshResponse.jwt })
|
|
276
|
+
);
|
|
214
277
|
return {
|
|
215
278
|
user: whoIsResponse.user,
|
|
216
279
|
jwt: refreshResponse.jwt,
|
|
@@ -236,15 +299,6 @@ export class IdpGlobalServerClient {
|
|
|
236
299
|
return backendTokenArg;
|
|
237
300
|
}
|
|
238
301
|
|
|
239
|
-
private async applyBackendServiceTag(
|
|
240
|
-
socketArg: plugins.typedsocket.TypedSocket,
|
|
241
|
-
backendTokenArg: string
|
|
242
|
-
): Promise<void> {
|
|
243
|
-
await this.raceWithStop(socketArg.setTag<plugins.idpInterfaces.tags.ITag_BackendService>('backend-service', {
|
|
244
|
-
backendToken: backendTokenArg,
|
|
245
|
-
}));
|
|
246
|
-
}
|
|
247
|
-
|
|
248
302
|
private createConnectionDeferred() {
|
|
249
303
|
const deferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
|
|
250
304
|
deferred.promise.catch(() => undefined);
|