@aurabase/auth 0.4.1 → 0.5.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/dist/index.d.cts CHANGED
@@ -1,16 +1,85 @@
1
- import { BaseService, AuraClientLike, AuthChangePayload, SignUpRequest, AuraResponse, LoginResponse, SignInRequest, OAuthSignInOptions, MagicLinkRequest, TokenPair, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, IdentityInfo, MfaChallenge, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, AdminSessionInfo, AuditLogEntry, AuthSettings, EmailTemplateUpdate } 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, MagicLinkRequest, TokenPair, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
2
+
3
+ declare class AuthAdminService extends BaseService {
4
+ /**
5
+ * Préfixe des routes de ce service. Aucun identifiant de projet : il est injecté par
6
+ * la passerelle depuis le sous-domaine du projet (`inject_project_id`,
7
+ * `services/aura-gateway/src/middleware/project_subdomain.rs`).
8
+ */
9
+ private get prefix();
10
+ listUsers(params?: {
11
+ limit?: number;
12
+ offset?: number;
13
+ search?: string;
14
+ }): Promise<AuraResponse<AdminUser[]>>;
15
+ getUser(userId: string): Promise<AuraResponse<AdminUser>>;
16
+ createUser(data: AdminCreateUserRequest): Promise<AuraResponse<AdminUser>>;
17
+ updateUser(userId: string, data: AdminUpdateUserRequest): Promise<AuraResponse<AdminUser>>;
18
+ deleteUser(userId: string): Promise<AuraResponse<null>>;
19
+ banUser(userId: string): Promise<AuraResponse<null>>;
20
+ unbanUser(userId: string): Promise<AuraResponse<null>>;
21
+ generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
22
+ getUserStats(): Promise<AuraResponse<UserStats>>;
23
+ listUserIdentities(userId: string): Promise<AuraResponse<IdentityInfo[]>>;
24
+ listSessions(params?: {
25
+ userId?: string;
26
+ limit?: number;
27
+ offset?: number;
28
+ }): Promise<AuraResponse<AdminSessionInfo[]>>;
29
+ revokeSession(sessionId: string): Promise<AuraResponse<null>>;
30
+ getAuditLog(params?: {
31
+ userId?: string;
32
+ limit?: number;
33
+ offset?: number;
34
+ }): Promise<AuraResponse<AuditLogEntry[]>>;
35
+ getSettings(): Promise<AuraResponse<AuthSettings>>;
36
+ /**
37
+ * Met à jour les réglages auth du projet (fusion partielle : seuls les champs fournis
38
+ * sont écrits, `COALESCE` côté backend).
39
+ *
40
+ * Le corps est un {@link AuthSettingsUpdate}, PAS un `Partial<AuthSettings>` : la vue de
41
+ * lecture ne sait pas porter les secrets write-only (`smtp_password`, `webhook_secret`,
42
+ * `captcha_secret_key`, `sms_api_key`/`sms_api_secret`, `hook_secret`) ni les drapeaux
43
+ * d'effacement (`smtp_clear`, `sms_clear`, `oauth_credentials_clear`), et porte à l'inverse
44
+ * des projections (`smtp_password_set`, `hook_secret_set`, `updated_at`…) que le backend
45
+ * REFUSE.
46
+ *
47
+ * Le serveur refuse aussi bien un champ inconnu qu'un `null` explicite — `400` dans les deux
48
+ * cas, le champ fautif est nommé. Ce n'est plus seulement un contrôle TypeScript : ne
49
+ * renvoyez donc pas tel quel un objet lu par {@link getSettings}.
50
+ */
51
+ updateSettings(data: AuthSettingsUpdate): Promise<AuraResponse<AuthSettings>>;
52
+ listEmailTemplates(): Promise<AuraResponse<Record<string, unknown>[]>>;
53
+ getEmailTemplate(type: string): Promise<AuraResponse<Record<string, unknown>>>;
54
+ updateEmailTemplate(type: string, data: EmailTemplateUpdate): Promise<AuraResponse<Record<string, unknown>>>;
55
+ deleteEmailTemplate(type: string): Promise<AuraResponse<{
56
+ message: string;
57
+ }>>;
58
+ testEmailTemplate(type: string, body: {
59
+ to_email: string;
60
+ }): Promise<AuraResponse<null>>;
61
+ }
2
62
 
