@aurabase/auth 0.7.1 → 0.7.2

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/dist/index.cjs CHANGED
@@ -52,14 +52,34 @@ var AuthAdminService = class extends core.BaseService {
52
52
  }
53
53
  /**
54
54
  * Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
55
- * Accepte soit `generateLink(userId, type)` soit `generateLink({ userId, type })`.
55
+ * Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
56
56
  */
57
57
  async generateLink(userIdOrParams, type) {
58
58
  let resolvedUserId;
59
59
  let resolvedType;
60
+ let resolvedRedirectTo;
60
61
  if (typeof userIdOrParams === "object" && userIdOrParams !== null) {
61
62
  resolvedUserId = userIdOrParams.userId ?? userIdOrParams.user_id;
62
63
  resolvedType = userIdOrParams.type ?? type;
64
+ resolvedRedirectTo = userIdOrParams.redirectTo ?? userIdOrParams.redirect_to;
65
+ if (!resolvedUserId && userIdOrParams.email) {
66
+ const email = userIdOrParams.email.trim().toLowerCase();
67
+ const searchRes = await this.listUsers({ search: email, limit: 1 });
68
+ const usersList = Array.isArray(searchRes.data) ? searchRes.data : [];
69
+ if (usersList[0]?.id) {
70
+ resolvedUserId = usersList[0].id;
71
+ } else {
72
+ return {
73
+ data: null,
74
+ error: new core.AuraError(404, {
75
+ error: {
76
+ code: "USER_NOT_FOUND",
77
+ message: `No user found with email "${email}".`
78
+ }
79
+ })
80
+ };
81
+ }
82
+ }
63
83
  } else if (typeof userIdOrParams === "string") {
64
84
  resolvedUserId = userIdOrParams;
65
85
  resolvedType = type;
@@ -70,7 +90,7 @@ var AuthAdminService = class extends core.BaseService {
70
90
  error: new core.AuraError(400, {
71
91
  error: {
72
92
  code: "INVALID_ARGUMENT",
73
- message: "userId must be a non-empty string (UUID). Usage: generateLink(userId, type) or generateLink({ userId, type })."
93
+ message: "userId or email is required. Usage: generateLink({ email, type }) or generateLink(userId, type)."
74
94
  }
75
95
  })
76
96
  };
@@ -86,7 +106,15 @@ var AuthAdminService = class extends core.BaseService {
86
106
  })
87
107
  };
88
108
  }
89
- return this.request("POST", `${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`, { type: resolvedType });
109
+ const body = { type: resolvedType };
110
+ if (resolvedRedirectTo) {
111
+ body.redirect_to = resolvedRedirectTo;
112
+ }
113
+ return this.request(
114
+ "POST",
115
+ `${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`,
116
+ body
117
+ );
90
118
  }
