Logo Aurabase
aurabasedocuments
documents›Guides›Authenticate users (SDK)

Authentifier les utilisateurs avec le SDK JavaScript

Les flux quotidiens de aura.auth, avec le comportement de chaque appel observé sur une pile en cours d'exécution.

11 min de lecture·Niveau intermédiaire·Révisé le 12 oct. 2026
Ce texte anglais a été généré automatiquement à partir de l’original français et n’a pas encore été relu.
La source anglaise a changé depuis cette traduction. Certaines informations peuvent être en retard.
Cette page a été traduite automatiquement. La version anglaise fait foi.
#
Les bases

1. Inscrivez-vous et connectez-vous

auth.tstypescript
import { createClient, isMfaChallenge } from '@aurabase/aurabase-js'

const aura = createClient(process.env.AURA_URL!, process.env.AURA_ANON_KEY!)

// Créer un compte
const { data, error } = await aura.auth.signUp({ email: 'ada@example.com', password: 'a-long-passphrase' })

// Connectez-vous
const login = await aura.auth.signInWithPassword({ email: 'ada@example.com', password: 'a-long-passphrase' })
if (login.error) return showError(login.error.message)
if (login.data && isMfaChallenge(login.data)) return askForTotpCode(login.data.mfa_token)
// sinon une session existe maintenant

Les deux appels renvoient la même forme. En cas de succès, data contient access_token, refresh_token, expires_in (900 secondes) et user, et le client stocke la session pour vous. La requête suivante est déjà authentifiée.

Ce que fait signUp dépend des paramètres de votre projet. Dans notre projet de test, l'utilisateur s'est connecté immédiatement avec email_verified: false, et un projet peut nécessiter d'abord une confirmation.

Échecs que vous devez gérer, comme observé :

AppelerErreur
Mauvais mot de passe401, code: 'invalid_credentials', "Identifiants invalides"
Lien ou code invalide ou expiré401, code: 'invalid_otp'
Connexion anonyme lorsque le projet la refuse403, FORBIDDEN

signInAnonymously() crée un utilisateur sans adresse e-mail, mais dans un nouveau projet, il est désactivé et renvoie 403 jusqu'à ce que vous l'activiez dans les paramètres d'authentification du projet.

#
État

2. La session et ses événements

session.tstypescript
const { data: { session } } = await aura.auth.getSession() // pas d'appel réseau : lit le magasin
const { data: user } = await aura.auth.getUser()           // demande au serveur

const { data: { subscription } } = aura.auth.onAuthStateChange(({ event, user }) => {
  // événement : 'INITIAL_SESSION' | 'SIGNÉ_IN' | 'TOKEN_REFRESHED' | 'USER_UPDATED' | 'SIGNÉ_OUT' | 'MFA_CHALLENGE'
})
subscription.unsubscribe()

Une véritable exécution a produit cette séquence : INITIAL_SESSION, SIGNED_IN (inscription), SIGNED_IN (connexion), USER_UPDATED, TOKEN_REFRESHED, SIGNED_OUT.

  • Le client actualise le jeton d'accès avant son expiration. Appelez aura.auth.refreshSession() pour le forcer.
  • getSession() est local et rapide : utilisez-le pour le rendu. Utilisez getUser() lorsque vous avez besoin de la vue actuelle de l'utilisateur sur le serveur.
  • Pour confier une session au client depuis ailleurs (un cookie, un serveur), utilisez setSession(accessToken, refreshToken). Une paire invalide est refusée et la session précédente est conservée.
  • Pour le rendu côté serveur, consultez Next.js App Router et SSR.
#
Compte

3. Profil et mot de passe

profile.tstypescript
// Métadonnées : transmettez-les dans `data`
await aura.auth.updateUser({ data: { theme: 'dark', plan: 'free' } })
// → user.user_metadata est { plan : 'free', theme: 'dark' }, et getUser() renvoie la même chose

// Changer l'e-mail : l'adresse ne change PAS encore
await aura.auth.updateUser({ email: 'new@example.com' })
// Un lien de confirmation mène à la nouvelle adresse. Jusqu'à ce qu'il soit utilisé, user.email conserve l'ancienne valeur.
// Confirmez avec : aura.auth.verifyOtp({ type : 'email_change', token })

// Changer le mot de passe
await aura.auth.updatePassword('a-new-long-passphrase', 'a-long-passphrase')
Changer le mot de passe vous déconnecte

Le serveur révoque toutes les sessions lorsque le mot de passe change. updatePassword efface la session locale et émet SIGNED_OUT: reconnectez-vous avec le nouveau mot de passe. Lors d'une exécution réelle, getSession() était vide juste après l'appel et la connexion avec le nouveau mot de passe a fonctionné.

Mot de passe oublié : aura.auth.resetPasswordForEmail({ email }) envoie l'e-mail de réinitialisation. L'utilisateur le complète ensuite avec verifyOtp({ type: 'recovery', token, password }).

