GUIDE

Connexion et règles de sécurité

Permettez aux gens de créer un compte dans votre app et décidez, dans la base de données, ce que chacun peut voir et modifier.

← Tous les guides

1. Paramètres

Dans Authentification › Paramètres, définissez comme Site URL l'adresse de votre app. Les e-mails de confirmation et de réinitialisation du mot de passe pointent vers cette adresse. La vérification obligatoire de l'e-mail peut être désactivée (par exemple pendant vos tests). Dans Authentification, vous pouvez aussi voir vos utilisateurs, les désactiver, leur envoyer une réinitialisation du mot de passe ou les déconnecter partout.

2. Inscription et connexion

// Sign up: Espobase sends a confirmation email that links to your Site URL.
const { error } = await espobase.auth.signUp({ email, password }); // passwords need 8+ characters

// After confirming, sign in. The session is stored and refreshed automatically.
await espobase.auth.signInWithPassword({ email, password });

const { data } = await espobase.auth.getUser(); // data.user.id, data.user.email
await espobase.auth.signOut();

4. Connexion avec Google ou GitHub

Activez le fournisseur dans Authentication › Providers : créez une app OAuth chez Google ou GitHub, enregistrez l'URL de callback affichée, puis saisissez le client ID et le client secret de l'app. Le secret est stocké chiffré et n'est plus jamais affiché. Ensuite, un seul appel envoie les personnes chez le fournisseur ; elles reviennent sur l'URL de votre site (ou une URL de redirection autorisée) avec ?code=… :

// Sends the browser to Google; afterwards it comes back with ?code=… (or ?error=…).
await espobase.auth.signInWithOAuth({ provider: "google" }); // or "github"

// On the page it comes back to (your Site URL, or options.redirectTo):
const params = new URL(window.location.href).searchParams;
const code = params.get("code");
if (code) {
  const { error } = await espobase.auth.exchangeCodeForSession(code); // signs the user in
  history.replaceState(null, "", window.location.pathname);
}

Seule une adresse e-mail vérifiée par le fournisseur est acceptée. Elle rejoint un compte existant seulement si l'e-mail de ce compte est lui aussi confirmé. Si la connexion n'aboutit pas, l'URL contient ?error=… (par exemple access_denied ou account_exists) et un error_description à afficher.

5. Connexion sans mot de passe

Activez Connexion par e-mail sans mot de passe dans Authentication › Settings. Un seul e-mail contient un lien de connexion et un code à 6 chiffres ; les deux fonctionnent une fois, pendant 10 minutes. Chacun utilise le plus pratique, par exemple le code sur un autre appareil :

// Emails a sign-in link and a 6-digit code (same answer whether or not the account exists).
await espobase.auth.signInWithOtp({ email });

// The user types the code…
await espobase.auth.verifyOtp({ email, code });

// …or opens the link: your Site URL with #type=magiclink&token=…
const params = new URLSearchParams(window.location.hash.slice(1));
if (params.get("type") === "magiclink") {
  await espobase.auth.verifyOtp({ token: params.get("token")! });
  history.replaceState(null, "", window.location.pathname);
}

6. Connexion en deux étapes et changement d'e-mail

Dans Authentication › Settings, la connexion en deux étapes peut être facultative ou obligatoire : après la première étape, on saisit un code d'une application d'authentification ou d'un e-mail, ou un code de récupération. « Permettre de changer d'adresse e-mail » permet aux utilisateurs connectés de passer à une nouvelle adresse, confirmée par un lien ; l'ancienne adresse reçoit un avis.

// With two-step sign-in, a sign-in can wait for its second step:
const { error } = await espobase.auth.signInWithPassword({ email, password });
if (error?.code === "mfa_required") {
  await espobase.auth.mfa.verify({ code }); // authenticator, emailed code (mfa.challenge()) or recovery code
}

// Signed in: set up an authenticator app (show data.uri as a QR code), then confirm it with a code.
const { data } = await espobase.auth.mfa.enroll({ type: "totp" });
const { data: done } = await espobase.auth.mfa.verifyEnrollment({ factorId: data!.factorId, code });
// done.recoveryCodes: show them once

// Change the email address (confirmed by a link to the new address: #type=email_change&token=…)
await espobase.auth.updateUser({ email: newEmail, currentPassword });
await espobase.auth.verifyEmailChange({ token });

7. Règles de sécurité (sécurité au niveau des lignes)

La sécurité au niveau des lignes est activée sur chaque table : tant que vous n'ajoutez pas de politique, personne ne peut la lire ni y écrire via l'API. Dans une politique, espobase.user_id() est l'id de l'utilisateur connecté (vide pour les visiteurs non connectés).

-- Each user sees and changes only their own rows:
create policy "Own notes" on notes
  for all
  using (owner_id = espobase.user_id())
  with check (owner_id = espobase.user_id());

-- Everyone may read published posts; only signed-in users may write:
create policy "Read published posts" on posts for select using (published);
create policy "Signed-in users post" on posts for insert with check (espobase.user_id() is not null);

Dans le tableau de bord, Base de données › Politiques propose la même chose sous forme de modèles (Lecture publique, Utilisateurs connectés uniquement, L'utilisateur possède la ligne, Appartenance à l'organisation) et affiche le SQL avant de l'appliquer.

8. Quelle clé, et où

  • Clé publiable (eb_pk_…) : dans votre app et le navigateur. Chaque requête s'exécute en tant qu'utilisateur connecté (ou en tant que visiteur), ce sont donc vos politiques qui décident.
  • Clé secrète (eb_sk_…) : uniquement sur votre propre serveur, pour des tâches comme les webhooks. Elle contourne les politiques : ne l'envoyez donc jamais à un navigateur.