3
63
  /**
4
- * Types d'OTP « email » (parité `EmailOtpType` de supabase-js). Tous ne sont pas
5
- * exercables côté backend Aurabase : `invite` n'a aucun endpoint (→ `verifyOtp`
6
- * lève `otp_type_unsupported`). Conservé dans l'union pour la parité de surface.
64
+ * Types d'OTP « email » — ceux qu'Aurabase EXERCE réellement.
65
+ *
66
+ * F4 — `invite` a été RETIRÉ. Il n'a jamais eu d'endpoint de vérification côté backend
67
+ * (`services/aura-auth/src/main.rs` ne déclare ni `/invite` ni équivalent) : il n'était
68
+ * présent que « pour la parité de surface » avec supabase-js, et `verifyOtp` y répondait
69
+ * `otp_type_unsupported`. Une surface qui ne mène nulle part n'est pas de la parité, c'est
70
+ * une promesse fausse que le typage rendait crédible : elle a été supprimée.
71
+ *
72
+ * À ne pas confondre avec {@link GenerateLinkType} (`@aurabase/core`), où `invite` est bien
73
+ * servi — mais par l'API ADMIN (`POST /admin/users/{id}/generate-link`,
74
+ * `aura-auth/src/handlers/admin.rs`), qui ÉMET un lien ; c'est sa CONSOMMATION en OTP qui
75
+ * n'existe pas.
7
76
  */
8
- type EmailOtpType = 'signup' | 'invite' | 'magiclink' | 'recovery' | 'email_change' | 'email';
77
+ type EmailOtpType = 'signup' | 'magiclink' | 'recovery' | 'email_change' | 'email';
9
78
  /**
10
- * Types d'OTP « mobile » (parité `MobileOtpType` de supabase-js). `phone_change`
11
- * n'a aucun endpoint backend (→ `otp_type_unsupported`).
79
+ * Types d'OTP « mobile ». F4 — `phone_change` a été RETIRÉ pour la même raison
80
+ * qu'`invite` : aucun endpoint backend, donc aucune vérification possible.
12
81
  */