Supprimer le compte : aura.auth.deleteUser(password) demande le mot de passe actuel, supprime le compte et efface la session locale.

#
Alternatives

4. Liens, codes et OAuth

passwordless.tstypescript
// Lien magique par e-mail
await aura.auth.signInWithMagicLink({ email })
// → { message : "Si cet email existe, un lien de connexion a été envoyé" }
// La réponse est la même, que le compte existe ou non : il ne fait pas fuir les comptes.

// Codes à usage unique
await aura.auth.signInWithEmailOtp(email)
await aura.auth.signInWithSmsOtp(phone)
await aura.auth.verifyOtp({ type: 'email', email, code })     // aussi : 'sms', 'magiclink', 'inscription', 'récupération', 'email_change'

// OAuth: le fournisseur est le PREMIER argument, une chaîne
const { data } = await aura.auth.signInWithOAuth('google', { redirectTo: 'https://app.example.com/callback' })
window.location.href = data!.url

signInWithOAuth renvoie l'URL à ouvrir ; il ne navigue pas tout seul. Le fournisseur doit être activé et configuré dans le projet, sinon l'URL de démarrage répond PROVIDER_NOT_CONFIGURED.

Pas le formulaire supabase-js

signInWithOAuth({ provider: 'google' }) renvoie l'erreur invalid_provider. Passez le fournisseur comme premier argument.

Après la redirection, le client lit lui-même la session à partir de l'URL (detectSessionInUrl). Pour le flux PKCE, transmettez flowType: 'pkce', conservez le magasin persistant par défaut et le client échange le code pour vous.

Associez un deuxième fournisseur à un compte connecté avec linkIdentity(provider), répertoriez-le avec listIdentities() et supprimez-en un avec unlinkIdentity(identityId).

#
Deuxième facteur

5. Authentification multifacteur

mfa.tstypescript
// 1. S'inscrire : afficher le code QR créé à partir de otpauth_url
const { data: enrol } = await aura.auth.mfaEnroll()   // → { secret, otpauth_url }
// 2. Confirmez avec le premier code de l'application d'authentification : vous recevez des codes de récupération
const { data: confirm } = await aura.auth.mfaVerifySetup(codeFromApp) // → { codes_de récupération : [...] }

// 3. Désormais, la connexion renvoie un défi au lieu d'une session
const login = await aura.auth.signInWithPassword({ email, password })
if (login.data && isMfaChallenge(login.data)) {
  await aura.auth.mfaVerify({ mfa_token: login.data.mfa_token, code: codeFromApp })
}

mfaUnenroll(password) le désactive et regenerateRecoveryCodes(code) émet de nouveaux codes de récupération. Un défi émet MFA_CHALLENGE et aucune session n'est stockée jusqu'à ce que mfaVerify réussisse.

#
Appareils

6. Appareils et sessions

devices.tstypescript
const { data } = await aura.auth.listSessions()
// [{ id, device_info, ip_address, create_at, expires_at, last_used_at, is_current }, …]

await aura.auth.revokeSession(sessionId)   // déconnecter un appareil
await aura.auth.revokeAllSessions()        // déconnectez-vous partout, y compris celui-ci
await aura.auth.signOut()                  // cet appareil uniquement

is_current marque la session que vous utilisez. signOut révoque le jeton d'actualisation sur le serveur lorsqu'il y en a un, efface la session locale et émet SIGNED_OUT.

#
Serveur

7. Administrer les utilisateurs

La gestion des utilisateurs nécessite une clé service_role. Il est disponible uniquement sur le serveur : la lecture de aura.authAdmin dans un navigateur génère une erreur.

server/users.tstypescript
import { createAdminClient } from '@aurabase/aurabase-js'

const admin = createAdminClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

const { data: users } = await admin.authAdmin.listUsers({ limit: 20, search: 'ada' })
const { data: created } = await admin.authAdmin.createUser({ email: 'bob@example.com', password: 'a-long-passphrase', email_verified: true })
await admin.authAdmin.banUser(created!.id)
await admin.authAdmin.unbanUser(created!.id)
const { data: link } = await admin.authAdmin.generateLink(created!.id, 'magic') // → { lien, jeton }
await admin.authAdmin.deleteUser(created!.id)

const { data: stats } = await admin.authAdmin.getUserStats() // → { total, vérifié, banni, mfa_enabled, new_7d }

generateLink accepte 'magic', 'recovery' ou 'invite'. Le client administrateur gère également les paramètres d'authentification du projet (getSettings, updateSettings), les modèles de courrier électronique, les sessions de chaque utilisateur et le journal d'audit (getAuditLog). Chaque méthode est répertoriée dans la référence d'authentification .

Dernière mise à jour · 12 oct. 2026