@aurabase/auth 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,46 @@
1
- import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, OAuthSignInObjectOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
1
+ import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, OAuthSignInObjectOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaFactorType, PasskeyRegisterResult, PasskeyInfo, MfaChallenge } from '@aurabase/core';
2
2
 
3
+ interface ImpersonationResult {
4
+ access_token: string;
5
+ token_type: 'Bearer';
6
+ expires_in: number;
7
+ act: {
8
+ sub: string;
9
+ };
10
+ user: AdminUser;
11
+ }
12
+ interface ImportUserInput {
13
+ email: string;
14
+ emailVerified?: boolean;
15
+ /** bcrypt (`$2a$`, `$2b$`, `$2y$`) or argon2id hash of the original password. */
16
+ passwordHash?: string;
17
+ name?: string;
18
+ userMetadata?: Record<string, unknown>;
19
+ appMetadata?: Record<string, unknown>;
20
+ }
21
+ interface ImportUsersReport {
22
+ created: number;
23
+ skipped: number;
24
+ errors: number;
25
+ report: Array<{
26
+ index: number;
27
+ email: string;
28
+ status: 'created' | 'skipped' | 'error';
29
+ id?: string;
30
+ error?: string;
31
+ }>;
32
+ }
33
+ interface SigningKeysInfo {
34
+ jwks_url: string;
35
+ issuer: string | null;
36
+ keys: Array<{
37
+ kid: string;
38
+ status: 'active' | 'previous';
39
+ issuer: string;
40
+ created_at: string;
41
+ jwk: Record<string, unknown>;
42
+ }>;
43
+ }
3
44
  declare class AuthAdminService extends BaseService {
4
45
  /**
5
46
  * Préfixe des routes de ce service. Aucun identifiant de projet : il est injecté par
@@ -31,8 +72,38 @@ declare class AuthAdminService extends BaseService {
31
72
  unbanUser(userId: string): Promise<AuraResponse<null>>;
32
73
  /**
33
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 })`.
34
76
  */
35
- generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
77
+ generateLink(userIdOrParams: string | {
78
+ userId?: string;
79
+ user_id?: string;
80
+ type: GenerateLinkType;
81
+ }, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
82
+ /**
83
+ * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
84
+ * avec le claim `act: { sub }`. Pas de refresh token, journalisé (`admin_impersonation`).
85
+ * Un compte `owner`/`admin` exige `allowPrivileged: true` ET une `reason`.
86
+ */
87
+ impersonate(userId: string, options?: {
88
+ reason?: string;
89
+ ttlSeconds?: number;
90
+ allowPrivileged?: boolean;
91
+ }): Promise<AuraResponse<ImpersonationResult>>;
92
+ /**
93
+ * Import en masse (AUTH-037) : jusqu'a 1000 utilisateurs par appel, avec hash bcrypt ou argon2id.
94
+ * Rapport ligne par ligne ; une ligne en erreur n'arrete pas les autres.
95
+ */
96
+ importUsers(users: ImportUserInput[]): Promise<AuraResponse<ImportUsersReport>>;
97
+ /** Cles de signature du projet (active + previous), URL du JWKS et emetteur (`iss`). */
98
+ listSigningKeys(): Promise<AuraResponse<SigningKeysInfo>>;
99
+ /** Rotation : une nouvelle cle signe les nouveaux jetons, l'ancienne reste publiee 24 h. */
100
+ rotateSigningKey(): Promise<AuraResponse<{
101
+ kid: string;
102
+ }>>;
103
+ /** Revoque une ancienne cle compromise (retiree du JWKS, jetons refuses). */
104
+ revokeSigningKey(kid: string): Promise<AuraResponse<{
105
+ revoked: string;
106
+ }>>;
36
107
  /**
37
108
  * Statistiques des utilisateurs : total, vérifiés, bannis, avec MFA et nouveaux sur 7 jours.
38
109
  */
@@ -170,6 +241,8 @@ interface AuthServiceOptions {
170
241
  * `true` en navigateur, no-op hors navigateur. Voir `_detectSessionInUrl`.
171
242
  */
172
243
  detectSessionInUrl?: boolean;
244
+ /** AUTH-015 — flux OAuth par défaut (option `auth.flowType` de `createClient`). */
245
+ flowType?: 'pkce' | 'implicit';
173
246
  }
174
247
  /**
175
248
  * Garde de type discriminant `LoginResponse = TokenPair | MfaChallenge` (LOT 3, 3.4).
@@ -178,12 +251,30 @@ interface AuthServiceOptions {
178
251
  * la même vérification structurelle (`mfa_required === true`).
179
252
  */
180
253
  declare function isMfaChallenge(v: unknown): v is MfaChallenge;
254
+ /** Paramètres de `auth.mfa.webauthn.register`. */
255
+ interface WebAuthnRegisterParams {
256
+ /** Nom affiché dans la liste des facteurs (« MacBook Touch ID »). */
257
+ friendlyName?: string;
258
+ /** Conteneur de credentials à utiliser à la place de `navigator.credentials` (tests, WebView). */
259
+ credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
260
+ }
261
+ /** Paramètres de `auth.mfa.webauthn.verify`. */
262
+ interface WebAuthnVerifyParams {
263
+ /** `mfaToken` du défi renvoyé par `signIn`. */
264
+ mfaToken: string;
265
+ credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
266
+ }
181
267
  declare class AuthService extends BaseService {
182
268
  private _stateListeners;
183
269
  private _sessionManager;
184
270
  private _applyingRemote;
271
+ /** AUTH-011 — séquence des effacements de session et dernier effacement annoncé par SIGNED_OUT. */
272
+ private _clearSeq;
273
+ private _signedOutSeq;
185
274
  private _unsubStore;
186
275
  private _disposed;
276
+ /** AUTH-015 — flux OAuth par défaut du client. */
277
+ private readonly _defaultFlowType;
187
278
  constructor(client: AuraClientLike, options?: AuthServiceOptions);
188
279
  /**
189
280
  * Détecte et consomme une session présente dans l'URL courante au boot (callback
@@ -321,20 +412,15 @@ declare class AuthService extends BaseService {
321
412
  */
322
413
  refreshSession(): Promise<AuraResponse<TokenPair>>;
323
414
  /**
324
- * Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
325
- *
326
- * DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
327
- * - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
328
- * - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
415
+ * Session courante lue depuis le store (pas d'appel réseau). Forme unique (AUTH-019) :
416
+ * `const { data: { session } } = await aura.auth.getSession()`.
417
+ * Côté serveur, cette session n'est PAS vérifiée : autorisez avec `getUser()` (AUTH-004).
329
418
  */
330
419
  getSession(): Promise<{
331
420
  data: {
332
421
  session: Session | null;
333
422
  };
334
423
  error: null;
335
- accessToken: string | null;
336
- access_token: string | null;
337
- user: User | null;
338
424
  }>;
339
425
  /**
340
426
  * Installe une session à partir d'un jeton d'accès et d'un jeton de rafraîchissement existants (par exemple reçus d'un serveur).
@@ -455,7 +541,51 @@ declare class AuthService extends BaseService {
455
541
  }) => Promise<AuraResponse<{
456
542
  recovery_codes: string[];
457
543
  }>>;
544
+ /** Facteurs utilisables pour relever le défi `mfaToken` (`totp`, `webauthn`, `sms`). */
545
+ factors: (mfaToken: string) => Promise<AuraResponse<{
546
+ factors: MfaFactorType[];
547
+ }>>;
548
+ /** SMS comme second facteur : enrôlement d'un numéro, envoi du code de login, retrait. */
549
+ sms: {
550
+ setup: (phone: string) => Promise<AuraResponse<{
551
+ message: string;
552
+ }>>;
553
+ verifySetup: (code: string) => Promise<AuraResponse<{
554
+ recovery_codes?: string[];
555
+ }>>;
556
+ send: (mfaToken: string) => Promise<AuraResponse<{
557
+ message: string;
558
+ phone_hint: string;
559
+ }>>;
560
+ remove: (password: string) => Promise<AuraResponse<{
561
+ message: string;
562
+ mfa_enabled: boolean;
563
+ }>>;
564
+ };
565
+ /** Passkeys WebAuthn : enrôlement, vérification du défi de login, liste, suppression. */
566
+ webauthn: {
567
+ register: (params?: WebAuthnRegisterParams) => Promise<AuraResponse<PasskeyRegisterResult>>;
568
+ verify: (params: WebAuthnVerifyParams) => Promise<AuraResponse<TokenPair>>;
569
+ list: () => Promise<AuraResponse<PasskeyInfo[]>>;
570
+ remove: (id: string, password: string) => Promise<AuraResponse<{
571
+ message: string;
572
+ mfa_enabled: boolean;
573
+ }>>;
574
+ };
458
575
  };
576
+ private webauthnIndisponible;
577
+ /**
578
+ * Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
579
+ * `navigator.credentials.create`, confirmation). Le premier facteur du compte active le MFA et
580
+ * renvoie les codes de récupération (`recovery_codes`) — à afficher une seule fois.
581
+ */
582
+ private webauthnRegister;
583
+ /**
584
+ * Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
585
+ * `navigator.credentials.get`, vérification. Enregistre la session et émet `SIGNED_IN`.
586
+ */
587
+ private webauthnVerify;
588
+ private webauthnAnnule;
459
589
  /** MFA : démarre l'enrôlement TOTP et renvoie le `secret` et l'URL `otpauth_url` à afficher en QR code. */
460
590
  mfaEnroll(): Promise<AuraResponse<MfaEnrollResponse>>;
461
591
  /** MFA : confirme l'enrôlement avec un premier code et renvoie les codes de récupération. */
@@ -546,10 +676,6 @@ declare class AuthService extends BaseService {
546
676
  mailer_autoconfirm: boolean;
547
677
  mfa_enabled: boolean;
548
678
  }>>;
549
- /** Clé publiable (anon key) du projet — GET /anon-key (public, à l'image du modèle Supabase). */
550
- getAnonKey(): Promise<AuraResponse<{
551
- anon_key: string;
552
- }>>;
553
679
  /**
554
680
  * Consomme le token de récupération de mot de passe et applique le nouveau mot de passe.
555
681
  * Body confirmé au handler (`ResetPasswordRequest` — services/aura-auth/src/handlers/auth.rs) :
@@ -600,4 +726,49 @@ declare class SessionManager {
600
726
  private _stopInterval;
601
727
  }
602
728
 
603
- export { AuthAdminService, AuthService, type EmailOtpType, type MobileOtpType, SessionManager, type SessionManagerOptions, type VerifyEmailChangeOtpParams, type VerifyEmailOtpParams, type VerifyMagiclinkOtpParams, type VerifyOtpParams, type VerifyRecoveryOtpParams, type VerifySignupOtpParams, type VerifySmsOtpParams, isMfaChallenge };
729
+ /**
730
+ * AUTH-021 — passkeys WebAuthn : conversions entre le JSON du serveur (champs binaires en
731
+ * base64url) et les objets natifs de `navigator.credentials`.
732
+ *
733
+ * Ces fonctions sont pures et exportées pour les applications qui pilotent la cérémonie
734
+ * elles-mêmes (React Native, extension, test) ; `auth.mfa.webauthn.register/verify` les enchaîne
735
+ * pour le cas courant du navigateur.
736
+ */
737
+ /** base64url (sans remplissage) → octets. */
738
+ declare function base64urlToBytes(valeur: string): Uint8Array<ArrayBuffer>;
739
+ /** octets → base64url (sans remplissage). */
740
+ declare function bytesToBase64url(octets: ArrayBuffer | ArrayBufferView): string;
741
+ interface DescripteurJson {
742
+ id: string;
743
+ type: string;
744
+ transports?: string[];
745
+ }
746
+ /** Options de création telles que renvoyées par `mfa/webauthn/register/start`. */
747
+ interface WebAuthnCreationOptionsJson {
748
+ publicKey: Record<string, unknown> & {
749
+ challenge: string;
750
+ user: {
751
+ id: string;
752
+ name: string;
753
+ displayName: string;
754
+ };
755
+ excludeCredentials?: DescripteurJson[];
756
+ };
757
+ }
758
+ /** Options d'assertion telles que renvoyées par `mfa/webauthn/verify/start`. */
759
+ interface WebAuthnRequestOptionsJson {
760
+ publicKey: Record<string, unknown> & {
761
+ challenge: string;
762
+ allowCredentials?: DescripteurJson[];
763
+ };
764
+ }
765
+ /** Convertit les options de création du serveur en `CredentialCreationOptions` natives. */
766
+ declare function creationOptionsFromJson(json: WebAuthnCreationOptionsJson): CredentialCreationOptions;
767
+ /** Convertit les options d'assertion du serveur en `CredentialRequestOptions` natives. */
768
+ declare function requestOptionsFromJson(json: WebAuthnRequestOptionsJson): CredentialRequestOptions;
769
+ /** Sérialise la réponse de `credentials.create()` au format attendu par `register/finish`. */
770
+ declare function attestationToJson(cred: PublicKeyCredential): Record<string, unknown>;
771
+ /** Sérialise la réponse de `credentials.get()` au format attendu par `verify/finish`. */
772
+ declare function assertionToJson(cred: PublicKeyCredential): Record<string, unknown>;
773
+
774
+ export { AuthAdminService, AuthService, type EmailOtpType, type ImpersonationResult, type ImportUserInput, type ImportUsersReport, type MobileOtpType, SessionManager, type SessionManagerOptions, type SigningKeysInfo, type VerifyEmailChangeOtpParams, type VerifyEmailOtpParams, type VerifyMagiclinkOtpParams, type VerifyOtpParams, type VerifyRecoveryOtpParams, type VerifySignupOtpParams, type VerifySmsOtpParams, type WebAuthnCreationOptionsJson, type WebAuthnRegisterParams, type WebAuthnRequestOptionsJson, type WebAuthnVerifyParams, assertionToJson, attestationToJson, base64urlToBytes, bytesToBase64url, creationOptionsFromJson, isMfaChallenge, requestOptionsFromJson };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,46 @@
1
- import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, OAuthSignInObjectOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
1
+ import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, OAuthSignInObjectOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaFactorType, PasskeyRegisterResult, PasskeyInfo, MfaChallenge } from '@aurabase/core';
2
2
 
3
+ interface ImpersonationResult {
4
+ access_token: string;
5
+ token_type: 'Bearer';
6
+ expires_in: number;
7
+ act: {
8
+ sub: string;
9
+ };
10
+ user: AdminUser;
11
+ }
12
+ interface ImportUserInput {
13
+ email: string;
14
+ emailVerified?: boolean;
15
+ /** bcrypt (`$2a$`, `$2b$`, `$2y$`) or argon2id hash of the original password. */
16
+ passwordHash?: string;
17
+ name?: string;
18
+ userMetadata?: Record<string, unknown>;
19
+ appMetadata?: Record<string, unknown>;
20
+ }
21
+ interface ImportUsersReport {
22
+ created: number;
23
+ skipped: number;
24
+ errors: number;
25
+ report: Array<{
26
+ index: number;
27
+ email: string;
28
+ status: 'created' | 'skipped' | 'error';
29
+ id?: string;
30
+ error?: string;
31
+ }>;
32
+ }
33
+ interface SigningKeysInfo {
34
+ jwks_url: string;
35
+ issuer: string | null;
36
+ keys: Array<{
37
+ kid: string;
38
+ status: 'active' | 'previous';
39
+ issuer: string;
40
+ created_at: string;
41
+ jwk: Record<string, unknown>;
42
+ }>;
43
+ }
3
44
  declare class AuthAdminService extends BaseService {
4
45
  /**
5
46
  * Préfixe des routes de ce service. Aucun identifiant de projet : il est injecté par
@@ -31,8 +72,38 @@ declare class AuthAdminService extends BaseService {
31
72
  unbanUser(userId: string): Promise<AuraResponse<null>>;
32
73
  /**
33
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 })`.
34
76
  */
35
- generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
77
+ generateLink(userIdOrParams: string | {
78
+ userId?: string;
79
+ user_id?: string;
80
+ type: GenerateLinkType;
81
+ }, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
82
+ /**
83
+ * Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
84
+ * avec le claim `act: { sub }`. Pas de refresh token, journalisé (`admin_impersonation`).
85
+ * Un compte `owner`/`admin` exige `allowPrivileged: true` ET une `reason`.
86
+ */
87
+ impersonate(userId: string, options?: {
88
+ reason?: string;
89
+ ttlSeconds?: number;
90
+ allowPrivileged?: boolean;
91
+ }): Promise<AuraResponse<ImpersonationResult>>;
92
+ /**
93
+ * Import en masse (AUTH-037) : jusqu'a 1000 utilisateurs par appel, avec hash bcrypt ou argon2id.
94
+ * Rapport ligne par ligne ; une ligne en erreur n'arrete pas les autres.
95
+ */
96
+ importUsers(users: ImportUserInput[]): Promise<AuraResponse<ImportUsersReport>>;
97
+ /** Cles de signature du projet (active + previous), URL du JWKS et emetteur (`iss`). */
98
+ listSigningKeys(): Promise<AuraResponse<SigningKeysInfo>>;
99
+ /** Rotation : une nouvelle cle signe les nouveaux jetons, l'ancienne reste publiee 24 h. */
100
+ rotateSigningKey(): Promise<AuraResponse<{
101
+ kid: string;
102
+ }>>;
103
+ /** Revoque une ancienne cle compromise (retiree du JWKS, jetons refuses). */
104
+ revokeSigningKey(kid: string): Promise<AuraResponse<{
105
+ revoked: string;
106
+ }>>;
36
107
  /**
37
108
  * Statistiques des utilisateurs : total, vérifiés, bannis, avec MFA et nouveaux sur 7 jours.
38
109
  */
@@ -170,6 +241,8 @@ interface AuthServiceOptions {
170
241
  * `true` en navigateur, no-op hors navigateur. Voir `_detectSessionInUrl`.
171
242
  */
172
243
  detectSessionInUrl?: boolean;
244
+ /** AUTH-015 — flux OAuth par défaut (option `auth.flowType` de `createClient`). */
245
+ flowType?: 'pkce' | 'implicit';
173
246
  }
174
247
  /**
175
248
  * Garde de type discriminant `LoginResponse = TokenPair | MfaChallenge` (LOT 3, 3.4).
@@ -178,12 +251,30 @@ interface AuthServiceOptions {
178
251
  * la même vérification structurelle (`mfa_required === true`).
179
252
  */
180
253
  declare function isMfaChallenge(v: unknown): v is MfaChallenge;
254
+ /** Paramètres de `auth.mfa.webauthn.register`. */
255
+ interface WebAuthnRegisterParams {
256
+ /** Nom affiché dans la liste des facteurs (« MacBook Touch ID »). */
257
+ friendlyName?: string;
258
+ /** Conteneur de credentials à utiliser à la place de `navigator.credentials` (tests, WebView). */
259
+ credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
260
+ }
261
+ /** Paramètres de `auth.mfa.webauthn.verify`. */
262
+ interface WebAuthnVerifyParams {
263
+ /** `mfaToken` du défi renvoyé par `signIn`. */
264
+ mfaToken: string;
265
+ credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
266
+ }
181
267
  declare class AuthService extends BaseService {
182
268
  private _stateListeners;
183
269
  private _sessionManager;
184
270
  private _applyingRemote;
271
+ /** AUTH-011 — séquence des effacements de session et dernier effacement annoncé par SIGNED_OUT. */
272
+ private _clearSeq;
273
+ private _signedOutSeq;
185
274
  private _unsubStore;
186
275
  private _disposed;
276
+ /** AUTH-015 — flux OAuth par défaut du client. */
277
+ private readonly _defaultFlowType;
187
278
  constructor(client: AuraClientLike, options?: AuthServiceOptions);
188
279
  /**
189
280
  * Détecte et consomme une session présente dans l'URL courante au boot (callback
@@ -321,20 +412,15 @@ declare class AuthService extends BaseService {
321
412
  */
322
413
  refreshSession(): Promise<AuraResponse<TokenPair>>;
323
414
  /**
324
- * Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
325
- *
326
- * DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
327
- * - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
328
- * - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
415
+ * Session courante lue depuis le store (pas d'appel réseau). Forme unique (AUTH-019) :
416
+ * `const { data: { session } } = await aura.auth.getSession()`.
417
+ * Côté serveur, cette session n'est PAS vérifiée : autorisez avec `getUser()` (AUTH-004).
329
418
  */
330
419
  getSession(): Promise<{
331
420
  data: {
332
421
  session: Session | null;
333
422
  };
334
423
  error: null;
335
- accessToken: string | null;
336
- access_token: string | null;
337
- user: User | null;
338
424
  }>;
339
425
  /**
340
426
  * Installe une session à partir d'un jeton d'accès et d'un jeton de rafraîchissement existants (par exemple reçus d'un serveur).
@@ -455,7 +541,51 @@ declare class AuthService extends BaseService {
455
541
  }) => Promise<AuraResponse<{
456
542
  recovery_codes: string[];
457
543
  }>>;
544
+ /** Facteurs utilisables pour relever le défi `mfaToken` (`totp`, `webauthn`, `sms`). */
545
+ factors: (mfaToken: string) => Promise<AuraResponse<{
546
+ factors: MfaFactorType[];
547
+ }>>;
548
+ /** SMS comme second facteur : enrôlement d'un numéro, envoi du code de login, retrait. */
549
+ sms: {
550
+ setup: (phone: string) => Promise<AuraResponse<{
551
+ message: string;
552
+ }>>;
553
+ verifySetup: (code: string) => Promise<AuraResponse<{
554
+ recovery_codes?: string[];
555
+ }>>;
556
+ send: (mfaToken: string) => Promise<AuraResponse<{
557
+ message: string;
558
+ phone_hint: string;
559
+ }>>;
560
+ remove: (password: string) => Promise<AuraResponse<{
561
+ message: string;
562
+ mfa_enabled: boolean;
563
+ }>>;
564
+ };
565
+ /** Passkeys WebAuthn : enrôlement, vérification du défi de login, liste, suppression. */
566
+ webauthn: {
567
+ register: (params?: WebAuthnRegisterParams) => Promise<AuraResponse<PasskeyRegisterResult>>;
568
+ verify: (params: WebAuthnVerifyParams) => Promise<AuraResponse<TokenPair>>;
569
+ list: () => Promise<AuraResponse<PasskeyInfo[]>>;
570
+ remove: (id: string, password: string) => Promise<AuraResponse<{
571
+ message: string;
572
+ mfa_enabled: boolean;
573
+ }>>;
574
+ };
458
575
  };
576
+ private webauthnIndisponible;
577
+ /**
578
+ * Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
579
+ * `navigator.credentials.create`, confirmation). Le premier facteur du compte active le MFA et
580
+ * renvoie les codes de récupération (`recovery_codes`) — à afficher une seule fois.
581
+ */
582
+ private webauthnRegister;
583
+ /**
584
+ * Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
585
+ * `navigator.credentials.get`, vérification. Enregistre la session et émet `SIGNED_IN`.
586
+ */
587
+ private webauthnVerify;
588
+ private webauthnAnnule;
459
589
  /** MFA : démarre l'enrôlement TOTP et renvoie le `secret` et l'URL `otpauth_url` à afficher en QR code. */
460
590
  mfaEnroll(): Promise<AuraResponse<MfaEnrollResponse>>;
461
591
  /** MFA : confirme l'enrôlement avec un premier code et renvoie les codes de récupération. */
@@ -546,10 +676,6 @@ declare class AuthService extends BaseService {
546
676
  mailer_autoconfirm: boolean;
547
677
  mfa_enabled: boolean;
548
678
  }>>;
549
- /** Clé publiable (anon key) du projet — GET /anon-key (public, à l'image du modèle Supabase). */
550
- getAnonKey(): Promise<AuraResponse<{
551
- anon_key: string;
552
- }>>;
553
679
  /**
554
680
  * Consomme le token de récupération de mot de passe et applique le nouveau mot de passe.
555
681
  * Body confirmé au handler (`ResetPasswordRequest` — services/aura-auth/src/handlers/auth.rs) :
@@ -600,4 +726,49 @@ declare class SessionManager {
600
726
  private _stopInterval;
601
727
  }
602
728
 
603
- export { AuthAdminService, AuthService, type EmailOtpType, type MobileOtpType, SessionManager, type SessionManagerOptions, type VerifyEmailChangeOtpParams, type VerifyEmailOtpParams, type VerifyMagiclinkOtpParams, type VerifyOtpParams, type VerifyRecoveryOtpParams, type VerifySignupOtpParams, type VerifySmsOtpParams, isMfaChallenge };
729
+ /**
730
+ * AUTH-021 — passkeys WebAuthn : conversions entre le JSON du serveur (champs binaires en
731
+ * base64url) et les objets natifs de `navigator.credentials`.
732
+ *
733
+ * Ces fonctions sont pures et exportées pour les applications qui pilotent la cérémonie
734
+ * elles-mêmes (React Native, extension, test) ; `auth.mfa.webauthn.register/verify` les enchaîne
735
+ * pour le cas courant du navigateur.
736
+ */
737
+ /** base64url (sans remplissage) → octets. */
738
+ declare function base64urlToBytes(valeur: string): Uint8Array<ArrayBuffer>;
739
+ /** octets → base64url (sans remplissage). */
740
+ declare function bytesToBase64url(octets: ArrayBuffer | ArrayBufferView): string;
741
+ interface DescripteurJson {
742
+ id: string;
743
+ type: string;
744
+ transports?: string[];
745
+ }
746
+ /** Options de création telles que renvoyées par `mfa/webauthn/register/start`. */
747
+ interface WebAuthnCreationOptionsJson {
748
+ publicKey: Record<string, unknown> & {
749
+ challenge: string;
750
+ user: {
751
+ id: string;
752
+ name: string;
753
+ displayName: string;
754
+ };
755
+ excludeCredentials?: DescripteurJson[];
756
+ };
757
+ }
758
+ /** Options d'assertion telles que renvoyées par `mfa/webauthn/verify/start`. */
759
+ interface WebAuthnRequestOptionsJson {
760
+ publicKey: Record<string, unknown> & {
761
+ challenge: string;
762
+ allowCredentials?: DescripteurJson[];
763
+ };
764
+ }
765
+ /** Convertit les options de création du serveur en `CredentialCreationOptions` natives. */
766
+ declare function creationOptionsFromJson(json: WebAuthnCreationOptionsJson): CredentialCreationOptions;
767
+ /** Convertit les options d'assertion du serveur en `CredentialRequestOptions` natives. */
768
+ declare function requestOptionsFromJson(json: WebAuthnRequestOptionsJson): CredentialRequestOptions;
769
+ /** Sérialise la réponse de `credentials.create()` au format attendu par `register/finish`. */
770
+ declare function attestationToJson(cred: PublicKeyCredential): Record<string, unknown>;
771
+ /** Sérialise la réponse de `credentials.get()` au format attendu par `verify/finish`. */
772
+ declare function assertionToJson(cred: PublicKeyCredential): Record<string, unknown>;
773
+
774
+ export { AuthAdminService, AuthService, type EmailOtpType, type ImpersonationResult, type ImportUserInput, type ImportUsersReport, type MobileOtpType, SessionManager, type SessionManagerOptions, type SigningKeysInfo, type VerifyEmailChangeOtpParams, type VerifyEmailOtpParams, type VerifyMagiclinkOtpParams, type VerifyOtpParams, type VerifyRecoveryOtpParams, type VerifySignupOtpParams, type VerifySmsOtpParams, type WebAuthnCreationOptionsJson, type WebAuthnRegisterParams, type WebAuthnRequestOptionsJson, type WebAuthnVerifyParams, assertionToJson, attestationToJson, base64urlToBytes, bytesToBase64url, creationOptionsFromJson, isMfaChallenge, requestOptionsFromJson };