13
- type MobileOtpType = 'sms' | 'phone_change';
82
+ type MobileOtpType = 'sms';
14
83
  interface VerifySignupOtpParams {
15
84
  type: 'signup';
16
85
  /** Jeton reçu par email (lien de confirmation d'inscription). */
@@ -49,24 +118,13 @@ interface VerifyRecoveryOtpParams {
49
118
  */
50
119
  password: string;
51
120
  }
52
- /** Type de surface (parité) sans endpoint backend → `otp_type_unsupported`. */
53
- interface VerifyInviteOtpParams {
54
- type: 'invite';
55
- token: string;
56
- }
57
- /** Type de surface (parité) sans endpoint backend → `otp_type_unsupported`. */
58
- interface VerifyPhoneChangeOtpParams {
59
- type: 'phone_change';
60
- phone: string;
61
- token: string;
62
- }
63
121
  /**
64
- * Union discriminée par `type` de la façade `verifyOtp` (parité surface
65
- * `@supabase/auth-js`). Chaque variante route vers l'endpoint historique
66
- * correspondant. `invite`/`phone_change` restent dans l'union pour la parité
67
- * mais lèvent `otp_type_unsupported` tant que le backend ne les expose pas.
122
+ * Union discriminée par `type` de la façade `verifyOtp`. Chaque variante route vers un
123
+ * endpoint qui EXISTE — l'union est la liste de ce que le produit sait faire, pas celle de
124
+ * ce qu'un autre produit expose (F4 : `invite` et `phone_change` en ont été retirés, faute
125
+ * d'endpoint de vérification côté backend).
68
126
  */
69
- type VerifyOtpParams = VerifySignupOtpParams | VerifyMagiclinkOtpParams | VerifyEmailOtpParams | VerifySmsOtpParams | VerifyEmailChangeOtpParams | VerifyRecoveryOtpParams | VerifyInviteOtpParams | VerifyPhoneChangeOtpParams;
127
+ type VerifyOtpParams = VerifySignupOtpParams | VerifyMagiclinkOtpParams | VerifyEmailOtpParams | VerifySmsOtpParams | VerifyEmailChangeOtpParams | VerifyRecoveryOtpParams;
70
128
 
71
129
  type AuthStateCallback = (payload: AuthChangePayload) => void;
72
130
  interface AuthServiceOptions {
@@ -98,6 +156,9 @@ declare class AuthService extends BaseService {
98
156
  * Détecte et consomme une session présente dans l'URL courante au boot (callback
99
157
  * OAuth), à l'image de `detectSessionInUrl` de supabase-js :
100
158
  * - fragment `#access_token=…&refresh_token=…` (flux implicit) → `setSession`.
159
+ * - fragment `#mfa_token=…` (atterrissage `{redirectTo}/oauth/mfa` d'un utilisateur MFA au
160
+ * retour d'OAuth) → émet `MFA_CHALLENGE` avec `mfaToken` (AUCUNE session posée : le défi
161
+ * reste à relever via `mfaVerify`).
101
162
  * - query `?token=…&type=recovery` (lien de récupération de mot de passe) → émet
102
163
  * `PASSWORD_RECOVERY` avec `recoveryToken` (AUCUNE session posée, PAS de `SIGNED_IN`).
103
164
  * - query `?code=…` (flux PKCE) → `exchangeCodeForSession` (relit le verifier).
@@ -117,8 +178,23 @@ declare class AuthService extends BaseService {
117
178
  private _applyRemoteState;
118
179
  /** Démonte le cycle de vie proactif : ticker, visibilité, BroadcastChannel, listeners. */
119
180
  dispose(): void;
181
+ /**
182
+ * Préfixe des routes de ce service. Aucun identifiant de projet : il est injecté par
183
+ * la passerelle depuis le sous-domaine du projet (`inject_project_id`,
184
+ * `services/aura-gateway/src/middleware/project_subdomain.rs`).
185
+ */
120
186
  private get prefix();
121
- /** Clé project-scoped du `code_verifier` PKCE (anti-collision multi-projets). */
187
+ /**
188
+ * `project_id` de la SESSION en cours, lu dans le token stocké — seule référence de projet
189
+ * dont dispose encore le client (voir SEC-F2 dans `getClaims`). `null` s'il n'y a pas de
190
+ * session, si le token est illisible, ou s'il ne porte pas ce claim.
191
+ */
192
+ private _sessionProjectId;
193
+ /**
194
+ * Clé du `code_verifier` PKCE, scopée par la PORTÉE du client (`clientScope`, dérivée de
195
+ * l'URL du projet) : deux clients de deux projets instanciés dans la MÊME page partagent
196
+ * un seul `localStorage`, et ne doivent pas se marcher dessus.
197
+ */
122
198
  private get _pkceVerifierKey();
123
199
  /**
124
200
  * Clé project-scoped du MARQUEUR d'initiation du flux OAuth implicit (SEC-F3).
@@ -134,6 +210,36 @@ declare class AuthService extends BaseService {
134
210
  private _emitEvent;
135
211
  signUp(req: SignUpRequest): Promise<AuraResponse<LoginResponse>>;
136
212
  signInWithPassword(req: SignInRequest): Promise<AuraResponse<LoginResponse>>;
213
+ /**
214
+ * Démarre un flux OAuth : renvoie toujours `{ url }` (et redirige en plus le navigateur
215
+ * si un `window` existe).
216
+ *
217
+ * ### `options.queryParams` — contrat (N22)
218
+ *
219
+ * Les clés listées par {@link OAUTH_FORWARDABLE_QUERY_PARAMS} — `prompt`, `login_hint`,
220
+ * `display`, `ui_locales`, `max_age`, `acr_values`, `claims_locales`, `access_type`,
221
+ * `include_granted_scopes`, `hd` — sont **réellement transmises au provider**, jusque
222
+ * dans l'URL d'autorisation.
223
+ *
224
+ * Toute autre clé est **refusée** : la méthode renvoie
225
+ * `error.code === 'invalid_oauth_query_param'` et n'amorce aucune redirection. Rien
226
+ * n'est jamais accepté puis jeté en silence. Sont notamment refusés :
227
+ * - les paramètres du protocole (`state`, `nonce`, `client_id`, `response_type`,
228
+ * `scope`, `code_challenge`…) — ils sont calculés par le serveur ;
229
+ * - les paramètres construits par cette méthode (`redirect_uri`, `scopes`) — passez par
230
+ * `redirectTo`, `scopes` ou `flowType` ;
231
+ * - `project_id` : le projet est porté par l'URL du client, jamais par un paramètre ;
232
+ * - les variantes de casse (`Prompt`, `State`) et les clés inconnues.
233
+ *
234
+ * L'autorité est le **backend** (`OAUTH_FORWARDABLE_PARAMS` de
235
+ * `services/aura-auth/src/handlers/oauth.rs`), qui répond `400` sur les mêmes règles :
236
+ * l'endpoint de démarrage est public et appelable sans SDK. Ce filtre-ci n'est que son
237
+ * miroir, pour échouer avant la redirection ; un test de parité interdit qu'ils divergent.
238
+ *
239
+ * Les **valeurs**, elles, ne sont validées que par le backend (non vide, sans caractère
240
+ * de contrôle, 512 caractères au plus, jamais deux fois la même clé) — un manquement
241
+ * donne un `400` au démarrage du flux, pas une erreur de cette méthode.
242
+ */
137
243
  signInWithOAuth(provider: string, options?: OAuthSignInOptions): Promise<AuraResponse<{
138
244
  url: string;
139
245
  }>>;
@@ -163,7 +269,17 @@ declare class AuthService extends BaseService {
163
269
  user: User | null;
164
270
  }>;
165
271
  setSession(accessToken: string, refreshToken: string): Promise<AuraResponse<User>>;
166
- exchangeCodeForSession(authCode: string, codeVerifier?: string): Promise<AuraResponse<TokenPair>>;
272
+ /**
273
+ * Échange le code d'autorisation PKCE contre une session.
274
+ *
275
+ * Renvoie un `LoginResponse`, PAS un `TokenPair` : si l'utilisateur a le MFA actif, le
276
+ * backend répond `{ mfa_required: true, mfa_token }` (gate « C1-bis » de
277
+ * `POST /oauth/pkce`) au lieu d'une paire de jetons. Dans ce cas AUCUNE session n'est
278
+ * enregistrée et `MFA_CHALLENGE` est émis avec le `mfaToken` : l'application demande le
279
+ * code TOTP puis appelle `mfaVerify({ mfa_token, code })`. Discriminez avec
280
+ * {@link isMfaChallenge}.
281
+ */
282
+ exchangeCodeForSession(authCode: string, codeVerifier?: string): Promise<AuraResponse<LoginResponse>>;
167
283
  /**
168
284
  * Cœur de l'échange PKCE. `successEvent` détermine l'événement émis en cas de
169
285
  * succès : `SIGNED_IN` (connexion normale) ou `PASSWORD_RECOVERY` (callback de
@@ -232,11 +348,9 @@ declare class AuthService extends BaseService {
232
348
  message: string;
233
349
  }>>;
234
350
  /**
235
- * Façade unifiée de vérification OTP (parité `verifyOtp` de `@supabase/auth-js`).
236
- * Route vers l'endpoint historique correct selon `params.type`, en conservant
237
- * l'effet de bord (sauvegarde de session + émission d'événement). SOURCE DE
238
- * VÉRITÉ UNIQUE : les méthodes historiques (`verifyEmail`, `verifySmsOtp`, …)
239
- * délèguent désormais ici.
351
+ * Point d'entrée UNIQUE de la vérification OTP (parité `verifyOtp` de `@supabase/auth-js`).
352
+ * Route vers l'endpoint correct selon `params.type`, en conservant l'effet de bord
353
+ * (sauvegarde de session + émission d'événement).
240
354
  *
241
355
  * Mapping :
242
356
  * - `signup` → POST /verify-email `{ token }` → SIGNED_IN
@@ -249,9 +363,11 @@ declare class AuthService extends BaseService {
249
363
  * Divergences documentées :
250
364
  * - `recovery` EXIGE `password` (le backend fusionne consommation du token +
251
365
  * changement de mot de passe) → `AuraError('missing_password')` sans appel réseau sinon.
252
- * - `invite`/`phone_change` n'ont aucun endpoint backend → `AuraError('otp_type_unsupported')`.
253
- * - `email_change` émet dorénavant `USER_UPDATED` (auparavant aucun événement) —
254
- * amélioration assumée (parité), pas une régression.
366
+ * - F4 : `invite` et `phone_change` ont été RETIRÉS de la surface. Ils n'ont jamais eu
367
+ * d'endpoint de vérification côté backend et ne pouvaient que rendre
368
+ * `otp_type_unsupported` ; le `default` ci-dessous couvre désormais toute valeur
369
+ * inconnue reçue d'un appelant JavaScript non typé.
370
+ * - `email_change` renvoie un `User` (pas une `TokenPair`) et émet `USER_UPDATED`.
255
371
  */
256
372
  verifyOtp(params: VerifyEmailChangeOtpParams): Promise<AuraResponse<User>>;
257
373
  verifyOtp(params: Exclude<VerifyOtpParams, VerifyEmailChangeOtpParams>): Promise<AuraResponse<TokenPair>>;
@@ -260,21 +376,15 @@ declare class AuthService extends BaseService {
260
376
  * l'endpoint, puis (succès) sauvegarde la session et émet `SIGNED_IN`.
261
377
  */
262
378
  private _verifyToTokenPair;
263
- /** Rétrocompat : délègue à `verifyOtp({ type: 'signup' })` (POST /verify-email). */
264
- verifyEmail(token: string): Promise<AuraResponse<TokenPair>>;
265
379
  resendVerificationEmail(email?: string): Promise<AuraResponse<{
266
380
  message: string;
267
381
  }>>;
268
382
  signInWithEmailOtp(email: string): Promise<AuraResponse<{
269
383
  message: string;
270
384
  }>>;
271
- /** Rétrocompat : délègue à `verifyOtp({ type: 'email' })` (POST /email-otp/verify). */
272
- verifyEmailOtp(email: string, code: string): Promise<AuraResponse<TokenPair>>;
273
385
  signInWithSmsOtp(phone: string): Promise<AuraResponse<{
274
386
  message: string;
275
387
  }>>;
276
- /** Rétrocompat : délègue à `verifyOtp({ type: 'sms' })` (POST /sms/verify). */
277
- verifySmsOtp(phone: string, code: string): Promise<AuraResponse<TokenPair>>;
278
388
  listIdentities(): Promise<AuraResponse<IdentityInfo[]>>;
279
389
  linkIdentity(provider: string): Promise<AuraResponse<{
280
390
  url: string;
@@ -283,16 +393,18 @@ declare class AuthService extends BaseService {
283
393
  unlinkIdentity(identityId: string): Promise<AuraResponse<{
284
394
  message: string;
285
395
  }>>;
286
- /**
287
- * Rétrocompat : délègue à `verifyOtp({ type: 'email_change' })`.
288
- * CHANGEMENT ASSUMÉ (parité) : émet désormais `USER_UPDATED` (auparavant aucun
289
- * événement) — voir CHANGELOG.
290
- */
291
- confirmEmailChange(token: string): Promise<AuraResponse<User>>;
292
396
  regenerateRecoveryCodes(code: string): Promise<AuraResponse<{
293
397
  recovery_codes: string[];
294
398
  }>>;
295
- signInWithIdToken(provider: string, idToken: string, accessToken?: string): Promise<AuraResponse<TokenPair>>;
399
+ /**
400
+ * Échange un ID token de provider (Google/Apple, mobile natif) contre une session.
401
+ *
402
+ * Renvoie un `LoginResponse`, PAS un `TokenPair` : comme partout ailleurs, un utilisateur
403
+ * avec MFA actif reçoit `{ mfa_required: true, mfa_token }` et AUCUNE session n'est
404
+ * enregistrée — `MFA_CHALLENGE` est émis, à relever par `mfaVerify`. Discriminez avec
405
+ * {@link isMfaChallenge}.
406
+ */
407
+ signInWithIdToken(provider: string, idToken: string, accessToken?: string): Promise<AuraResponse<LoginResponse>>;
296
408
  /** GoTrue parity : GET /settings — config publique du projet (pas d'auth requise). */
297
409
  getSettings(): Promise<AuraResponse<{
298
410
  disable_signup: boolean;
@@ -325,46 +437,6 @@ declare class AuthService extends BaseService {
325
437
  verifyMagicLink(token: string): Promise<AuraResponse<TokenPair>>;
326
438
  }
327
439
 
328
- declare class AuthAdminService extends BaseService {
329
- private get prefix();
330
- listUsers(params?: {
331
- limit?: number;
332
- offset?: number;
333
- search?: string;
334
- }): Promise<AuraResponse<AdminUser[]>>;
335
- getUser(userId: string): Promise<AuraResponse<AdminUser>>;
336
- createUser(data: AdminCreateUserRequest): Promise<AuraResponse<AdminUser>>;
337
- updateUser(userId: string, data: AdminUpdateUserRequest): Promise<AuraResponse<AdminUser>>;
338
- deleteUser(userId: string): Promise<AuraResponse<null>>;
339
- banUser(userId: string): Promise<AuraResponse<null>>;
340
- unbanUser(userId: string): Promise<AuraResponse<null>>;
341
- generateLink(userId: string, type: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
342
- getUserStats(): Promise<AuraResponse<UserStats>>;
343
- listUserIdentities(userId: string): Promise<AuraResponse<IdentityInfo[]>>;
344
- listSessions(params?: {
345
- userId?: string;
346
- limit?: number;
347
- offset?: number;
348
- }): Promise<AuraResponse<AdminSessionInfo[]>>;
349
- revokeSession(sessionId: string): Promise<AuraResponse<null>>;
350
- getAuditLog(params?: {
351
- userId?: string;
352
- limit?: number;
353
- offset?: number;
354
- }): Promise<AuraResponse<AuditLogEntry[]>>;
355
- getSettings(): Promise<AuraResponse<AuthSettings>>;
356
- updateSettings(data: Partial<AuthSettings>): Promise<AuraResponse<AuthSettings>>;
357
- listEmailTemplates(): Promise<AuraResponse<Record<string, unknown>[]>>;
358
- getEmailTemplate(type: string): Promise<AuraResponse<Record<string, unknown>>>;
359
- updateEmailTemplate(type: string, data: EmailTemplateUpdate): Promise<AuraResponse<Record<string, unknown>>>;
360
- deleteEmailTemplate(type: string): Promise<AuraResponse<{
361
- message: string;
362
- }>>;
363
- testEmailTemplate(type: string, body: {
364
- to_email: string;
365
- }): Promise<AuraResponse<null>>;
366
- }
367
-
368
440
  interface SessionManagerOptions {
369
441
  channelName: string;
370
442
  enabled: boolean;
@@ -394,4 +466,4 @@ declare class SessionManager {
394
466
  private _stopInterval;
395
467
  }
396
468
 
397
- export { AuthAdminService, AuthService, type EmailOtpType, type MobileOtpType, SessionManager, type SessionManagerOptions, type VerifyEmailChangeOtpParams, type VerifyEmailOtpParams, type VerifyInviteOtpParams, type VerifyMagiclinkOtpParams, type VerifyOtpParams, type VerifyPhoneChangeOtpParams, type VerifyRecoveryOtpParams, type VerifySignupOtpParams, type VerifySmsOtpParams, isMfaChallenge };
469
+ 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 };