@pelican-identity/auth-core 1.2.44 → 1.2.46

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.
@@ -1,453 +0,0 @@
1
- import CryptoService from "../utilities/crypto";
2
- import QRCode from "qrcode";
3
- import { storeAuthSession, getAuthSession, clearAuthSession, } from "../utilities/storage";
4
- import { StateMachine } from "../utilities/stateMachine";
5
- import { Transport } from "../utilities/transport";
6
- import { APPLE_APP_STORE_URL, BASEURL, FALLBACK_URL, PLAY_STORE_URL, } from "../constants";
7
- export class PelicanAuthentication {
8
- constructor(config) {
9
- this.crypto = new CryptoService();
10
- this.stateMachine = new StateMachine();
11
- this.sessionId = "";
12
- this.sessionKey = null;
13
- this.MAX_POLLING_DURATION = 2 * 60 * 1000;
14
- this.INITIAL_DELAY = 2000;
15
- this.MAX_DELAY = 10000;
16
- this.pollingStartTime = 0;
17
- this.useWebSocket = true;
18
- this.deeplinkUrl = null;
19
- this.fallbackTimer = null;
20
- this.listeners = {};
21
- this.pollingTimeout = null;
22
- if (!config.publicKey)
23
- throw new Error("Missing publicKey");
24
- if (!config.projectId)
25
- throw new Error("Missing projectId");
26
- if (!config.authType)
27
- throw new Error("Missing authType");
28
- this.config = {
29
- continuousMode: false,
30
- forceQRCode: false,
31
- ...config,
32
- };
33
- this.stateMachine.subscribe((s) => this.emit("state", s));
34
- }
35
- on(event, cb) {
36
- var _a;
37
- (_a = this.listeners)[event] ?? (_a[event] = new Set());
38
- this.listeners[event].add(cb);
39
- return () => this.listeners[event].delete(cb);
40
- }
41
- async start() {
42
- if (this.config.authType !== "id-verification" &&
43
- this.config.authType !== "signup" &&
44
- this.config.authType !== "login") {
45
- this.fail(new Error("Invalid authType"));
46
- return;
47
- }
48
- if (!this.config.projectId) {
49
- this.fail(new Error("Missing projectId"));
50
- return;
51
- }
52
- if (!this.config.publicKey) {
53
- this.fail(new Error("Missing publicKey"));
54
- return;
55
- }
56
- if (this.stateMachine.current !== "idle")
57
- return;
58
- this.resetSession();
59
- clearAuthSession();
60
- this.stateMachine.transition("initializing");
61
- try {
62
- this.sessionKey = this.crypto.generateSymmetricKey();
63
- this.sessionId = crypto.randomUUID() + crypto.randomUUID();
64
- this.useWebSocket = this.shouldUseWebSocket();
65
- if (this.useWebSocket) {
66
- await this.startWebSocketFlow();
67
- }
68
- else {
69
- await this.startDeepLinkFlow();
70
- }
71
- }
72
- catch (err) {
73
- this.fail(err instanceof Error ? err : new Error("Start failed"));
74
- }
75
- }
76
- stop() {
77
- this.terminate(false);
78
- }
79
- openWebAuth() {
80
- if (!this.sessionKey || !this.sessionId) {
81
- this.fail(new Error("No active session. Call start() before openWebAuth()."));
82
- return;
83
- }
84
- const openerOrigin = window.location.origin;
85
- const urlParams = new URLSearchParams({
86
- projectId: this.config.projectId,
87
- publicKey: this.config.publicKey,
88
- authType: this.config.authType,
89
- sessionId: this.sessionId,
90
- sessionKey: this.sessionKey,
91
- origin: openerOrigin,
92
- });
93
- const authUrl = `https://vault.pelicanidentity.com/auth?${urlParams.toString()}`;
94
- const authWindow = window.open(authUrl, "pelican-auth", "width=480,height=640,left=400,top=100,resizable=no,scrollbars=no") ?? window.open(authUrl, "_blank");
95
- if (!authWindow) {
96
- this.fail(new Error("Unable to open authentication window. Please allow popups for this site and try again."));
97
- return;
98
- }
99
- this.detachVisibilityRecovery();
100
- this.transport?.close();
101
- this.transport = undefined;
102
- authWindow.focus();
103
- this.stateMachine.transition("awaiting-pair");
104
- const cleanup = () => {
105
- window.removeEventListener("message", handleMessage);
106
- clearInterval(closedPoller);
107
- };
108
- const handleMessage = (event) => {
109
- if (event.origin !== "https://vault.pelicanidentity.com")
110
- return;
111
- if (event.source !== authWindow)
112
- return;
113
- const { type, payload } = event.data ?? {};
114
- if (type === "pelican-auth-success") {
115
- console.log("Web auth success");
116
- cleanup();
117
- if (!payload?.cipher || !payload?.nonce) {
118
- this.fail(new Error("Invalid web auth payload"));
119
- this.restartIfContinuous();
120
- return;
121
- }
122
- try {
123
- const decrypted = this.crypto.decryptSymmetric({
124
- encrypted: { cipher: payload.cipher, nonce: payload.nonce },
125
- keyString: this.sessionKey,
126
- });
127
- if (!decrypted) {
128
- this.fail(new Error("Failed to decrypt web auth response"));
129
- this.restartIfContinuous();
130
- return;
131
- }
132
- const result = JSON.parse(decrypted);
133
- this.emit("success", result);
134
- this.stateMachine.transition("authenticated");
135
- this.restartIfContinuous();
136
- }
137
- catch {
138
- this.fail(new Error("Failed to decrypt web auth response"));
139
- this.restartIfContinuous();
140
- }
141
- }
142
- if (type === "pelican-auth-cancelled") {
143
- cleanup();
144
- this.fail(new Error("Authentication cancelled"));
145
- this.restartIfContinuous();
146
- }
147
- if (type === "pelican-auth-error") {
148
- cleanup();
149
- this.fail(new Error(payload?.message ?? "Web auth failed"));
150
- this.restartIfContinuous();
151
- }
152
- };
153
- window.addEventListener("message", handleMessage);
154
- const closedPoller = setInterval(() => {
155
- if (!authWindow.closed)
156
- return;
157
- cleanup();
158
- if (!["authenticated", "confirmed", "error"].includes(this.stateMachine.current)) {
159
- this.fail(new Error("Authentication window closed"));
160
- this.restartIfContinuous();
161
- }
162
- }, 500);
163
- }
164
- destroy() {
165
- this.detachVisibilityRecovery();
166
- this.clearBackupCheck();
167
- this.transport?.close();
168
- this.transport = undefined;
169
- this.listeners = {};
170
- }
171
- useQrInstead() {
172
- this.useWebSocket = true;
173
- this.emit("deeplink", "");
174
- this.stateMachine.transition("initializing");
175
- this.startWebSocketFlow();
176
- }
177
- useDeepLinkInstead() {
178
- this.useWebSocket = false;
179
- this.stateMachine.transition("initializing");
180
- this.startDeepLinkFlow();
181
- }
182
- shouldUseWebSocket() {
183
- const userAgent = navigator.userAgent;
184
- const isTablet = /(iPad|Android(?!.*Mobile))/i.test(userAgent);
185
- const isMobile = /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
186
- const useWebSocket = isMobile && !isTablet;
187
- return this.config.forceQRCode || !useWebSocket;
188
- }
189
- async startWebSocketFlow() {
190
- const { relayUrl, deeplinkUrl } = await this.fetchRelayUrl();
191
- this.transport = new Transport({
192
- onOpen: () => {
193
- this.transport.send({
194
- type: "register",
195
- sessionID: this.sessionId,
196
- ...this.config,
197
- });
198
- this.stateMachine.transition("awaiting-pair");
199
- },
200
- onMessage: (msg) => this.handleWebSocketMessage(msg),
201
- onError: (err) => {
202
- console.error("WebSocket error:", err);
203
- this.fail(new Error("WebSocket connection failed"));
204
- },
205
- });
206
- this.transport.connect(relayUrl);
207
- await this.emitQRCode(deeplinkUrl);
208
- }
209
- handleWebSocketMessage(msg) {
210
- switch (msg.type) {
211
- case "paired":
212
- this.stateMachine.transition("paired");
213
- this.transport.send({
214
- type: "authenticate",
215
- sessionID: this.sessionId,
216
- ...this.config,
217
- url: window.location.href,
218
- });
219
- return;
220
- case "phone-auth-success":
221
- this.handleAuthSuccess(msg);
222
- return;
223
- case "phone-terminated":
224
- this.fail(new Error("Authentication cancelled on device"));
225
- this.restartIfContinuous();
226
- return;
227
- case "confirmed":
228
- this.terminate(true);
229
- this.restartIfContinuous();
230
- return;
231
- }
232
- }
233
- handleAuthSuccess(msg) {
234
- if (!this.sessionKey || !msg.cipher || !msg.nonce) {
235
- this.fail(new Error("Invalid authentication payload"));
236
- this.restartIfContinuous();
237
- return;
238
- }
239
- try {
240
- const decrypted = this.crypto.decryptSymmetric({
241
- encrypted: { cipher: msg.cipher, nonce: msg.nonce },
242
- keyString: this.sessionKey,
243
- });
244
- if (!decrypted) {
245
- this.fail(new Error("Invalid authentication data"));
246
- this.restartIfContinuous();
247
- return;
248
- }
249
- const result = JSON.parse(decrypted);
250
- this.emit("success", result);
251
- this.stateMachine.transition("authenticated");
252
- this.transport?.send({
253
- type: "confirm",
254
- sessionID: this.sessionId,
255
- });
256
- }
257
- catch {
258
- this.fail(new Error("Failed to decrypt authentication data"));
259
- this.restartIfContinuous();
260
- }
261
- }
262
- async startDeepLinkFlow() {
263
- const { deeplinkUrl } = await this.fetchRelayUrl();
264
- if (this.sessionKey) {
265
- storeAuthSession(this.sessionId, this.sessionKey, 10 * 60000);
266
- }
267
- await this.emitDeepLink(deeplinkUrl);
268
- this.stateMachine.transition("awaiting-pair");
269
- }
270
- openDeepLink() {
271
- if (!this.deeplinkUrl) {
272
- this.fail(new Error("Deep link not found"));
273
- return;
274
- }
275
- const userAgent = navigator.userAgent;
276
- let fallbackUrl = FALLBACK_URL;
277
- if (/iPad|iPhone|iPod/.test(userAgent)) {
278
- fallbackUrl = APPLE_APP_STORE_URL;
279
- }
280
- else if (/android/i.test(userAgent)) {
281
- fallbackUrl = PLAY_STORE_URL;
282
- }
283
- const start = Date.now();
284
- this.fallbackTimer = setTimeout(() => {
285
- if (Date.now() - start < 3500) {
286
- window.location.href = fallbackUrl;
287
- }
288
- }, 3000);
289
- this.attachVisibilityRecovery();
290
- window.location.href = this.deeplinkUrl;
291
- }
292
- clearBackupCheck() {
293
- if (this.backupCheckTimeout) {
294
- clearTimeout(this.backupCheckTimeout);
295
- this.backupCheckTimeout = undefined;
296
- }
297
- }
298
- async checkSession() {
299
- const cached = getAuthSession();
300
- if (!cached) {
301
- this.fail(new Error("Authentication session not found"));
302
- this.restartIfContinuous();
303
- return;
304
- }
305
- this.stopPolling();
306
- this.pollingStartTime = Date.now();
307
- this.stateMachine.transition("awaiting-auth");
308
- let currentDelay = this.INITIAL_DELAY;
309
- const performCheck = async () => {
310
- if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {
311
- this.stopPolling();
312
- this.fail(new Error("Authentication timed out. Please try again."));
313
- return;
314
- }
315
- try {
316
- const res = await fetch(`${BASEURL}/session?session_id=${cached.sessionId}`);
317
- if (res.ok) {
318
- const data = await res.json();
319
- const decrypted = this.crypto.decryptSymmetric({
320
- encrypted: { cipher: data.cipher, nonce: data.nonce },
321
- keyString: cached.sessionKey,
322
- });
323
- if (!decrypted) {
324
- this.stopPolling();
325
- this.fail(new Error("Failed to decrypt session"));
326
- return;
327
- }
328
- this.stopPolling();
329
- this.clearBackupCheck();
330
- clearAuthSession();
331
- const result = JSON.parse(decrypted);
332
- this.emit("success", result);
333
- this.stateMachine.transition("authenticated");
334
- this.restartIfContinuous();
335
- return;
336
- }
337
- console.debug("Session not ready yet...");
338
- }
339
- catch (err) {
340
- console.debug("Network error during session check, retrying:", err);
341
- }
342
- if (this.stateMachine.current === "awaiting-auth") {
343
- this.pollingTimeout = setTimeout(() => {
344
- currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);
345
- performCheck();
346
- }, currentDelay);
347
- }
348
- };
349
- await performCheck();
350
- }
351
- stopPolling() {
352
- if (this.pollingTimeout) {
353
- clearTimeout(this.pollingTimeout);
354
- this.pollingTimeout = null;
355
- }
356
- }
357
- async emitQRCode(deeplinkUrl) {
358
- const embeddedUrl = `${deeplinkUrl}?sessionID=${encodeURIComponent(this.sessionId)}&sessionKey=${encodeURIComponent(this.sessionKey)}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${this.config.authType}&projectId=${encodeURIComponent(this.config.projectId)}`;
359
- const qr = await QRCode.toDataURL(embeddedUrl, {
360
- type: "image/png",
361
- scale: 3,
362
- color: { light: "#ffffff", dark: "#424242ff" },
363
- });
364
- this.emit("qr", qr);
365
- }
366
- async emitDeepLink(deeplinkUrl) {
367
- const deeplink = `${deeplinkUrl}?sessionID=${encodeURIComponent(this.sessionId)}&sessionKey=${encodeURIComponent(this.sessionKey)}&publicKey=${encodeURIComponent(this.config.publicKey)}&authType=${this.config.authType}&projectId=${encodeURIComponent(this.config.projectId)}`;
368
- this.deeplinkUrl = deeplink;
369
- this.emit("deeplink", deeplink);
370
- }
371
- attachVisibilityRecovery() {
372
- let fired = false;
373
- this.visibilityHandler = async () => {
374
- if (this.fallbackTimer) {
375
- clearTimeout(this.fallbackTimer);
376
- this.fallbackTimer = null;
377
- }
378
- if (document.visibilityState !== "visible")
379
- return;
380
- if (this.useWebSocket)
381
- return;
382
- if (fired)
383
- return;
384
- fired = true;
385
- await this.checkSession();
386
- };
387
- document.addEventListener("visibilitychange", this.visibilityHandler);
388
- }
389
- detachVisibilityRecovery() {
390
- if (this.visibilityHandler) {
391
- document.removeEventListener("visibilitychange", this.visibilityHandler);
392
- this.visibilityHandler = undefined;
393
- }
394
- }
395
- async fetchRelayUrl() {
396
- const { publicKey, projectId, authType } = this.config;
397
- const res = await fetch(`${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`);
398
- if (!res.ok) {
399
- const error = await res.text();
400
- throw new Error(error);
401
- }
402
- const json = await res.json();
403
- return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };
404
- }
405
- terminate(success) {
406
- this.clearBackupCheck();
407
- if (this.transport) {
408
- if (!success) {
409
- this.transport.send({
410
- type: "client-terminated",
411
- sessionID: this.sessionId,
412
- projectId: this.config.projectId,
413
- publicKey: this.config.publicKey,
414
- authType: this.config.authType,
415
- });
416
- }
417
- this.transport.close();
418
- this.transport = undefined;
419
- }
420
- clearAuthSession();
421
- this.resetSession();
422
- if (!this.config.continuousMode) {
423
- this.detachVisibilityRecovery();
424
- }
425
- this.stateMachine.transition(success ? "confirmed" : "idle");
426
- }
427
- restartIfContinuous() {
428
- if (this.config.continuousMode) {
429
- this.stateMachine.transition("idle");
430
- this.clearBackupCheck();
431
- this.transport?.close();
432
- this.transport = undefined;
433
- setTimeout(() => {
434
- this.start();
435
- }, 150);
436
- }
437
- else {
438
- this.stateMachine.transition("idle");
439
- }
440
- }
441
- resetSession() {
442
- this.sessionId = "";
443
- this.sessionKey = null;
444
- }
445
- emit(event, payload) {
446
- this.listeners[event]?.forEach((cb) => cb(payload));
447
- }
448
- fail(err) {
449
- this.emit("error", err);
450
- this.stateMachine.transition("error");
451
- }
452
- }
453
- //# sourceMappingURL=engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"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"}