91
119
  /**
92
120
  * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
@@ -1507,14 +1535,28 @@ var AuthService = class extends core.BaseService {
1507
1535
  const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
1508
1536
  return this.regenerateRecoveryCodes(code);
1509
1537
  },
1510
- factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, { mfa_token: mfaToken }),
1538
+ factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
1539
+ mfa_token: mfaToken
1540
+ }),
1511
1541
  sms: {
1512
1542
  setup: (phone) => this.request("POST", `${this.prefix}/mfa/sms/setup`, { phone }),
1513
- verifySetup: (code) => this.request("POST", `${this.prefix}/mfa/sms/setup/verify`, { code }),
1514
- send: (mfaToken) => this.request("POST", `${this.prefix}/mfa/sms/send`, {
1515
- mfa_token: mfaToken
1516
- }),
1517
- remove: (password) => this.request("DELETE", `${this.prefix}/mfa/sms`, { password })
1543
+ verifySetup: (code) => this.request(
1544
+ "POST",
1545
+ `${this.prefix}/mfa/sms/setup/verify`,
1546
+ { code }
1547
+ ),
1548
+ send: (mfaToken) => this.request(
1549
+ "POST",
1550
+ `${this.prefix}/mfa/sms/send`,
1551
+ {
1552
+ mfa_token: mfaToken
1553
+ }
1554
+ ),
1555
+ remove: (password) => this.request(
1556
+ "DELETE",
1557
+ `${this.prefix}/mfa/sms`,
1558
+ { password }
1559
+ )
1518
1560
  },
1519
1561
  webauthn: {
1520
1562
  register: (params) => this.webauthnRegister(params),
@@ -1528,6 +1570,13 @@ var AuthService = class extends core.BaseService {
1528
1570
  }
1529
1571
  };
1530
1572
  }
1573
+ /**
1574
+ * API d'administration de l'authentification (alias vers `client.authAdmin`).
1575
+ * Exige une clé `service_role` (côté serveur uniquement).
1576
+ */
1577
+ get admin() {
1578
+ return this.client.authAdmin;
1579
+ }
1531
1580
  webauthnIndisponible() {
1532
1581
  return {
1533
1582
  data: null,
@@ -1552,7 +1601,7 @@ var AuthService = class extends core.BaseService {
1552
1601
  `${this.prefix}/mfa/webauthn/register/start`,
1553
1602
  { friendly_name: params?.friendlyName }
1554
1603
  );
1555
- if (!debut.data) return debut;
1604
+ if (!debut.data) return { data: null, error: debut.error };
1556
1605
  let cred;
1557
1606
  try {
1558
1607
  cred = await conteneur.create(creationOptionsFromJson(debut.data.options));
@@ -1560,10 +1609,14 @@ var AuthService = class extends core.BaseService {
1560
1609
  return this.webauthnAnnule(e);
1561
1610
  }
1562
1611
  if (!cred) return this.webauthnAnnule(new Error("no credential returned"));
1563
- return this.request("POST", `${this.prefix}/mfa/webauthn/register/finish`, {
1564
- credential: attestationToJson(cred),
1565
- friendly_name: params?.friendlyName
1566
- });
1612
+ return this.request(
1613
+ "POST",
1614
+ `${this.prefix}/mfa/webauthn/register/finish`,
1615
+ {
1616
+ credential: attestationToJson(cred),
1617
+ friendly_name: params?.friendlyName
1618
+ }
1619
+ );
1567
1620
  }
1568
1621
  /**
1569
1622
  * Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
@@ -1577,7 +1630,7 @@ var AuthService = class extends core.BaseService {
1577
1630
  `${this.prefix}/mfa/webauthn/verify/start`,
1578
1631
  { mfa_token: params.mfaToken }
1579
1632
  );
1580
- if (!debut.data) return debut;
1633
+ if (!debut.data) return { data: null, error: debut.error };
1581
1634
  let cred;
1582
1635
  try {
1583
1636
  cred = await conteneur.get(requestOptionsFromJson(debut.data.options));
package/dist/index.d.cts CHANGED
@@ -72,12 +72,15 @@ declare class AuthAdminService extends BaseService {
72
72
  unbanUser(userId: string): Promise<AuraResponse<null>>;
73
73
  /**
74
74
  * Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
75
- * Accepte soit `generateLink(userId, type)` soit `generateLink({ userId, type })`.
75
+ * Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
76
76
  */
77
77
  generateLink(userIdOrParams: string | {
78
78
  userId?: string;
79
79
  user_id?: string;
80
+ email?: string;
80
81
  type: GenerateLinkType;
82
+ redirectTo?: string;
83
+ redirect_to?: string;
81
84
  }, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
82
85
  /**
83
86
  * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
@@ -573,6 +576,11 @@ declare class AuthService extends BaseService {
573
576
  }>>;
574
577
  };
575
578
  };
579
+ /**
580
+ * API d'administration de l'authentification (alias vers `client.authAdmin`).
581
+ * Exige une clé `service_role` (côté serveur uniquement).
582
+ */
583
+ get admin(): AuthAdminService;
576
584
  private webauthnIndisponible;
577
585
  /**
578
586
  * Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
package/dist/index.d.ts CHANGED
@@ -72,12 +72,15 @@ declare class AuthAdminService extends BaseService {
72
72
  unbanUser(userId: string): Promise<AuraResponse<null>>;
73
73
  /**
74
74
  * Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
75
- * Accepte soit `generateLink(userId, type)` soit `generateLink({ userId, type })`.
75
+ * Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
76
76
  */
77
77
  generateLink(userIdOrParams: string | {
78
78
  userId?: string;
79
79
  user_id?: string;
80
+ email?: string;
80
81
  type: GenerateLinkType;
82
+ redirectTo?: string;
83
+ redirect_to?: string;
81
84
  }, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
82
85
  /**
83
86
  * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
@@ -573,6 +576,11 @@ declare class AuthService extends BaseService {
573
576
  }>>;
574
577
  };
575
578
  };
579
+ /**
580
+ * API d'administration de l'authentification (alias vers `client.authAdmin`).
581
+ * Exige une clé `service_role` (côté serveur uniquement).
582
+ */
583
+ get admin(): AuthAdminService;
576
584
  private webauthnIndisponible;
577
585
  /**
578
586
  * Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
package/dist/index.js CHANGED
@@ -50,14 +50,34 @@ var AuthAdminService = class extends BaseService {
50
50
  }
51
51
  /**
52
52
  * Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
53
- * Accepte soit `generateLink(userId, type)` soit `generateLink({ userId, type })`.
53
+ * Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
54
54
  */
55
55
  async generateLink(userIdOrParams, type) {
56
56
  let resolvedUserId;
57
57
  let resolvedType;
58
+ let resolvedRedirectTo;
58
59
  if (typeof userIdOrParams === "object" && userIdOrParams !== null) {
59
60
  resolvedUserId = userIdOrParams.userId ?? userIdOrParams.user_id;
60
61
  resolvedType = userIdOrParams.type ?? type;
62
+ resolvedRedirectTo = userIdOrParams.redirectTo ?? userIdOrParams.redirect_to;
63
+ if (!resolvedUserId && userIdOrParams.email) {
64
+ const email = userIdOrParams.email.trim().toLowerCase();
65
+ const searchRes = await this.listUsers({ search: email, limit: 1 });
66
+ const usersList = Array.isArray(searchRes.data) ? searchRes.data : [];
67
+ if (usersList[0]?.id) {
68
+ resolvedUserId = usersList[0].id;
69
+ } else {
70
+ return {
71
+ data: null,
72
+ error: new AuraError(404, {
73
+ error: {
74
+ code: "USER_NOT_FOUND",
75
+ message: `No user found with email "${email}".`
76
+ }
77
+ })
78
+ };
79
+ }
80
+ }
61
81
  } else if (typeof userIdOrParams === "string") {
62
82
  resolvedUserId = userIdOrParams;
63
83
  resolvedType = type;
@@ -68,7 +88,7 @@ var AuthAdminService = class extends BaseService {
68
88
  error: new AuraError(400, {
69
89
  error: {
70
90
  code: "INVALID_ARGUMENT",
71
- message: "userId must be a non-empty string (UUID). Usage: generateLink(userId, type) or generateLink({ userId, type })."
91
+ message: "userId or email is required. Usage: generateLink({ email, type }) or generateLink(userId, type)."
72
92
  }
73
93
  })
74
94
  };
@@ -84,7 +104,15 @@ var AuthAdminService = class extends BaseService {
84
104
  })
85
105
  };
86
106
  }
87
- return this.request("POST", `${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`, { type: resolvedType });
107
+ const body = { type: resolvedType };
108
+ if (resolvedRedirectTo) {
109
+ body.redirect_to = resolvedRedirectTo;
110
+ }
111
+ return this.request(
112
+ "POST",
113
+ `${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`,
114
+ body
115
+ );
88
116
  }
89
117
  /**
90
118
  * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
@@ -1505,14 +1533,28 @@ var AuthService = class extends BaseService {
1505
1533
  const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
1506
1534
  return this.regenerateRecoveryCodes(code);
1507
1535
  },
1508
- factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, { mfa_token: mfaToken }),
1536
+ factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
1537
+ mfa_token: mfaToken
1538
+ }),
1509
1539
  sms: {
1510
1540
  setup: (phone) => this.request("POST", `${this.prefix}/mfa/sms/setup`, { phone }),
1511
- verifySetup: (code) => this.request("POST", `${this.prefix}/mfa/sms/setup/verify`, { code }),
1512
- send: (mfaToken) => this.request("POST", `${this.prefix}/mfa/sms/send`, {
1513
- mfa_token: mfaToken
1514
- }),
1515
- remove: (password) => this.request("DELETE", `${this.prefix}/mfa/sms`, { password })
1541
+ verifySetup: (code) => this.request(
1542
+ "POST",
1543
+ `${this.prefix}/mfa/sms/setup/verify`,
1544
+ { code }
1545
+ ),
1546
+ send: (mfaToken) => this.request(
1547
+ "POST",
1548
+ `${this.prefix}/mfa/sms/send`,
1549
+ {
1550
+ mfa_token: mfaToken
1551
+ }
1552
+ ),
1553
+ remove: (password) => this.request(
1554
+ "DELETE",
1555
+ `${this.prefix}/mfa/sms`,
1556
+ { password }
1557
+ )
1516
1558
  },
1517
1559
  webauthn: {
1518
1560
  register: (params) => this.webauthnRegister(params),
@@ -1526,6 +1568,13 @@ var AuthService = class extends BaseService {
1526
1568
  }
1527
1569
  };
1528
1570
  }
1571
+ /**
1572
+ * API d'administration de l'authentification (alias vers `client.authAdmin`).
1573
+ * Exige une clé `service_role` (côté serveur uniquement).
1574
+ */
1575
+ get admin() {
1576
+ return this.client.authAdmin;
1577
+ }
1529
1578
  webauthnIndisponible() {
1530
1579
  return {
1531
1580
  data: null,
@@ -1550,7 +1599,7 @@ var AuthService = class extends BaseService {
1550
1599
  `${this.prefix}/mfa/webauthn/register/start`,
1551
1600
  { friendly_name: params?.friendlyName }
1552
1601
  );
1553
- if (!debut.data) return debut;
1602
+ if (!debut.data) return { data: null, error: debut.error };
1554
1603
  let cred;
1555
1604
  try {
1556
1605
  cred = await conteneur.create(creationOptionsFromJson(debut.data.options));
@@ -1558,10 +1607,14 @@ var AuthService = class extends BaseService {
1558
1607
  return this.webauthnAnnule(e);
1559
1608
  }
1560
1609
  if (!cred) return this.webauthnAnnule(new Error("no credential returned"));
1561
- return this.request("POST", `${this.prefix}/mfa/webauthn/register/finish`, {
1562
- credential: attestationToJson(cred),
1563
- friendly_name: params?.friendlyName
1564
- });
1610
+ return this.request(
1611
+ "POST",
1612
+ `${this.prefix}/mfa/webauthn/register/finish`,
1613
+ {
1614
+ credential: attestationToJson(cred),
1615
+ friendly_name: params?.friendlyName
1616
+ }
1617
+ );
1565
1618
  }
1566
1619
  /**
1567
1620
  * Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
@@ -1575,7 +1628,7 @@ var AuthService = class extends BaseService {
1575
1628
  `${this.prefix}/mfa/webauthn/verify/start`,
1576
1629
  { mfa_token: params.mfaToken }
1577
1630
  );
1578
- if (!debut.data) return debut;
1631
+ if (!debut.data) return { data: null, error: debut.error };
1579
1632
  let cred;
1580
1633
  try {
1581
1634
  cred = await conteneur.get(requestOptionsFromJson(debut.data.options));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurabase/auth",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Service d'authentification du SDK Aurabase (sessions, OAuth/PKCE, MFA, magic link, OTP, admin)",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -46,7 +46,7 @@
46
46
  "authentication"
47
47
  ],
48
48
  "dependencies": {
49
- "@aurabase/core": "0.7.1"
49
+ "@aurabase/core": "0.7.2"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/node": "20.14.15",