@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/README.md +44 -8
- package/dist/index.cjs +338 -55
- package/dist/index.d.cts +186 -15
- package/dist/index.d.ts +186 -15
- package/dist/index.js +334 -57
- package/package.json +2 -2
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(
|
|
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 (
|
|
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)
|
|
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
|
-
|
|
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(
|
|
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 (
|
|
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)
|
|
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
|
-
|
|
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 };
|