@pelican-identity/auth-core 1.2.45 → 1.2.47

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/README.md CHANGED
@@ -141,9 +141,100 @@ interface IdentityResult {
141
141
  status: "Approved" | "Declined";
142
142
  document_type: string;
143
143
  };
144
+ /** JWT Token signed token */
145
+ token?: string;
144
146
  }
145
147
  ```
146
148
 
149
+ ## `token`
150
+
151
+ - A **JWT (JSON Web Token)** issued by Pelican after a successful user authentication or action approval.
152
+ - This token represents a **verified user interaction** and can be used to confirm identity and/or intent on your backend.
153
+
154
+ ---
155
+
156
+ ## Verification
157
+
158
+ To verify a Pelican token, your backend must send it to the Pelican Identity API.
159
+
160
+ ### Endpoint
161
+
162
+ ```
163
+ POST https://identityapi.pelicanidentity.com/verify-session
164
+ ```
165
+
166
+ ---
167
+
168
+ ### Headers
169
+
170
+ Include the following headers in your request:
171
+
172
+ - `x-public-key` — Your Pelican public API key
173
+
174
+ ---
175
+
176
+ ### Request Body
177
+
178
+ ```json
179
+ {
180
+ "token": "YOUR_PELICAN_JWT_TOKEN"
181
+ }
182
+ ```
183
+
184
+ ---
185
+
186
+ ### Example (Node.js)
187
+
188
+ ```ts
189
+ const response = await fetch(
190
+ "https://identityapi.pelicanidentity.com/verify-session",
191
+ {
192
+ method: "POST",
193
+ headers: {
194
+ "Content-Type": "application/json",
195
+ "x-public-key": process.env.PELICAN_PUBLIC_KEY,
196
+ },
197
+ body: JSON.stringify({
198
+ token: pelicanToken,
199
+ }),
200
+ },
201
+ );
202
+
203
+ const data = await response.json();
204
+ ```
205
+
206
+ ---
207
+
208
+ ### Response
209
+
210
+ A successful response will return a verified payload containing:
211
+
212
+ - `pelican_id ` — Pelican user identity details
213
+ - `verified` — Boolean indicating token validity
214
+ - `issued_at` — Timestamp of when the token was generated
215
+ - `expires_at` — Token expiration timestamp
216
+
217
+ ---
218
+
219
+ ### Example Response
220
+
221
+ ```json
222
+ {
223
+ "verified": true,
224
+ "pelican_id": "4dbde492db8f64aff80b1dd61754a84bdf2dc87eed1b19fec4cd66569856b134",
225
+ "issued_at": 1714483200,
226
+ "expires_at": 1714483500
227
+ }
228
+ ```
229
+
230
+ ---
231
+
232
+ ### Notes
233
+
234
+ - Always verify the token on your backend before trusting any user action.
235
+ - Tokens are **short-lived** and should not be reused.
236
+ - Never trust tokens directly from the client without verification.
237
+
147
238
  ---
148
239
 
149
240
  ## Troubleshooting
package/dist/index.d.mts CHANGED
@@ -100,6 +100,7 @@ interface IdentityResult {
100
100
  latitude: number;
101
101
  longitude: number;
102
102
  } | null;
103
+ token?: string;
103
104
  }
104
105
  interface PelicanWebAuthProps extends PelicanAuthConfig {
105
106
  onClose?: () => void;
package/dist/index.d.ts CHANGED
@@ -100,6 +100,7 @@ interface IdentityResult {
100
100
  latitude: number;
101
101
  longitude: number;
102
102
  } | null;
103
+ token?: string;
103
104
  }
104
105
  interface PelicanWebAuthProps extends PelicanAuthConfig {
105
106
  onClose?: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pelican-identity/auth-core",
3
- "version": "1.2.45",
3
+ "version": "1.2.47",
4
4
  "description": "Framework-agnostic authentication SDK for Pelican Identity",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAGpB,MAAM,gBAAgB,CAAC;AAgBxB,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAQxC,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAiB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAa;IAErC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAA8C;IAEnE,OAAO,CAAC,SAAS,CAEV;IAEP,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAEzC,MAAM,EAAE,iBAAiB;IAgBrC,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACpC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAOhC,KAAK;IA2CX,IAAI;IAIJ,WAAW;IA6HX,OAAO;IAQP,YAAY;IAQZ,kBAAkB;IAOlB,OAAO,CAAC,kBAAkB;YAeZ,kBAAkB;IAuBhC,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,iBAAiB;YAqCX,iBAAiB;IAYxB,YAAY;IA6BnB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc,CAA8C;YAEtD,YAAY;IAsE1B,OAAO,CAAC,WAAW;YASL,UAAU;YAkBV,YAAY;IAe1B,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,wBAAwB;YASlB,aAAa;IAkB3B,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,IAAI;CAIb"}
@@ -1,457 +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
- this.fail(new Error("Pelican Vault not installed on your device"));
288
- setTimeout(() => {
289
- this.terminate(false);
290
- }, 2000);
291
- }
292
- }, 3000);
293
- this.attachVisibilityRecovery();
294
- window.location.href = this.deeplinkUrl;
295
- }
296
- clearBackupCheck() {
297
- if (this.backupCheckTimeout) {
298
- clearTimeout(this.backupCheckTimeout);
299
- this.backupCheckTimeout = undefined;
300
- }
301
- }
302
- async checkSession() {
303
- const cached = getAuthSession();
304
- if (!cached) {
305
- this.fail(new Error("Authentication session not found"));
306
- this.restartIfContinuous();
307
- return;
308
- }
309
- this.stopPolling();
310
- this.pollingStartTime = Date.now();
311
- this.stateMachine.transition("awaiting-auth");
312
- let currentDelay = this.INITIAL_DELAY;
313
- const performCheck = async () => {
314
- if (Date.now() - this.pollingStartTime > this.MAX_POLLING_DURATION) {
315
- this.stopPolling();
316
- this.fail(new Error("Authentication timed out. Please try again."));
317
- return;
318
- }
319
- try {
320
- const res = await fetch(`${BASEURL}/session?session_id=${cached.sessionId}`);
321
- if (res.ok) {
322
- const data = await res.json();
323
- const decrypted = this.crypto.decryptSymmetric({
324
- encrypted: { cipher: data.cipher, nonce: data.nonce },
325
- keyString: cached.sessionKey,
326
- });
327
- if (!decrypted) {
328
- this.stopPolling();
329
- this.fail(new Error("Failed to decrypt session"));
330
- return;
331
- }
332
- this.stopPolling();
333
- this.clearBackupCheck();
334
- clearAuthSession();
335
- const result = JSON.parse(decrypted);
336
- this.emit("success", result);
337
- this.stateMachine.transition("authenticated");
338
- this.restartIfContinuous();
339
- return;
340
- }
341
- console.debug("Session not ready yet...");
342
- }
343
- catch (err) {
344
- console.debug("Network error during session check, retrying:", err);
345
- }
346
- if (this.stateMachine.current === "awaiting-auth") {
347
- this.pollingTimeout = setTimeout(() => {
348
- currentDelay = Math.min(currentDelay * 1.5, this.MAX_DELAY);
349
- performCheck();
350
- }, currentDelay);
351
- }
352
- };
353
- await performCheck();
354
- }
355
- stopPolling() {
356
- if (this.pollingTimeout) {
357
- clearTimeout(this.pollingTimeout);
358
- this.pollingTimeout = null;
359
- }
360
- }
361
- async emitQRCode(deeplinkUrl) {
362
- 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)}`;
363
- const qr = await QRCode.toDataURL(embeddedUrl, {
364
- type: "image/png",
365
- scale: 3,
366
- color: { light: "#ffffff", dark: "#424242ff" },
367
- });
368
- this.emit("qr", qr);
369
- }
370
- async emitDeepLink(deeplinkUrl) {
371
- 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)}`;
372
- this.deeplinkUrl = deeplink;
373
- this.emit("deeplink", deeplink);
374
- }
375
- attachVisibilityRecovery() {
376
- let fired = false;
377
- this.visibilityHandler = async () => {
378
- if (this.fallbackTimer) {
379
- clearTimeout(this.fallbackTimer);
380
- this.fallbackTimer = null;
381
- }
382
- if (document.visibilityState !== "visible")
383
- return;
384
- if (this.useWebSocket)
385
- return;
386
- if (fired)
387
- return;
388
- fired = true;
389
- await this.checkSession();
390
- };
391
- document.addEventListener("visibilitychange", this.visibilityHandler);
392
- }
393
- detachVisibilityRecovery() {
394
- if (this.visibilityHandler) {
395
- document.removeEventListener("visibilitychange", this.visibilityHandler);
396
- this.visibilityHandler = undefined;
397
- }
398
- }
399
- async fetchRelayUrl() {
400
- const { publicKey, projectId, authType } = this.config;
401
- const res = await fetch(`${BASEURL}/relay?public_key=${publicKey}&auth_type=${authType}&project_id=${projectId}`);
402
- if (!res.ok) {
403
- const error = await res.text();
404
- throw new Error(error);
405
- }
406
- const json = await res.json();
407
- return { deeplinkUrl: json.deeplink_url, relayUrl: json.relay_url };
408
- }
409
- terminate(success) {
410
- this.clearBackupCheck();
411
- if (this.transport) {
412
- if (!success) {
413
- this.transport.send({
414
- type: "client-terminated",
415
- sessionID: this.sessionId,
416
- projectId: this.config.projectId,
417
- publicKey: this.config.publicKey,
418
- authType: this.config.authType,
419
- });
420
- }
421
- this.transport.close();
422
- this.transport = undefined;
423
- }
424
- clearAuthSession();
425
- this.resetSession();
426
- if (!this.config.continuousMode) {
427
- this.detachVisibilityRecovery();
428
- }
429
- this.stateMachine.transition(success ? "confirmed" : "idle");
430
- }
431
- restartIfContinuous() {
432
- if (this.config.continuousMode) {
433
- this.stateMachine.transition("idle");
434
- this.clearBackupCheck();
435
- this.transport?.close();
436
- this.transport = undefined;
437
- setTimeout(() => {
438
- this.start();
439
- }, 150);
440
- }
441
- else {
442
- this.stateMachine.transition("idle");
443
- }
444
- }
445
- resetSession() {
446
- this.sessionId = "";
447
- this.sessionKey = null;
448
- }
449
- emit(event, payload) {
450
- this.listeners[event]?.forEach((cb) => cb(payload));
451
- }
452
- fail(err) {
453
- this.emit("error", err);
454
- this.stateMachine.transition("error");
455
- }
456
- }
457
- //# 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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"}