@idp.global/sdk 5.0.1 → 6.0.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 +11 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_browser/classes.idprequests.d.ts +23 -6
- package/dist_ts_browser/classes.idprequests.js +70 -19
- package/dist_ts_server/classes.idp-global-server-client.d.ts +18 -0
- package/dist_ts_server/classes.idp-global-server-client.js +154 -11
- package/package.json +3 -3
- package/readme.md +29 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_browser/classes.idprequests.ts +90 -22
- package/ts_server/classes.idp-global-server-client.ts +181 -14
package/changelog.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-06-25 - 6.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- align SDK with idp interfaces v7 and backend JWT validation APIs (browser,server)
|
|
8
|
+
- Update @idp.global/interfaces to ^7.0.0 and @api.global/typedsocket to ^4.2.2
|
|
9
|
+
- Add backendToken support, backend-service registration, JWT public key/blocklist retrieval, and push handlers to IdpGlobalServerClient
|
|
10
|
+
- Expose new browser request getters for global apps, app connections, passport flows, alerts, and organization billing plans
|
|
11
|
+
- Remove browser request getters no longer available in the updated interface contract
|
|
12
|
+
- Improve server client connection lifecycle with auto-reconnect, abort handling, and stop-aware request handling
|
|
13
|
+
|
|
3
14
|
## 2026-06-23 - 5.0.1
|
|
4
15
|
|
|
5
16
|
### Fixes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@idp.global/sdk',
|
|
6
|
-
version: '
|
|
6
|
+
version: '6.0.0',
|
|
7
7
|
description: 'Reusable browser and server SDK for idp.global authentication.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGdFQUFnRTtDQUM5RSxDQUFBIn0=
|
|
@@ -20,8 +20,6 @@ export declare class IdpRequests {
|
|
|
20
20
|
get obtainDeviceId(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_ObtainDeviceId>;
|
|
21
21
|
get attachDeviceId(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_AttachDeviceId>;
|
|
22
22
|
get firstRegistration(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_FirstRegistration>;
|
|
23
|
-
get getUserData(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetUserData>;
|
|
24
|
-
get setUserData(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_SetUserData>;
|
|
25
23
|
get getUserSessions(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetUserSessions>;
|
|
26
24
|
get revokeSession(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_RevokeSession>;
|
|
27
25
|
get getMfaStatus(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetMfaStatus>;
|
|
@@ -56,13 +54,32 @@ export declare class IdpRequests {
|
|
|
56
54
|
get acceptInvitation(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_AcceptInvitation>;
|
|
57
55
|
get bulkCreateInvitations(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_BulkCreateInvitations>;
|
|
58
56
|
get updateAppRoleMappings(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_UpdateAppRoleMappings>;
|
|
57
|
+
get getGlobalApps(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetGlobalApps>;
|
|
58
|
+
get getAppConnections(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetAppConnections>;
|
|
59
|
+
get toggleAppConnection(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_ToggleAppConnection>;
|
|
60
|
+
get createPassportEnrollmentChallenge(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportEnrollmentChallenge>;
|
|
61
|
+
get completePassportEnrollment(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_CompletePassportEnrollment>;
|
|
62
|
+
get getPassportDevices(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDevices>;
|
|
63
|
+
get revokePassportDevice(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_RevokePassportDevice>;
|
|
64
|
+
get createPassportChallenge(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportChallenge>;
|
|
65
|
+
get approvePassportChallenge(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_ApprovePassportChallenge>;
|
|
66
|
+
get rejectPassportChallenge(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_RejectPassportChallenge>;
|
|
67
|
+
get registerPassportPushToken(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_RegisterPassportPushToken>;
|
|
68
|
+
get listPendingPassportChallenges(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_ListPendingPassportChallenges>;
|
|
69
|
+
get getPassportChallengeByHint(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPassportChallengeByHint>;
|
|
70
|
+
get markPassportChallengeSeen(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportChallengeSeen>;
|
|
71
|
+
get getPassportDashboard(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDashboard>;
|
|
72
|
+
get listPassportAlerts(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_ListPassportAlerts>;
|
|
73
|
+
get getPassportAlertByHint(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPassportAlertByHint>;
|
|
74
|
+
get markPassportAlertSeen(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportAlertSeen>;
|
|
75
|
+
get dismissPassportAlert(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_DismissPassportAlert>;
|
|
76
|
+
get upsertAlertRule(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_UpsertAlertRule>;
|
|
77
|
+
get getAlertRules(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetAlertRules>;
|
|
78
|
+
get deleteAlertRule(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_DeleteAlertRule>;
|
|
59
79
|
get getBillingPlan(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetBillingPlan>;
|
|
80
|
+
get getBillingPlansForOrganizationId(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPlansForOrganizationId>;
|
|
60
81
|
get getPaddleConfig(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPaddleConfig>;
|
|
61
|
-
get getPublicKeyForValidation(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetPublicKeyForValidation>;
|
|
62
|
-
get pushPublicKeyForValidation(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_PushPublicKeyForValidation>;
|
|
63
|
-
get pushOrGetJwtIdBlocklist(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>;
|
|
64
82
|
get suspendUser(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_SuspendUser>;
|
|
65
|
-
get deleteSuspendedUser(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IDeleteSuspendedUser>;
|
|
66
83
|
get checkGlobalAdmin(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_CheckGlobalAdmin>;
|
|
67
84
|
get getGlobalAppStats(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_GetGlobalAppStats>;
|
|
68
85
|
get createGlobalApp(): plugins.typedrequest.TypedRequest<plugins.idpInterfaces.request.IReq_CreateGlobalApp>;
|
|
@@ -55,12 +55,6 @@ export class IdpRequests {
|
|
|
55
55
|
get firstRegistration() {
|
|
56
56
|
return this.idpClientArg.typedsocket.createTypedRequest('firstRegistrationRequest');
|
|
57
57
|
}
|
|
58
|
-
get getUserData() {
|
|
59
|
-
return this.idpClientArg.typedsocket.createTypedRequest('getUserData');
|
|
60
|
-
}
|
|
61
|
-
get setUserData() {
|
|
62
|
-
return this.idpClientArg.typedsocket.createTypedRequest('setUserData');
|
|
63
|
-
}
|
|
64
58
|
get getUserSessions() {
|
|
65
59
|
return this.idpClientArg.typedsocket.createTypedRequest('getUserSessions');
|
|
66
60
|
}
|
|
@@ -163,27 +157,84 @@ export class IdpRequests {
|
|
|
163
157
|
get updateAppRoleMappings() {
|
|
164
158
|
return this.idpClientArg.typedsocket.createTypedRequest('updateAppRoleMappings');
|
|
165
159
|
}
|
|
160
|
+
get getGlobalApps() {
|
|
161
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getGlobalApps');
|
|
162
|
+
}
|
|
163
|
+
get getAppConnections() {
|
|
164
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getAppConnections');
|
|
165
|
+
}
|
|
166
|
+
get toggleAppConnection() {
|
|
167
|
+
return this.idpClientArg.typedsocket.createTypedRequest('toggleAppConnection');
|
|
168
|
+
}
|
|
169
|
+
get createPassportEnrollmentChallenge() {
|
|
170
|
+
return this.idpClientArg.typedsocket.createTypedRequest('createPassportEnrollmentChallenge');
|
|
171
|
+
}
|
|
172
|
+
get completePassportEnrollment() {
|
|
173
|
+
return this.idpClientArg.typedsocket.createTypedRequest('completePassportEnrollment');
|
|
174
|
+
}
|
|
175
|
+
get getPassportDevices() {
|
|
176
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getPassportDevices');
|
|
177
|
+
}
|
|
178
|
+
get revokePassportDevice() {
|
|
179
|
+
return this.idpClientArg.typedsocket.createTypedRequest('revokePassportDevice');
|
|
180
|
+
}
|
|
181
|
+
get createPassportChallenge() {
|
|
182
|
+
return this.idpClientArg.typedsocket.createTypedRequest('createPassportChallenge');
|
|
183
|
+
}
|
|
184
|
+
get approvePassportChallenge() {
|
|
185
|
+
return this.idpClientArg.typedsocket.createTypedRequest('approvePassportChallenge');
|
|
186
|
+
}
|
|
187
|
+
get rejectPassportChallenge() {
|
|
188
|
+
return this.idpClientArg.typedsocket.createTypedRequest('rejectPassportChallenge');
|
|
189
|
+
}
|
|
190
|
+
get registerPassportPushToken() {
|
|
191
|
+
return this.idpClientArg.typedsocket.createTypedRequest('registerPassportPushToken');
|
|
192
|
+
}
|
|
193
|
+
get listPendingPassportChallenges() {
|
|
194
|
+
return this.idpClientArg.typedsocket.createTypedRequest('listPendingPassportChallenges');
|
|
195
|
+
}
|
|
196
|
+
get getPassportChallengeByHint() {
|
|
197
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getPassportChallengeByHint');
|
|
198
|
+
}
|
|
199
|
+
get markPassportChallengeSeen() {
|
|
200
|
+
return this.idpClientArg.typedsocket.createTypedRequest('markPassportChallengeSeen');
|
|
201
|
+
}
|
|
202
|
+
get getPassportDashboard() {
|
|
203
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getPassportDashboard');
|
|
204
|
+
}
|
|
205
|
+
get listPassportAlerts() {
|
|
206
|
+
return this.idpClientArg.typedsocket.createTypedRequest('listPassportAlerts');
|
|
207
|
+
}
|
|
208
|
+
get getPassportAlertByHint() {
|
|
209
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getPassportAlertByHint');
|
|
210
|
+
}
|
|
211
|
+
get markPassportAlertSeen() {
|
|
212
|
+
return this.idpClientArg.typedsocket.createTypedRequest('markPassportAlertSeen');
|
|
213
|
+
}
|
|
214
|
+
get dismissPassportAlert() {
|
|
215
|
+
return this.idpClientArg.typedsocket.createTypedRequest('dismissPassportAlert');
|
|
216
|
+
}
|
|
217
|
+
get upsertAlertRule() {
|
|
218
|
+
return this.idpClientArg.typedsocket.createTypedRequest('upsertAlertRule');
|
|
219
|
+
}
|
|
220
|
+
get getAlertRules() {
|
|
221
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getAlertRules');
|
|
222
|
+
}
|
|
223
|
+
get deleteAlertRule() {
|
|
224
|
+
return this.idpClientArg.typedsocket.createTypedRequest('deleteAlertRule');
|
|
225
|
+
}
|
|
166
226
|
get getBillingPlan() {
|
|
167
227
|
return this.idpClientArg.typedsocket.createTypedRequest('getBillingPlan');
|
|
168
228
|
}
|
|
229
|
+
get getBillingPlansForOrganizationId() {
|
|
230
|
+
return this.idpClientArg.typedsocket.createTypedRequest('getBillingPlansForOrganizationId');
|
|
231
|
+
}
|
|
169
232
|
get getPaddleConfig() {
|
|
170
233
|
return this.idpClientArg.typedsocket.createTypedRequest('getPaddleConfig');
|
|
171
234
|
}
|
|
172
|
-
get getPublicKeyForValidation() {
|
|
173
|
-
return this.idpClientArg.typedsocket.createTypedRequest('getPublicKeyForValidation');
|
|
174
|
-
}
|
|
175
|
-
get pushPublicKeyForValidation() {
|
|
176
|
-
return this.idpClientArg.typedsocket.createTypedRequest('pushPublicKeyForValidation');
|
|
177
|
-
}
|
|
178
|
-
get pushOrGetJwtIdBlocklist() {
|
|
179
|
-
return this.idpClientArg.typedsocket.createTypedRequest('pushOrGetJwtIdBlocklist');
|
|
180
|
-
}
|
|
181
235
|
get suspendUser() {
|
|
182
236
|
return this.idpClientArg.typedsocket.createTypedRequest('suspendUser');
|
|
183
237
|
}
|
|
184
|
-
get deleteSuspendedUser() {
|
|
185
|
-
return this.idpClientArg.typedsocket.createTypedRequest('deleteSuspendedUser');
|
|
186
|
-
}
|
|
187
238
|
get checkGlobalAdmin() {
|
|
188
239
|
return this.idpClientArg.typedsocket.createTypedRequest('checkGlobalAdmin');
|
|
189
240
|
}
|
|
@@ -203,4 +254,4 @@ export class IdpRequests {
|
|
|
203
254
|
return this.idpClientArg.typedsocket.createTypedRequest('regenerateAppCredentials');
|
|
204
255
|
}
|
|
205
256
|
}
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHByZXF1ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2Jyb3dzZXIvY2xhc3Nlcy5pZHByZXF1ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxNQUFNLE9BQU8sV0FBVztJQUNGO0lBQXBCLFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO0lBQUcsQ0FBQztJQUUvQyxJQUFXLDZCQUE2QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFtRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzdKLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBNEQsd0JBQXdCLENBQUMsQ0FBQztJQUMvSSxDQUFDO0lBRUQsSUFBVyx3QkFBd0I7UUFDakMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBdUUsbUNBQW1DLENBQUMsQ0FBQztJQUNySyxDQUFDO0lBRUQsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBd0Qsb0JBQW9CLENBQUMsQ0FBQztJQUN2SSxDQUFDO0lBRUQsSUFBVyw0QkFBNEI7UUFDckMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBeUUscUNBQXFDLENBQUMsQ0FBQztJQUN6SyxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQWdELFlBQVksQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGtC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
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHByZXF1ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2Jyb3dzZXIvY2xhc3Nlcy5pZHByZXF1ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxNQUFNLE9BQU8sV0FBVztJQUNGO0lBQXBCLFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO0lBQUcsQ0FBQztJQUUvQyxJQUFXLDZCQUE2QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFtRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzdKLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBNEQsd0JBQXdCLENBQUMsQ0FBQztJQUMvSSxDQUFDO0lBRUQsSUFBVyx3QkFBd0I7UUFDakMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBdUUsbUNBQW1DLENBQUMsQ0FBQztJQUNySyxDQUFDO0lBRUQsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBd0Qsb0JBQW9CLENBQUMsQ0FBQztJQUN2SSxDQUFDO0lBRUQsSUFBVyw0QkFBNEI7UUFDckMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBeUUscUNBQXFDLENBQUMsQ0FBQztJQUN6SyxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQWdELFlBQVksQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGtC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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
export interface IIdpGlobalServerClientOptions {
|
|
3
3
|
baseUrl?: string;
|
|
4
|
+
backendToken?: string;
|
|
4
5
|
}
|
|
5
6
|
export declare const defaultIdpGlobalBaseUrl = "https://idp.global";
|
|
6
7
|
export interface IIdpPasswordAuthResult {
|
|
@@ -21,12 +22,29 @@ export declare class IdpGlobalServerClient {
|
|
|
21
22
|
private typedrouter;
|
|
22
23
|
private typedsocket?;
|
|
23
24
|
private typedsocketDeferred;
|
|
25
|
+
private publicKeyPushHandlers;
|
|
26
|
+
private blocklistPushHandlers;
|
|
27
|
+
private connectionGeneration;
|
|
28
|
+
private pendingSocketPromise?;
|
|
29
|
+
private connectionAbortController?;
|
|
30
|
+
private stopWaiters;
|
|
31
|
+
private stopping;
|
|
24
32
|
constructor(optionsArg?: IIdpGlobalServerClientOptions);
|
|
25
33
|
connect(): Promise<plugins.typedsocket.TypedSocket>;
|
|
26
34
|
stop(): Promise<void>;
|
|
35
|
+
onPublicKeyPush(handlerArg: (publicKeyPemArg: string) => void | Promise<void>): () => void;
|
|
36
|
+
onBlocklistPush(handlerArg: (blockedJwtIdsArg: string[]) => void | Promise<void>): () => void;
|
|
37
|
+
registerBackendService(backendTokenArg?: string): Promise<void>;
|
|
38
|
+
getPublicKeyForValidation(backendTokenArg?: string): Promise<string>;
|
|
39
|
+
getJwtIdBlocklist(backendTokenArg?: string): Promise<string[]>;
|
|
27
40
|
loginWithEmailAndPassword(optionsArg: {
|
|
28
41
|
email: string;
|
|
29
42
|
password: string;
|
|
30
43
|
}): Promise<IIdpPasswordAuthResult>;
|
|
31
44
|
private getTypedRequestUrl;
|
|
45
|
+
private requireBackendToken;
|
|
46
|
+
private applyBackendServiceTag;
|
|
47
|
+
private createConnectionDeferred;
|
|
48
|
+
private raceWithStop;
|
|
49
|
+
private rejectStopWaiters;
|
|
32
50
|
}
|
|
@@ -14,30 +14,138 @@ export class IdpGlobalServerClient {
|
|
|
14
14
|
optionsArg;
|
|
15
15
|
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
16
16
|
typedsocket;
|
|
17
|
-
typedsocketDeferred =
|
|
17
|
+
typedsocketDeferred = this.createConnectionDeferred();
|
|
18
|
+
publicKeyPushHandlers = [];
|
|
19
|
+
blocklistPushHandlers = [];
|
|
20
|
+
connectionGeneration = 0;
|
|
21
|
+
pendingSocketPromise;
|
|
22
|
+
connectionAbortController;
|
|
23
|
+
stopWaiters = new Set();
|
|
24
|
+
stopping = false;
|
|
18
25
|
constructor(optionsArg = {}) {
|
|
19
26
|
this.optionsArg = optionsArg;
|
|
27
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushPublicKeyForValidation', async (requestArg) => {
|
|
28
|
+
await Promise.all(this.publicKeyPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeyPem)));
|
|
29
|
+
return {};
|
|
30
|
+
}));
|
|
31
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushOrGetJwtIdBlocklist', async (requestArg) => {
|
|
32
|
+
if (requestArg.blockedJwtIds) {
|
|
33
|
+
await Promise.all(this.blocklistPushHandlers.map((handlerArg) => handlerArg(requestArg.blockedJwtIds)));
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
}));
|
|
20
37
|
}
|
|
21
38
|
async connect() {
|
|
39
|
+
if (this.stopping) {
|
|
40
|
+
throw new Error('IdpGlobalServerClient is stopping');
|
|
41
|
+
}
|
|
22
42
|
if (this.typedsocketDeferred.claimed) {
|
|
23
43
|
return this.typedsocketDeferred.promise;
|
|
24
44
|
}
|
|
25
|
-
this.typedsocketDeferred
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
45
|
+
const deferred = this.typedsocketDeferred;
|
|
46
|
+
const generation = this.connectionGeneration;
|
|
47
|
+
deferred.claim();
|
|
48
|
+
let createdSocket;
|
|
49
|
+
let socketPromise;
|
|
50
|
+
const connectionAbortController = new AbortController();
|
|
51
|
+
try {
|
|
52
|
+
this.connectionAbortController = connectionAbortController;
|
|
53
|
+
socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), { autoReconnect: true, abortSignal: connectionAbortController.signal });
|
|
54
|
+
this.pendingSocketPromise = socketPromise;
|
|
55
|
+
createdSocket = await this.raceWithStop(socketPromise);
|
|
56
|
+
if (generation !== this.connectionGeneration) {
|
|
57
|
+
await createdSocket.stop();
|
|
58
|
+
if (deferred.status === 'pending') {
|
|
59
|
+
deferred.reject(new Error('IdpGlobalServerClient stopped while connecting'));
|
|
60
|
+
}
|
|
61
|
+
return deferred.promise;
|
|
62
|
+
}
|
|
63
|
+
this.typedsocket = createdSocket;
|
|
64
|
+
deferred.resolve(createdSocket);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (generation === this.connectionGeneration && (!createdSocket || this.typedsocket === createdSocket)) {
|
|
68
|
+
this.typedsocket = undefined;
|
|
69
|
+
}
|
|
70
|
+
await createdSocket?.stop().catch(() => undefined);
|
|
71
|
+
if (deferred.status === 'pending') {
|
|
72
|
+
deferred.reject(error);
|
|
73
|
+
}
|
|
74
|
+
if (this.typedsocketDeferred === deferred) {
|
|
75
|
+
this.typedsocketDeferred = this.createConnectionDeferred();
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
if (socketPromise && this.pendingSocketPromise === socketPromise) {
|
|
81
|
+
this.pendingSocketPromise = undefined;
|
|
82
|
+
}
|
|
83
|
+
if (this.connectionAbortController === connectionAbortController) {
|
|
84
|
+
this.connectionAbortController = undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return deferred.promise;
|
|
29
88
|
}
|
|
30
89
|
async stop() {
|
|
31
|
-
|
|
90
|
+
this.stopping = true;
|
|
91
|
+
this.connectionGeneration++;
|
|
92
|
+
const stopError = new Error('IdpGlobalServerClient stopped');
|
|
93
|
+
this.rejectStopWaiters(stopError);
|
|
94
|
+
const socket = this.typedsocket;
|
|
95
|
+
const pendingSocketPromise = this.pendingSocketPromise;
|
|
96
|
+
this.connectionAbortController?.abort();
|
|
97
|
+
this.connectionAbortController = undefined;
|
|
32
98
|
this.typedsocket = undefined;
|
|
99
|
+
if (this.typedsocketDeferred.status === 'pending' && this.typedsocketDeferred.claimed) {
|
|
100
|
+
this.typedsocketDeferred.reject(stopError);
|
|
101
|
+
}
|
|
102
|
+
await socket?.stop();
|
|
103
|
+
const pendingSocket = await pendingSocketPromise?.catch(() => undefined);
|
|
104
|
+
if (pendingSocket && pendingSocket !== socket) {
|
|
105
|
+
await pendingSocket.stop().catch(() => undefined);
|
|
106
|
+
}
|
|
107
|
+
this.typedsocketDeferred = this.createConnectionDeferred();
|
|
108
|
+
this.pendingSocketPromise = undefined;
|
|
109
|
+
this.stopping = false;
|
|
110
|
+
}
|
|
111
|
+
onPublicKeyPush(handlerArg) {
|
|
112
|
+
this.publicKeyPushHandlers.push(handlerArg);
|
|
113
|
+
return () => {
|
|
114
|
+
this.publicKeyPushHandlers = this.publicKeyPushHandlers.filter((handler) => handler !== handlerArg);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
onBlocklistPush(handlerArg) {
|
|
118
|
+
this.blocklistPushHandlers.push(handlerArg);
|
|
119
|
+
return () => {
|
|
120
|
+
this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async registerBackendService(backendTokenArg = this.optionsArg.backendToken) {
|
|
124
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
125
|
+
const socket = await this.connect();
|
|
126
|
+
await this.applyBackendServiceTag(socket, backendToken);
|
|
127
|
+
}
|
|
128
|
+
async getPublicKeyForValidation(backendTokenArg = this.optionsArg.backendToken) {
|
|
129
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
130
|
+
const socket = await this.connect();
|
|
131
|
+
const request = socket.createTypedRequest('getPublicKeyForValidation');
|
|
132
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
133
|
+
return response.publicKeyPem;
|
|
134
|
+
}
|
|
135
|
+
async getJwtIdBlocklist(backendTokenArg = this.optionsArg.backendToken) {
|
|
136
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
137
|
+
const socket = await this.connect();
|
|
138
|
+
const request = socket.createTypedRequest('pushOrGetJwtIdBlocklist');
|
|
139
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
140
|
+
return response.blockedJwtIds || [];
|
|
33
141
|
}
|
|
34
142
|
async loginWithEmailAndPassword(optionsArg) {
|
|
35
143
|
const socket = await this.connect();
|
|
36
144
|
const loginRequest = socket.createTypedRequest('loginWithEmailOrUsernameAndPassword');
|
|
37
|
-
const loginResponse = await loginRequest.fire({
|
|
145
|
+
const loginResponse = await this.raceWithStop(loginRequest.fire({
|
|
38
146
|
username: optionsArg.email,
|
|
39
147
|
password: optionsArg.password,
|
|
40
|
-
});
|
|
148
|
+
}));
|
|
41
149
|
if (loginResponse.twoFaNeeded) {
|
|
42
150
|
throw new IdpMfaRequiredError({
|
|
43
151
|
mfaChallengeToken: loginResponse.mfaChallengeToken,
|
|
@@ -48,12 +156,12 @@ export class IdpGlobalServerClient {
|
|
|
48
156
|
throw new Error('IdP login failed');
|
|
49
157
|
}
|
|
50
158
|
const refreshRequest = socket.createTypedRequest('refreshJwt');
|
|
51
|
-
const refreshResponse = await refreshRequest.fire({ refreshToken: loginResponse.refreshToken });
|
|
159
|
+
const refreshResponse = await this.raceWithStop(refreshRequest.fire({ refreshToken: loginResponse.refreshToken }));
|
|
52
160
|
if (!refreshResponse.jwt) {
|
|
53
161
|
throw new Error('IdP did not return a JWT');
|
|
54
162
|
}
|
|
55
163
|
const whoIsRequest = socket.createTypedRequest('whoIs');
|
|
56
|
-
const whoIsResponse = await whoIsRequest.fire({ jwt: refreshResponse.jwt });
|
|
164
|
+
const whoIsResponse = await this.raceWithStop(whoIsRequest.fire({ jwt: refreshResponse.jwt }));
|
|
57
165
|
return {
|
|
58
166
|
user: whoIsResponse.user,
|
|
59
167
|
jwt: refreshResponse.jwt,
|
|
@@ -70,5 +178,40 @@ export class IdpGlobalServerClient {
|
|
|
70
178
|
}
|
|
71
179
|
return baseUrl;
|
|
72
180
|
}
|
|
181
|
+
requireBackendToken(backendTokenArg) {
|
|
182
|
+
if (!backendTokenArg) {
|
|
183
|
+
throw new Error('backendToken is required for backend JWT validation APIs');
|
|
184
|
+
}
|
|
185
|
+
return backendTokenArg;
|
|
186
|
+
}
|
|
187
|
+
async applyBackendServiceTag(socketArg, backendTokenArg) {
|
|
188
|
+
await this.raceWithStop(socketArg.setTag('backend-service', {
|
|
189
|
+
backendToken: backendTokenArg,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
createConnectionDeferred() {
|
|
193
|
+
const deferred = plugins.smartpromise.defer();
|
|
194
|
+
deferred.promise.catch(() => undefined);
|
|
195
|
+
return deferred;
|
|
196
|
+
}
|
|
197
|
+
raceWithStop(promiseArg) {
|
|
198
|
+
promiseArg.catch(() => undefined);
|
|
199
|
+
if (this.stopping) {
|
|
200
|
+
return Promise.reject(new Error('IdpGlobalServerClient stopped'));
|
|
201
|
+
}
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
const stopReject = (errorArg) => reject(errorArg);
|
|
204
|
+
this.stopWaiters.add(stopReject);
|
|
205
|
+
promiseArg.then(resolve, reject).finally(() => {
|
|
206
|
+
this.stopWaiters.delete(stopReject);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
rejectStopWaiters(errorArg) {
|
|
211
|
+
for (const stopWaiter of this.stopWaiters) {
|
|
212
|
+
stopWaiter(errorArg);
|
|
213
|
+
}
|
|
214
|
+
this.stopWaiters.clear();
|
|
215
|
+
}
|
|
73
216
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFNeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBS1o7SUFKWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQW1DLENBQUM7SUFFNUYsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQztJQUFHLENBQUM7SUFFL0QsS0FBSyxDQUFDLE9BQU87UUFDbEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FB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
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBWVo7SUFYWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQscUJBQXFCLEdBQTZELEVBQUUsQ0FBQztJQUNyRixxQkFBcUIsR0FBZ0UsRUFBRSxDQUFDO0lBQ3hGLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN6QixvQkFBb0IsQ0FBNEM7SUFDaEUseUJBQXlCLENBQW1CO0lBQzVDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUNuRCxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLGFBQTRDLEVBQUU7UUFBOUMsZUFBVSxH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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idp.global/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Reusable browser and server SDK for idp.global authentication.",
|
|
6
6
|
"type": "module",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@api.global/typedrequest": "^3.3.0",
|
|
18
|
-
"@api.global/typedsocket": "^4.
|
|
19
|
-
"@idp.global/interfaces": "^
|
|
18
|
+
"@api.global/typedsocket": "^4.2.2",
|
|
19
|
+
"@idp.global/interfaces": "^7.0.0",
|
|
20
20
|
"@push.rocks/smartdata": "^7.1.7",
|
|
21
21
|
"@push.rocks/smartjson": "^6.0.1",
|
|
22
22
|
"@push.rocks/smartpromise": "^4.2.4",
|
package/readme.md
CHANGED
|
@@ -137,10 +137,11 @@ await idp.logout();
|
|
|
137
137
|
| --- | --- |
|
|
138
138
|
| Registration and login | `firstRegistration`, `afterRegistrationEmailClicked`, `setData`, `mobileNumberVerification`, `finishRegistration`, `loginWithUserNameAndPassword`, `loginWithEmail`, `loginWithEmailAfterToken`, `loginWithApiToken`, `resetPassword`, `setNewPassword`, `obtainDeviceId`, `attachDeviceId` |
|
|
139
139
|
| Tokens and OIDC | `obtainJwt`, `obtainOneTimeToken`, `prepareOidcAuthorization`, `completeOidcAuthorization` |
|
|
140
|
-
| User profile and sessions | `
|
|
141
|
-
| Organizations and
|
|
142
|
-
| Billing
|
|
143
|
-
|
|
|
140
|
+
| User profile and sessions | `getUserSessions`, `revokeSession`, `getUserActivity` |
|
|
141
|
+
| Organizations, members, and apps | `getOrganizationById`, `updateOrganization`, `deleteOrganization`, `getOrgRoleDefinitions`, `upsertOrgRoleDefinition`, `deleteOrgRoleDefinition`, `createInvitation`, `getOrgInvitations`, `getOrgMembers`, `cancelInvitation`, `resendInvitation`, `removeMember`, `updateMemberRoles`, `transferOwnership`, `getInvitationByToken`, `acceptInvitation`, `bulkCreateInvitations`, `getGlobalApps`, `getAppConnections`, `toggleAppConnection`, `updateAppRoleMappings` |
|
|
142
|
+
| Billing | `getBillingPlan`, `getBillingPlansForOrganizationId`, `getPaddleConfig` |
|
|
143
|
+
| Passport and alerts | `createPassportEnrollmentChallenge`, `completePassportEnrollment`, `getPassportDevices`, `revokePassportDevice`, `createPassportChallenge`, `approvePassportChallenge`, `rejectPassportChallenge`, `registerPassportPushToken`, `listPendingPassportChallenges`, `getPassportChallengeByHint`, `markPassportChallengeSeen`, `getPassportDashboard`, `listPassportAlerts`, `getPassportAlertByHint`, `markPassportAlertSeen`, `dismissPassportAlert`, `upsertAlertRule`, `getAlertRules`, `deleteAlertRule` |
|
|
144
|
+
| Global administration | `suspendUser`, `checkGlobalAdmin`, `getGlobalAppStats`, `createGlobalApp`, `updateGlobalApp`, `deleteGlobalApp`, `regenerateAppCredentials` |
|
|
144
145
|
|
|
145
146
|
## Server SDK
|
|
146
147
|
|
|
@@ -228,7 +229,28 @@ if (!authResult) {
|
|
|
228
229
|
console.log(authResult.account.role, authResult.authSource);
|
|
229
230
|
```
|
|
230
231
|
|
|
231
|
-
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. 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.
|
|
232
|
+
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.
|
|
233
|
+
|
|
234
|
+
Backend services can register for JWT validation updates after constructing a server client with a backend token:
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
const idpClient = new IdpGlobalServerClient({
|
|
238
|
+
baseUrl: process.env.IDP_URL,
|
|
239
|
+
backendToken: process.env.IDP_BACKEND_TOKEN,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
idpClient.onPublicKeyPush((publicKeyPem) => {
|
|
243
|
+
// update the local JWT verifier key cache
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
idpClient.onBlocklistPush((blockedJwtIds) => {
|
|
247
|
+
// update the local JWT ID blocklist
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
await idpClient.registerBackendService();
|
|
251
|
+
const publicKeyPem = await idpClient.getPublicKeyForValidation();
|
|
252
|
+
const blockedJwtIds = await idpClient.getJwtIdBlocklist();
|
|
253
|
+
```
|
|
232
254
|
|
|
233
255
|
### Server API Surface
|
|
234
256
|
|
|
@@ -236,7 +258,7 @@ In `auto` mode, the service tries local auth first when the account allows `loca
|
|
|
236
258
|
| --- | --- |
|
|
237
259
|
| `SmartdataAccountStore` | Smartdata-backed account persistence and local password verification. |
|
|
238
260
|
| `AccountAuthService` | Existing-account authentication orchestration for `local`, `idp.global`, and `auto`. |
|
|
239
|
-
| `IdpGlobalServerClient` | Typed-socket client for idp.global password login, JWT refresh,
|
|
261
|
+
| `IdpGlobalServerClient` | Typed-socket client for idp.global password login, JWT refresh, `whoIs` lookup, backend JWT validation fetches, and JWT key/blocklist pushes. |
|
|
240
262
|
| `PasswordHasher` | Static `hashPassword()` and `verifyPassword()` helpers using `scrypt:v1`. |
|
|
241
263
|
| `IdpSdkAccountDoc` | Smartdata document class backing persisted SDK accounts. |
|
|
242
264
|
| `setAccountDocSmartdataDb()` | Configure the active Smartdata DB for `IdpSdkAccountDoc`. Usually handled by `SmartdataAccountStore`. |
|
|
@@ -254,7 +276,7 @@ The server export includes these TypeScript types:
|
|
|
254
276
|
| `ICreateIdpSdkAccountOptions` | Input for account creation. |
|
|
255
277
|
| `IAuthenticateAccountOptions` | Input for `AccountAuthService.authenticate()`. |
|
|
256
278
|
| `IAuthenticatedAccountResult` | Successful auth result with account, auth source, and optional idp.global tokens. |
|
|
257
|
-
| `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl`; defaults to `https://idp.global`. |
|
|
279
|
+
| `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl` and `backendToken`; defaults to `https://idp.global`. |
|
|
258
280
|
| `IIdpPasswordAuthResult` | idp.global user, JWT, and refresh-token result. |
|
|
259
281
|
|
|
260
282
|
## Runtime Notes
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -72,14 +72,6 @@ export class IdpRequests {
|
|
|
72
72
|
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_FirstRegistration>('firstRegistrationRequest');
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
public get getUserData() {
|
|
76
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetUserData>('getUserData');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public get setUserData() {
|
|
80
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_SetUserData>('setUserData');
|
|
81
|
-
}
|
|
82
|
-
|
|
83
75
|
public get getUserSessions() {
|
|
84
76
|
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetUserSessions>('getUserSessions');
|
|
85
77
|
}
|
|
@@ -216,32 +208,108 @@ export class IdpRequests {
|
|
|
216
208
|
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_UpdateAppRoleMappings>('updateAppRoleMappings');
|
|
217
209
|
}
|
|
218
210
|
|
|
219
|
-
public get
|
|
220
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
211
|
+
public get getGlobalApps() {
|
|
212
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetGlobalApps>('getGlobalApps');
|
|
221
213
|
}
|
|
222
214
|
|
|
223
|
-
public get
|
|
224
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
215
|
+
public get getAppConnections() {
|
|
216
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetAppConnections>('getAppConnections');
|
|
225
217
|
}
|
|
226
218
|
|
|
227
|
-
public get
|
|
228
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
219
|
+
public get toggleAppConnection() {
|
|
220
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ToggleAppConnection>('toggleAppConnection');
|
|
229
221
|
}
|
|
230
222
|
|
|
231
|
-
public get
|
|
232
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
223
|
+
public get createPassportEnrollmentChallenge() {
|
|
224
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportEnrollmentChallenge>('createPassportEnrollmentChallenge');
|
|
233
225
|
}
|
|
234
226
|
|
|
235
|
-
public get
|
|
236
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
227
|
+
public get completePassportEnrollment() {
|
|
228
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CompletePassportEnrollment>('completePassportEnrollment');
|
|
237
229
|
}
|
|
238
230
|
|
|
239
|
-
public get
|
|
240
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
231
|
+
public get getPassportDevices() {
|
|
232
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDevices>('getPassportDevices');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public get revokePassportDevice() {
|
|
236
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RevokePassportDevice>('revokePassportDevice');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
public get createPassportChallenge() {
|
|
240
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportChallenge>('createPassportChallenge');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
public get approvePassportChallenge() {
|
|
244
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ApprovePassportChallenge>('approvePassportChallenge');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public get rejectPassportChallenge() {
|
|
248
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RejectPassportChallenge>('rejectPassportChallenge');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
public get registerPassportPushToken() {
|
|
252
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RegisterPassportPushToken>('registerPassportPushToken');
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public get listPendingPassportChallenges() {
|
|
256
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ListPendingPassportChallenges>('listPendingPassportChallenges');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
public get getPassportChallengeByHint() {
|
|
260
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportChallengeByHint>('getPassportChallengeByHint');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public get markPassportChallengeSeen() {
|
|
264
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportChallengeSeen>('markPassportChallengeSeen');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
public get getPassportDashboard() {
|
|
268
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDashboard>('getPassportDashboard');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
public get listPassportAlerts() {
|
|
272
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ListPassportAlerts>('listPassportAlerts');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
public get getPassportAlertByHint() {
|
|
276
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportAlertByHint>('getPassportAlertByHint');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
public get markPassportAlertSeen() {
|
|
280
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportAlertSeen>('markPassportAlertSeen');
|
|
241
281
|
}
|
|
242
282
|
|
|
243
|
-
public get
|
|
244
|
-
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.
|
|
283
|
+
public get dismissPassportAlert() {
|
|
284
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_DismissPassportAlert>('dismissPassportAlert');
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
public get upsertAlertRule() {
|
|
288
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_UpsertAlertRule>('upsertAlertRule');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public get getAlertRules() {
|
|
292
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetAlertRules>('getAlertRules');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
public get deleteAlertRule() {
|
|
296
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_DeleteAlertRule>('deleteAlertRule');
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
public get getBillingPlan() {
|
|
300
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetBillingPlan>('getBillingPlan');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
public get getBillingPlansForOrganizationId() {
|
|
304
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPlansForOrganizationId>('getBillingPlansForOrganizationId');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
public get getPaddleConfig() {
|
|
308
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPaddleConfig>('getPaddleConfig');
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
public get suspendUser() {
|
|
312
|
+
return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_SuspendUser>('suspendUser');
|
|
245
313
|
}
|
|
246
314
|
|
|
247
315
|
public get checkGlobalAdmin() {
|
|
@@ -2,6 +2,7 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
|
|
3
3
|
export interface IIdpGlobalServerClientOptions {
|
|
4
4
|
baseUrl?: string;
|
|
5
|
+
backendToken?: string;
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
export const defaultIdpGlobalBaseUrl = 'https://idp.global';
|
|
@@ -27,35 +28,158 @@ export class IdpMfaRequiredError extends Error {
|
|
|
27
28
|
export class IdpGlobalServerClient {
|
|
28
29
|
private typedrouter: any = new plugins.typedrequest.TypedRouter();
|
|
29
30
|
private typedsocket?: plugins.typedsocket.TypedSocket;
|
|
30
|
-
private typedsocketDeferred =
|
|
31
|
+
private typedsocketDeferred = this.createConnectionDeferred();
|
|
32
|
+
private publicKeyPushHandlers: Array<(publicKeyPemArg: string) => void | Promise<void>> = [];
|
|
33
|
+
private blocklistPushHandlers: Array<(blockedJwtIdsArg: string[]) => void | Promise<void>> = [];
|
|
34
|
+
private connectionGeneration = 0;
|
|
35
|
+
private pendingSocketPromise?: Promise<plugins.typedsocket.TypedSocket>;
|
|
36
|
+
private connectionAbortController?: AbortController;
|
|
37
|
+
private stopWaiters = new Set<(errorArg: Error) => void>();
|
|
38
|
+
private stopping = false;
|
|
31
39
|
|
|
32
|
-
constructor(private optionsArg: IIdpGlobalServerClientOptions = {}) {
|
|
40
|
+
constructor(private optionsArg: IIdpGlobalServerClientOptions = {}) {
|
|
41
|
+
this.typedrouter.addTypedHandler(
|
|
42
|
+
new plugins.typedrequest.TypedHandler<plugins.idpInterfaces.request.IReq_PushPublicKeyForValidation>(
|
|
43
|
+
'pushPublicKeyForValidation',
|
|
44
|
+
async (requestArg) => {
|
|
45
|
+
await Promise.all(this.publicKeyPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeyPem)));
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
);
|
|
50
|
+
this.typedrouter.addTypedHandler(
|
|
51
|
+
new plugins.typedrequest.TypedHandler<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>(
|
|
52
|
+
'pushOrGetJwtIdBlocklist',
|
|
53
|
+
async (requestArg) => {
|
|
54
|
+
if (requestArg.blockedJwtIds) {
|
|
55
|
+
await Promise.all(this.blocklistPushHandlers.map((handlerArg) => handlerArg(requestArg.blockedJwtIds!)));
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
}
|
|
33
62
|
|
|
34
63
|
public async connect(): Promise<plugins.typedsocket.TypedSocket> {
|
|
64
|
+
if (this.stopping) {
|
|
65
|
+
throw new Error('IdpGlobalServerClient is stopping');
|
|
66
|
+
}
|
|
35
67
|
if (this.typedsocketDeferred.claimed) {
|
|
36
68
|
return this.typedsocketDeferred.promise;
|
|
37
69
|
}
|
|
38
|
-
this.typedsocketDeferred
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
70
|
+
const deferred = this.typedsocketDeferred;
|
|
71
|
+
const generation = this.connectionGeneration;
|
|
72
|
+
deferred.claim();
|
|
73
|
+
let createdSocket: plugins.typedsocket.TypedSocket | undefined;
|
|
74
|
+
let socketPromise: Promise<plugins.typedsocket.TypedSocket> | undefined;
|
|
75
|
+
const connectionAbortController = new AbortController();
|
|
76
|
+
try {
|
|
77
|
+
this.connectionAbortController = connectionAbortController;
|
|
78
|
+
socketPromise = plugins.typedsocket.TypedSocket.createClient(
|
|
79
|
+
this.typedrouter,
|
|
80
|
+
this.getTypedRequestUrl(),
|
|
81
|
+
{ autoReconnect: true, abortSignal: connectionAbortController.signal },
|
|
82
|
+
);
|
|
83
|
+
this.pendingSocketPromise = socketPromise;
|
|
84
|
+
createdSocket = await this.raceWithStop(socketPromise);
|
|
85
|
+
if (generation !== this.connectionGeneration) {
|
|
86
|
+
await createdSocket.stop();
|
|
87
|
+
if (deferred.status === 'pending') {
|
|
88
|
+
deferred.reject(new Error('IdpGlobalServerClient stopped while connecting'));
|
|
89
|
+
}
|
|
90
|
+
return deferred.promise;
|
|
91
|
+
}
|
|
92
|
+
this.typedsocket = createdSocket;
|
|
93
|
+
deferred.resolve(createdSocket);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (generation === this.connectionGeneration && (!createdSocket || this.typedsocket === createdSocket)) {
|
|
96
|
+
this.typedsocket = undefined;
|
|
97
|
+
}
|
|
98
|
+
await createdSocket?.stop().catch(() => undefined);
|
|
99
|
+
if (deferred.status === 'pending') {
|
|
100
|
+
deferred.reject(error);
|
|
101
|
+
}
|
|
102
|
+
if (this.typedsocketDeferred === deferred) {
|
|
103
|
+
this.typedsocketDeferred = this.createConnectionDeferred();
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
} finally {
|
|
107
|
+
if (socketPromise && this.pendingSocketPromise === socketPromise) {
|
|
108
|
+
this.pendingSocketPromise = undefined;
|
|
109
|
+
}
|
|
110
|
+
if (this.connectionAbortController === connectionAbortController) {
|
|
111
|
+
this.connectionAbortController = undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return deferred.promise;
|
|
45
115
|
}
|
|
46
116
|
|
|
47
117
|
public async stop(): Promise<void> {
|
|
48
|
-
|
|
118
|
+
this.stopping = true;
|
|
119
|
+
this.connectionGeneration++;
|
|
120
|
+
const stopError = new Error('IdpGlobalServerClient stopped');
|
|
121
|
+
this.rejectStopWaiters(stopError);
|
|
122
|
+
const socket = this.typedsocket;
|
|
123
|
+
const pendingSocketPromise = this.pendingSocketPromise;
|
|
124
|
+
this.connectionAbortController?.abort();
|
|
125
|
+
this.connectionAbortController = undefined;
|
|
49
126
|
this.typedsocket = undefined;
|
|
127
|
+
if (this.typedsocketDeferred.status === 'pending' && this.typedsocketDeferred.claimed) {
|
|
128
|
+
this.typedsocketDeferred.reject(stopError);
|
|
129
|
+
}
|
|
130
|
+
await socket?.stop();
|
|
131
|
+
const pendingSocket = await pendingSocketPromise?.catch(() => undefined);
|
|
132
|
+
if (pendingSocket && pendingSocket !== socket) {
|
|
133
|
+
await pendingSocket.stop().catch(() => undefined);
|
|
134
|
+
}
|
|
135
|
+
this.typedsocketDeferred = this.createConnectionDeferred();
|
|
136
|
+
this.pendingSocketPromise = undefined;
|
|
137
|
+
this.stopping = false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public onPublicKeyPush(handlerArg: (publicKeyPemArg: string) => void | Promise<void>): () => void {
|
|
141
|
+
this.publicKeyPushHandlers.push(handlerArg);
|
|
142
|
+
return () => {
|
|
143
|
+
this.publicKeyPushHandlers = this.publicKeyPushHandlers.filter((handler) => handler !== handlerArg);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public onBlocklistPush(handlerArg: (blockedJwtIdsArg: string[]) => void | Promise<void>): () => void {
|
|
148
|
+
this.blocklistPushHandlers.push(handlerArg);
|
|
149
|
+
return () => {
|
|
150
|
+
this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
public async registerBackendService(backendTokenArg = this.optionsArg.backendToken): Promise<void> {
|
|
155
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
156
|
+
const socket = await this.connect();
|
|
157
|
+
await this.applyBackendServiceTag(socket, backendToken);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public async getPublicKeyForValidation(backendTokenArg = this.optionsArg.backendToken): Promise<string> {
|
|
161
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
162
|
+
const socket = await this.connect();
|
|
163
|
+
const request = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPublicKeyForValidation>('getPublicKeyForValidation');
|
|
164
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
165
|
+
return response.publicKeyPem;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
public async getJwtIdBlocklist(backendTokenArg = this.optionsArg.backendToken): Promise<string[]> {
|
|
169
|
+
const backendToken = this.requireBackendToken(backendTokenArg);
|
|
170
|
+
const socket = await this.connect();
|
|
171
|
+
const request = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>('pushOrGetJwtIdBlocklist');
|
|
172
|
+
const response = await this.raceWithStop(request.fire({ backendToken }));
|
|
173
|
+
return response.blockedJwtIds || [];
|
|
50
174
|
}
|
|
51
175
|
|
|
52
176
|
public async loginWithEmailAndPassword(optionsArg: { email: string; password: string }): Promise<IIdpPasswordAuthResult> {
|
|
53
177
|
const socket = await this.connect();
|
|
54
178
|
const loginRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_LoginWithEmailOrUsernameAndPassword>('loginWithEmailOrUsernameAndPassword');
|
|
55
|
-
const loginResponse = await loginRequest.fire({
|
|
179
|
+
const loginResponse = await this.raceWithStop(loginRequest.fire({
|
|
56
180
|
username: optionsArg.email,
|
|
57
181
|
password: optionsArg.password,
|
|
58
|
-
});
|
|
182
|
+
}));
|
|
59
183
|
if (loginResponse.twoFaNeeded) {
|
|
60
184
|
throw new IdpMfaRequiredError({
|
|
61
185
|
mfaChallengeToken: (loginResponse as any).mfaChallengeToken,
|
|
@@ -67,13 +191,13 @@ export class IdpGlobalServerClient {
|
|
|
67
191
|
}
|
|
68
192
|
|
|
69
193
|
const refreshRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_RefreshJwt>('refreshJwt');
|
|
70
|
-
const refreshResponse = await refreshRequest.fire({ refreshToken: loginResponse.refreshToken });
|
|
194
|
+
const refreshResponse = await this.raceWithStop(refreshRequest.fire({ refreshToken: loginResponse.refreshToken }));
|
|
71
195
|
if (!refreshResponse.jwt) {
|
|
72
196
|
throw new Error('IdP did not return a JWT');
|
|
73
197
|
}
|
|
74
198
|
|
|
75
199
|
const whoIsRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_WhoIs>('whoIs');
|
|
76
|
-
const whoIsResponse = await whoIsRequest.fire({ jwt: refreshResponse.jwt });
|
|
200
|
+
const whoIsResponse = await this.raceWithStop(whoIsRequest.fire({ jwt: refreshResponse.jwt }));
|
|
77
201
|
return {
|
|
78
202
|
user: whoIsResponse.user,
|
|
79
203
|
jwt: refreshResponse.jwt,
|
|
@@ -91,4 +215,47 @@ export class IdpGlobalServerClient {
|
|
|
91
215
|
}
|
|
92
216
|
return baseUrl;
|
|
93
217
|
}
|
|
218
|
+
|
|
219
|
+
private requireBackendToken(backendTokenArg?: string): string {
|
|
220
|
+
if (!backendTokenArg) {
|
|
221
|
+
throw new Error('backendToken is required for backend JWT validation APIs');
|
|
222
|
+
}
|
|
223
|
+
return backendTokenArg;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private async applyBackendServiceTag(
|
|
227
|
+
socketArg: plugins.typedsocket.TypedSocket,
|
|
228
|
+
backendTokenArg: string
|
|
229
|
+
): Promise<void> {
|
|
230
|
+
await this.raceWithStop(socketArg.setTag<plugins.idpInterfaces.tags.ITag_BackendService>('backend-service', {
|
|
231
|
+
backendToken: backendTokenArg,
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private createConnectionDeferred() {
|
|
236
|
+
const deferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
|
|
237
|
+
deferred.promise.catch(() => undefined);
|
|
238
|
+
return deferred;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private raceWithStop<T>(promiseArg: Promise<T>): Promise<T> {
|
|
242
|
+
promiseArg.catch(() => undefined);
|
|
243
|
+
if (this.stopping) {
|
|
244
|
+
return Promise.reject(new Error('IdpGlobalServerClient stopped'));
|
|
245
|
+
}
|
|
246
|
+
return new Promise<T>((resolve, reject) => {
|
|
247
|
+
const stopReject = (errorArg: Error) => reject(errorArg);
|
|
248
|
+
this.stopWaiters.add(stopReject);
|
|
249
|
+
promiseArg.then(resolve, reject).finally(() => {
|
|
250
|
+
this.stopWaiters.delete(stopReject);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private rejectStopWaiters(errorArg: Error): void {
|
|
256
|
+
for (const stopWaiter of this.stopWaiters) {
|
|
257
|
+
stopWaiter(errorArg);
|
|
258
|
+
}
|
|
259
|
+
this.stopWaiters.clear();
|
|
260
|
+
}
|
|
94
261
|
}
|