@aurabase/auth 0.6.1 → 0.7.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/README.md +12 -7
- package/dist/index.cjs +284 -55
- package/dist/index.d.cts +185 -17
- package/dist/index.d.ts +185 -17
- package/dist/index.js +279 -56
- package/package.json +4 -4
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
|
|
@@ -33,6 +74,31 @@ declare class AuthAdminService extends BaseService {
|
|
|
33
74
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
34
75
|
*/
|
|
35
76
|
generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
|
|
77
|
+
/**
|
|
78
|
+
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
79
|
+
* avec le claim `act: { sub }`. Pas de refresh token, journalisé (`admin_impersonation`).
|
|
80
|
+
* Un compte `owner`/`admin` exige `allowPrivileged: true` ET une `reason`.
|
|
81
|
+
*/
|
|
82
|
+
impersonate(userId: string, options?: {
|
|
83
|
+
reason?: string;
|
|
84
|
+
ttlSeconds?: number;
|
|
85
|
+
allowPrivileged?: boolean;
|
|
86
|
+
}): Promise<AuraResponse<ImpersonationResult>>;
|
|
87
|
+
/**
|
|
88
|
+
* Import en masse (AUTH-037) : jusqu'a 1000 utilisateurs par appel, avec hash bcrypt ou argon2id.
|
|
89
|
+
* Rapport ligne par ligne ; une ligne en erreur n'arrete pas les autres.
|
|
90
|
+
*/
|
|
91
|
+
importUsers(users: ImportUserInput[]): Promise<AuraResponse<ImportUsersReport>>;
|
|
92
|
+
/** Cles de signature du projet (active + previous), URL du JWKS et emetteur (`iss`). */
|
|
93
|
+
listSigningKeys(): Promise<AuraResponse<SigningKeysInfo>>;
|
|
94
|
+
/** Rotation : une nouvelle cle signe les nouveaux jetons, l'ancienne reste publiee 24 h. */
|
|
95
|
+
rotateSigningKey(): Promise<AuraResponse<{
|
|
96
|
+
kid: string;
|
|
97
|
+
}>>;
|
|
98
|
+
/** Revoque une ancienne cle compromise (retiree du JWKS, jetons refuses). */
|
|
99
|
+
revokeSigningKey(kid: string): Promise<AuraResponse<{
|
|
100
|
+
revoked: string;
|
|
101
|
+
}>>;
|
|
36
102
|
/**
|
|
37
103
|
* Statistiques des utilisateurs : total, vérifiés, bannis, avec MFA et nouveaux sur 7 jours.
|
|
38
104
|
*/
|
|
@@ -170,6 +236,8 @@ interface AuthServiceOptions {
|
|
|
170
236
|
* `true` en navigateur, no-op hors navigateur. Voir `_detectSessionInUrl`.
|
|
171
237
|
*/
|
|
172
238
|
detectSessionInUrl?: boolean;
|
|
239
|
+
/** AUTH-015 — flux OAuth par défaut (option `auth.flowType` de `createClient`). */
|
|
240
|
+
flowType?: 'pkce' | 'implicit';
|
|
173
241
|
}
|
|
174
242
|
/**
|
|
175
243
|
* Garde de type discriminant `LoginResponse = TokenPair | MfaChallenge` (LOT 3, 3.4).
|
|
@@ -178,12 +246,30 @@ interface AuthServiceOptions {
|
|
|
178
246
|
* la même vérification structurelle (`mfa_required === true`).
|
|
179
247
|
*/
|
|
180
248
|
declare function isMfaChallenge(v: unknown): v is MfaChallenge;
|
|
249
|
+
/** Paramètres de `auth.mfa.webauthn.register`. */
|
|
250
|
+
interface WebAuthnRegisterParams {
|
|
251
|
+
/** Nom affiché dans la liste des facteurs (« MacBook Touch ID »). */
|
|
252
|
+
friendlyName?: string;
|
|
253
|
+
/** Conteneur de credentials à utiliser à la place de `navigator.credentials` (tests, WebView). */
|
|
254
|
+
credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
|
|
255
|
+
}
|
|
256
|
+
/** Paramètres de `auth.mfa.webauthn.verify`. */
|
|
257
|
+
interface WebAuthnVerifyParams {
|
|
258
|
+
/** `mfaToken` du défi renvoyé par `signIn`. */
|
|
259
|
+
mfaToken: string;
|
|
260
|
+
credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
|
|
261
|
+
}
|
|
181
262
|
declare class AuthService extends BaseService {
|
|
182
263
|
private _stateListeners;
|
|
183
264
|
private _sessionManager;
|
|
184
265
|
private _applyingRemote;
|
|
266
|
+
/** AUTH-011 — séquence des effacements de session et dernier effacement annoncé par SIGNED_OUT. */
|
|
267
|
+
private _clearSeq;
|
|
268
|
+
private _signedOutSeq;
|
|
185
269
|
private _unsubStore;
|
|
186
270
|
private _disposed;
|
|
271
|
+
/** AUTH-015 — flux OAuth par défaut du client. */
|
|
272
|
+
private readonly _defaultFlowType;
|
|
187
273
|
constructor(client: AuraClientLike, options?: AuthServiceOptions);
|
|
188
274
|
/**
|
|
189
275
|
* Détecte et consomme une session présente dans l'URL courante au boot (callback
|
|
@@ -321,20 +407,15 @@ declare class AuthService extends BaseService {
|
|
|
321
407
|
*/
|
|
322
408
|
refreshSession(): Promise<AuraResponse<TokenPair>>;
|
|
323
409
|
/**
|
|
324
|
-
* Session courante lue depuis le store (
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
328
|
-
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
410
|
+
* Session courante lue depuis le store (pas d'appel réseau). Forme unique (AUTH-019) :
|
|
411
|
+
* `const { data: { session } } = await aura.auth.getSession()`.
|
|
412
|
+
* Côté serveur, cette session n'est PAS vérifiée : autorisez avec `getUser()` (AUTH-004).
|
|
329
413
|
*/
|
|
330
414
|
getSession(): Promise<{
|
|
331
415
|
data: {
|
|
332
416
|
session: Session | null;
|
|
333
417
|
};
|
|
334
418
|
error: null;
|
|
335
|
-
accessToken: string | null;
|
|
336
|
-
access_token: string | null;
|
|
337
|
-
user: User | null;
|
|
338
419
|
}>;
|
|
339
420
|
/**
|
|
340
421
|
* 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).
|
|
@@ -381,7 +462,9 @@ declare class AuthService extends BaseService {
|
|
|
381
462
|
* (`skipAuthRefresh`, aucun refresh ni retry-401 sur le store). Le backend
|
|
382
463
|
* applique l'isolation projet native : un token d'un AUTRE projet → 403.
|
|
383
464
|
*/
|
|
384
|
-
getUser(jwt?: string): Promise<AuraResponse<User
|
|
465
|
+
getUser(jwt?: string): Promise<AuraResponse<User & {
|
|
466
|
+
user: User;
|
|
467
|
+
}>>;
|
|
385
468
|
/**
|
|
386
469
|
* Vérifie et décode les claims d'un JWT.
|
|
387
470
|
*
|
|
@@ -420,8 +503,8 @@ declare class AuthService extends BaseService {
|
|
|
420
503
|
* Met à jour l'utilisateur connecté (métadonnées, mot de passe…) et émet `USER_UPDATED`. Un changement d'e-mail ne prend effet qu'après confirmation par `verifyOtp({ type: 'email_change' })`.
|
|
421
504
|
*/
|
|
422
505
|
updateUser(req: UpdateUserRequest): Promise<AuraResponse<User>>;
|
|
423
|
-
/** Envoie un e-mail de réinitialisation du mot de passe. */
|
|
424
|
-
resetPasswordForEmail(
|
|
506
|
+
/** Envoie un e-mail de réinitialisation du mot de passe (accepte un email sous forme de chaîne ou un objet PasswordResetRequest). */
|
|
507
|
+
resetPasswordForEmail(emailOrReq: string | PasswordResetRequest): Promise<AuraResponse<{
|
|
425
508
|
message: string;
|
|
426
509
|
}>>;
|
|
427
510
|
/**
|
|
@@ -453,7 +536,51 @@ declare class AuthService extends BaseService {
|
|
|
453
536
|
}) => Promise<AuraResponse<{
|
|
454
537
|
recovery_codes: string[];
|
|
455
538
|
}>>;
|
|
539
|
+
/** Facteurs utilisables pour relever le défi `mfaToken` (`totp`, `webauthn`, `sms`). */
|
|
540
|
+
factors: (mfaToken: string) => Promise<AuraResponse<{
|
|
541
|
+
factors: MfaFactorType[];
|
|
542
|
+
}>>;
|
|
543
|
+
/** SMS comme second facteur : enrôlement d'un numéro, envoi du code de login, retrait. */
|
|
544
|
+
sms: {
|
|
545
|
+
setup: (phone: string) => Promise<AuraResponse<{
|
|
546
|
+
message: string;
|
|
547
|
+
}>>;
|
|
548
|
+
verifySetup: (code: string) => Promise<AuraResponse<{
|
|
549
|
+
recovery_codes?: string[];
|
|
550
|
+
}>>;
|
|
551
|
+
send: (mfaToken: string) => Promise<AuraResponse<{
|
|
552
|
+
message: string;
|
|
553
|
+
phone_hint: string;
|
|
554
|
+
}>>;
|
|
555
|
+
remove: (password: string) => Promise<AuraResponse<{
|
|
556
|
+
message: string;
|
|
557
|
+
mfa_enabled: boolean;
|
|
558
|
+
}>>;
|
|
559
|
+
};
|
|
560
|
+
/** Passkeys WebAuthn : enrôlement, vérification du défi de login, liste, suppression. */
|
|
561
|
+
webauthn: {
|
|
562
|
+
register: (params?: WebAuthnRegisterParams) => Promise<AuraResponse<PasskeyRegisterResult>>;
|
|
563
|
+
verify: (params: WebAuthnVerifyParams) => Promise<AuraResponse<TokenPair>>;
|
|
564
|
+
list: () => Promise<AuraResponse<PasskeyInfo[]>>;
|
|
565
|
+
remove: (id: string, password: string) => Promise<AuraResponse<{
|
|
566
|
+
message: string;
|
|
567
|
+
mfa_enabled: boolean;
|
|
568
|
+
}>>;
|
|
569
|
+
};
|
|
456
570
|
};
|
|
571
|
+
private webauthnIndisponible;
|
|
572
|
+
/**
|
|
573
|
+
* Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
|
|
574
|
+
* `navigator.credentials.create`, confirmation). Le premier facteur du compte active le MFA et
|
|
575
|
+
* renvoie les codes de récupération (`recovery_codes`) — à afficher une seule fois.
|
|
576
|
+
*/
|
|
577
|
+
private webauthnRegister;
|
|
578
|
+
/**
|
|
579
|
+
* Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
|
|
580
|
+
* `navigator.credentials.get`, vérification. Enregistre la session et émet `SIGNED_IN`.
|
|
581
|
+
*/
|
|
582
|
+
private webauthnVerify;
|
|
583
|
+
private webauthnAnnule;
|
|
457
584
|
/** MFA : démarre l'enrôlement TOTP et renvoie le `secret` et l'URL `otpauth_url` à afficher en QR code. */
|
|
458
585
|
mfaEnroll(): Promise<AuraResponse<MfaEnrollResponse>>;
|
|
459
586
|
/** MFA : confirme l'enrôlement avec un premier code et renvoie les codes de récupération. */
|
|
@@ -544,10 +671,6 @@ declare class AuthService extends BaseService {
|
|
|
544
671
|
mailer_autoconfirm: boolean;
|
|
545
672
|
mfa_enabled: boolean;
|
|
546
673
|
}>>;
|
|
547
|
-
/** Clé publiable (anon key) du projet — GET /anon-key (public, à l'image du modèle Supabase). */
|
|
548
|
-
getAnonKey(): Promise<AuraResponse<{
|
|
549
|
-
anon_key: string;
|
|
550
|
-
}>>;
|
|
551
674
|
/**
|
|
552
675
|
* Consomme le token de récupération de mot de passe et applique le nouveau mot de passe.
|
|
553
676
|
* Body confirmé au handler (`ResetPasswordRequest` — services/aura-auth/src/handlers/auth.rs) :
|
|
@@ -598,4 +721,49 @@ declare class SessionManager {
|
|
|
598
721
|
private _stopInterval;
|
|
599
722
|
}
|
|
600
723
|
|
|
601
|
-
|
|
724
|
+
/**
|
|
725
|
+
* AUTH-021 — passkeys WebAuthn : conversions entre le JSON du serveur (champs binaires en
|
|
726
|
+
* base64url) et les objets natifs de `navigator.credentials`.
|
|
727
|
+
*
|
|
728
|
+
* Ces fonctions sont pures et exportées pour les applications qui pilotent la cérémonie
|
|
729
|
+
* elles-mêmes (React Native, extension, test) ; `auth.mfa.webauthn.register/verify` les enchaîne
|
|
730
|
+
* pour le cas courant du navigateur.
|
|
731
|
+
*/
|
|
732
|
+
/** base64url (sans remplissage) → octets. */
|
|
733
|
+
declare function base64urlToBytes(valeur: string): Uint8Array<ArrayBuffer>;
|
|
734
|
+
/** octets → base64url (sans remplissage). */
|
|
735
|
+
declare function bytesToBase64url(octets: ArrayBuffer | ArrayBufferView): string;
|
|
736
|
+
interface DescripteurJson {
|
|
737
|
+
id: string;
|
|
738
|
+
type: string;
|
|
739
|
+
transports?: string[];
|
|
740
|
+
}
|
|
741
|
+
/** Options de création telles que renvoyées par `mfa/webauthn/register/start`. */
|
|
742
|
+
interface WebAuthnCreationOptionsJson {
|
|
743
|
+
publicKey: Record<string, unknown> & {
|
|
744
|
+
challenge: string;
|
|
745
|
+
user: {
|
|
746
|
+
id: string;
|
|
747
|
+
name: string;
|
|
748
|
+
displayName: string;
|
|
749
|
+
};
|
|
750
|
+
excludeCredentials?: DescripteurJson[];
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
/** Options d'assertion telles que renvoyées par `mfa/webauthn/verify/start`. */
|
|
754
|
+
interface WebAuthnRequestOptionsJson {
|
|
755
|
+
publicKey: Record<string, unknown> & {
|
|
756
|
+
challenge: string;
|
|
757
|
+
allowCredentials?: DescripteurJson[];
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
/** Convertit les options de création du serveur en `CredentialCreationOptions` natives. */
|
|
761
|
+
declare function creationOptionsFromJson(json: WebAuthnCreationOptionsJson): CredentialCreationOptions;
|
|
762
|
+
/** Convertit les options d'assertion du serveur en `CredentialRequestOptions` natives. */
|
|
763
|
+
declare function requestOptionsFromJson(json: WebAuthnRequestOptionsJson): CredentialRequestOptions;
|
|
764
|
+
/** Sérialise la réponse de `credentials.create()` au format attendu par `register/finish`. */
|
|
765
|
+
declare function attestationToJson(cred: PublicKeyCredential): Record<string, unknown>;
|
|
766
|
+
/** Sérialise la réponse de `credentials.get()` au format attendu par `verify/finish`. */
|
|
767
|
+
declare function assertionToJson(cred: PublicKeyCredential): Record<string, unknown>;
|
|
768
|
+
|
|
769
|
+
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
|
|
@@ -33,6 +74,31 @@ declare class AuthAdminService extends BaseService {
|
|
|
33
74
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
34
75
|
*/
|
|
35
76
|
generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
|
|
77
|
+
/**
|
|
78
|
+
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
79
|
+
* avec le claim `act: { sub }`. Pas de refresh token, journalisé (`admin_impersonation`).
|
|
80
|
+
* Un compte `owner`/`admin` exige `allowPrivileged: true` ET une `reason`.
|
|
81
|
+
*/
|
|
82
|
+
impersonate(userId: string, options?: {
|
|
83
|
+
reason?: string;
|
|
84
|
+
ttlSeconds?: number;
|
|
85
|
+
allowPrivileged?: boolean;
|
|
86
|
+
}): Promise<AuraResponse<ImpersonationResult>>;
|
|
87
|
+
/**
|
|
88
|
+
* Import en masse (AUTH-037) : jusqu'a 1000 utilisateurs par appel, avec hash bcrypt ou argon2id.
|
|
89
|
+
* Rapport ligne par ligne ; une ligne en erreur n'arrete pas les autres.
|
|
90
|
+
*/
|
|
91
|
+
importUsers(users: ImportUserInput[]): Promise<AuraResponse<ImportUsersReport>>;
|
|
92
|
+
/** Cles de signature du projet (active + previous), URL du JWKS et emetteur (`iss`). */
|
|
93
|
+
listSigningKeys(): Promise<AuraResponse<SigningKeysInfo>>;
|
|
94
|
+
/** Rotation : une nouvelle cle signe les nouveaux jetons, l'ancienne reste publiee 24 h. */
|
|
95
|
+
rotateSigningKey(): Promise<AuraResponse<{
|
|
96
|
+
kid: string;
|
|
97
|
+
}>>;
|
|
98
|
+
/** Revoque une ancienne cle compromise (retiree du JWKS, jetons refuses). */
|
|
99
|
+
revokeSigningKey(kid: string): Promise<AuraResponse<{
|
|
100
|
+
revoked: string;
|
|
101
|
+
}>>;
|
|
36
102
|
/**
|
|
37
103
|
* Statistiques des utilisateurs : total, vérifiés, bannis, avec MFA et nouveaux sur 7 jours.
|
|
38
104
|
*/
|
|
@@ -170,6 +236,8 @@ interface AuthServiceOptions {
|
|
|
170
236
|
* `true` en navigateur, no-op hors navigateur. Voir `_detectSessionInUrl`.
|
|
171
237
|
*/
|
|
172
238
|
detectSessionInUrl?: boolean;
|
|
239
|
+
/** AUTH-015 — flux OAuth par défaut (option `auth.flowType` de `createClient`). */
|
|
240
|
+
flowType?: 'pkce' | 'implicit';
|
|
173
241
|
}
|
|
174
242
|
/**
|
|
175
243
|
* Garde de type discriminant `LoginResponse = TokenPair | MfaChallenge` (LOT 3, 3.4).
|
|
@@ -178,12 +246,30 @@ interface AuthServiceOptions {
|
|
|
178
246
|
* la même vérification structurelle (`mfa_required === true`).
|
|
179
247
|
*/
|
|
180
248
|
declare function isMfaChallenge(v: unknown): v is MfaChallenge;
|
|
249
|
+
/** Paramètres de `auth.mfa.webauthn.register`. */
|
|
250
|
+
interface WebAuthnRegisterParams {
|
|
251
|
+
/** Nom affiché dans la liste des facteurs (« MacBook Touch ID »). */
|
|
252
|
+
friendlyName?: string;
|
|
253
|
+
/** Conteneur de credentials à utiliser à la place de `navigator.credentials` (tests, WebView). */
|
|
254
|
+
credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
|
|
255
|
+
}
|
|
256
|
+
/** Paramètres de `auth.mfa.webauthn.verify`. */
|
|
257
|
+
interface WebAuthnVerifyParams {
|
|
258
|
+
/** `mfaToken` du défi renvoyé par `signIn`. */
|
|
259
|
+
mfaToken: string;
|
|
260
|
+
credentials?: Pick<CredentialsContainer, 'create' | 'get'>;
|
|
261
|
+
}
|
|
181
262
|
declare class AuthService extends BaseService {
|
|
182
263
|
private _stateListeners;
|
|
183
264
|
private _sessionManager;
|
|
184
265
|
private _applyingRemote;
|
|
266
|
+
/** AUTH-011 — séquence des effacements de session et dernier effacement annoncé par SIGNED_OUT. */
|
|
267
|
+
private _clearSeq;
|
|
268
|
+
private _signedOutSeq;
|
|
185
269
|
private _unsubStore;
|
|
186
270
|
private _disposed;
|
|
271
|
+
/** AUTH-015 — flux OAuth par défaut du client. */
|
|
272
|
+
private readonly _defaultFlowType;
|
|
187
273
|
constructor(client: AuraClientLike, options?: AuthServiceOptions);
|
|
188
274
|
/**
|
|
189
275
|
* Détecte et consomme une session présente dans l'URL courante au boot (callback
|
|
@@ -321,20 +407,15 @@ declare class AuthService extends BaseService {
|
|
|
321
407
|
*/
|
|
322
408
|
refreshSession(): Promise<AuraResponse<TokenPair>>;
|
|
323
409
|
/**
|
|
324
|
-
* Session courante lue depuis le store (
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
328
|
-
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
410
|
+
* Session courante lue depuis le store (pas d'appel réseau). Forme unique (AUTH-019) :
|
|
411
|
+
* `const { data: { session } } = await aura.auth.getSession()`.
|
|
412
|
+
* Côté serveur, cette session n'est PAS vérifiée : autorisez avec `getUser()` (AUTH-004).
|
|
329
413
|
*/
|
|
330
414
|
getSession(): Promise<{
|
|
331
415
|
data: {
|
|
332
416
|
session: Session | null;
|
|
333
417
|
};
|
|
334
418
|
error: null;
|
|
335
|
-
accessToken: string | null;
|
|
336
|
-
access_token: string | null;
|
|
337
|
-
user: User | null;
|
|
338
419
|
}>;
|
|
339
420
|
/**
|
|
340
421
|
* 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).
|
|
@@ -381,7 +462,9 @@ declare class AuthService extends BaseService {
|
|
|
381
462
|
* (`skipAuthRefresh`, aucun refresh ni retry-401 sur le store). Le backend
|
|
382
463
|
* applique l'isolation projet native : un token d'un AUTRE projet → 403.
|
|
383
464
|
*/
|
|
384
|
-
getUser(jwt?: string): Promise<AuraResponse<User
|
|
465
|
+
getUser(jwt?: string): Promise<AuraResponse<User & {
|
|
466
|
+
user: User;
|
|
467
|
+
}>>;
|
|
385
468
|
/**
|
|
386
469
|
* Vérifie et décode les claims d'un JWT.
|
|
387
470
|
*
|
|
@@ -420,8 +503,8 @@ declare class AuthService extends BaseService {
|
|
|
420
503
|
* Met à jour l'utilisateur connecté (métadonnées, mot de passe…) et émet `USER_UPDATED`. Un changement d'e-mail ne prend effet qu'après confirmation par `verifyOtp({ type: 'email_change' })`.
|
|
421
504
|
*/
|
|
422
505
|
updateUser(req: UpdateUserRequest): Promise<AuraResponse<User>>;
|
|
423
|
-
/** Envoie un e-mail de réinitialisation du mot de passe. */
|
|
424
|
-
resetPasswordForEmail(
|
|
506
|
+
/** Envoie un e-mail de réinitialisation du mot de passe (accepte un email sous forme de chaîne ou un objet PasswordResetRequest). */
|
|
507
|
+
resetPasswordForEmail(emailOrReq: string | PasswordResetRequest): Promise<AuraResponse<{
|
|
425
508
|
message: string;
|
|
426
509
|
}>>;
|
|
427
510
|
/**
|
|
@@ -453,7 +536,51 @@ declare class AuthService extends BaseService {
|
|
|
453
536
|
}) => Promise<AuraResponse<{
|
|
454
537
|
recovery_codes: string[];
|
|
455
538
|
}>>;
|
|
539
|
+
/** Facteurs utilisables pour relever le défi `mfaToken` (`totp`, `webauthn`, `sms`). */
|
|
540
|
+
factors: (mfaToken: string) => Promise<AuraResponse<{
|
|
541
|
+
factors: MfaFactorType[];
|
|
542
|
+
}>>;
|
|
543
|
+
/** SMS comme second facteur : enrôlement d'un numéro, envoi du code de login, retrait. */
|
|
544
|
+
sms: {
|
|
545
|
+
setup: (phone: string) => Promise<AuraResponse<{
|
|
546
|
+
message: string;
|
|
547
|
+
}>>;
|
|
548
|
+
verifySetup: (code: string) => Promise<AuraResponse<{
|
|
549
|
+
recovery_codes?: string[];
|
|
550
|
+
}>>;
|
|
551
|
+
send: (mfaToken: string) => Promise<AuraResponse<{
|
|
552
|
+
message: string;
|
|
553
|
+
phone_hint: string;
|
|
554
|
+
}>>;
|
|
555
|
+
remove: (password: string) => Promise<AuraResponse<{
|
|
556
|
+
message: string;
|
|
557
|
+
mfa_enabled: boolean;
|
|
558
|
+
}>>;
|
|
559
|
+
};
|
|
560
|
+
/** Passkeys WebAuthn : enrôlement, vérification du défi de login, liste, suppression. */
|
|
561
|
+
webauthn: {
|
|
562
|
+
register: (params?: WebAuthnRegisterParams) => Promise<AuraResponse<PasskeyRegisterResult>>;
|
|
563
|
+
verify: (params: WebAuthnVerifyParams) => Promise<AuraResponse<TokenPair>>;
|
|
564
|
+
list: () => Promise<AuraResponse<PasskeyInfo[]>>;
|
|
565
|
+
remove: (id: string, password: string) => Promise<AuraResponse<{
|
|
566
|
+
message: string;
|
|
567
|
+
mfa_enabled: boolean;
|
|
568
|
+
}>>;
|
|
569
|
+
};
|
|
456
570
|
};
|
|
571
|
+
private webauthnIndisponible;
|
|
572
|
+
/**
|
|
573
|
+
* Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
|
|
574
|
+
* `navigator.credentials.create`, confirmation). Le premier facteur du compte active le MFA et
|
|
575
|
+
* renvoie les codes de récupération (`recovery_codes`) — à afficher une seule fois.
|
|
576
|
+
*/
|
|
577
|
+
private webauthnRegister;
|
|
578
|
+
/**
|
|
579
|
+
* Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
|
|
580
|
+
* `navigator.credentials.get`, vérification. Enregistre la session et émet `SIGNED_IN`.
|
|
581
|
+
*/
|
|
582
|
+
private webauthnVerify;
|
|
583
|
+
private webauthnAnnule;
|
|
457
584
|
/** MFA : démarre l'enrôlement TOTP et renvoie le `secret` et l'URL `otpauth_url` à afficher en QR code. */
|
|
458
585
|
mfaEnroll(): Promise<AuraResponse<MfaEnrollResponse>>;
|
|
459
586
|
/** MFA : confirme l'enrôlement avec un premier code et renvoie les codes de récupération. */
|
|
@@ -544,10 +671,6 @@ declare class AuthService extends BaseService {
|
|
|
544
671
|
mailer_autoconfirm: boolean;
|
|
545
672
|
mfa_enabled: boolean;
|
|
546
673
|
}>>;
|
|
547
|
-
/** Clé publiable (anon key) du projet — GET /anon-key (public, à l'image du modèle Supabase). */
|
|
548
|
-
getAnonKey(): Promise<AuraResponse<{
|
|
549
|
-
anon_key: string;
|
|
550
|
-
}>>;
|
|
551
674
|
/**
|
|
552
675
|
* Consomme le token de récupération de mot de passe et applique le nouveau mot de passe.
|
|
553
676
|
* Body confirmé au handler (`ResetPasswordRequest` — services/aura-auth/src/handlers/auth.rs) :
|
|
@@ -598,4 +721,49 @@ declare class SessionManager {
|
|
|
598
721
|
private _stopInterval;
|
|
599
722
|
}
|
|
600
723
|
|
|
601
|
-
|
|
724
|
+
/**
|
|
725
|
+
* AUTH-021 — passkeys WebAuthn : conversions entre le JSON du serveur (champs binaires en
|
|
726
|
+
* base64url) et les objets natifs de `navigator.credentials`.
|
|
727
|
+
*
|
|
728
|
+
* Ces fonctions sont pures et exportées pour les applications qui pilotent la cérémonie
|
|
729
|
+
* elles-mêmes (React Native, extension, test) ; `auth.mfa.webauthn.register/verify` les enchaîne
|
|
730
|
+
* pour le cas courant du navigateur.
|
|
731
|
+
*/
|
|
732
|
+
/** base64url (sans remplissage) → octets. */
|
|
733
|
+
declare function base64urlToBytes(valeur: string): Uint8Array<ArrayBuffer>;
|
|
734
|
+
/** octets → base64url (sans remplissage). */
|
|
735
|
+
declare function bytesToBase64url(octets: ArrayBuffer | ArrayBufferView): string;
|
|
736
|
+
interface DescripteurJson {
|
|
737
|
+
id: string;
|
|
738
|
+
type: string;
|
|
739
|
+
transports?: string[];
|
|
740
|
+
}
|
|
741
|
+
/** Options de création telles que renvoyées par `mfa/webauthn/register/start`. */
|
|
742
|
+
interface WebAuthnCreationOptionsJson {
|
|
743
|
+
publicKey: Record<string, unknown> & {
|
|
744
|
+
challenge: string;
|
|
745
|
+
user: {
|
|
746
|
+
id: string;
|
|
747
|
+
name: string;
|
|
748
|
+
displayName: string;
|
|
749
|
+
};
|
|
750
|
+
excludeCredentials?: DescripteurJson[];
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
/** Options d'assertion telles que renvoyées par `mfa/webauthn/verify/start`. */
|
|
754
|
+
interface WebAuthnRequestOptionsJson {
|
|
755
|
+
publicKey: Record<string, unknown> & {
|
|
756
|
+
challenge: string;
|
|
757
|
+
allowCredentials?: DescripteurJson[];
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
/** Convertit les options de création du serveur en `CredentialCreationOptions` natives. */
|
|
761
|
+
declare function creationOptionsFromJson(json: WebAuthnCreationOptionsJson): CredentialCreationOptions;
|
|
762
|
+
/** Convertit les options d'assertion du serveur en `CredentialRequestOptions` natives. */
|
|
763
|
+
declare function requestOptionsFromJson(json: WebAuthnRequestOptionsJson): CredentialRequestOptions;
|
|
764
|
+
/** Sérialise la réponse de `credentials.create()` au format attendu par `register/finish`. */
|
|
765
|
+
declare function attestationToJson(cred: PublicKeyCredential): Record<string, unknown>;
|
|
766
|
+
/** Sérialise la réponse de `credentials.get()` au format attendu par `verify/finish`. */
|
|
767
|
+
declare function assertionToJson(cred: PublicKeyCredential): Record<string, unknown>;
|
|
768
|
+
|
|
769
|
+
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 };
|