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.
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();3. Gérez les liens des e-mails
Les liens de confirmation et de réinitialisation ouvrent votre Site URL avec le jeton dans la partie après #, qui n'atteint jamais un serveur. Quelques lignes sur cette page terminent l'étape :
// On the page your Site URL points to: email links carry the token after "#".
const params = new URLSearchParams(window.location.hash.slice(1));
const token = params.get("token");
if (token && params.get("type") === "signup") {
await espobase.auth.verifyEmail({ token }); // confirms the address and signs the user in
}
if (token && params.get("type") === "recovery") {
// Show a "new password" form, then:
await espobase.auth.resetPassword({ token, password: newPassword });
}
history.replaceState(null, "", window.location.pathname); // remove the token from the address bar// "Forgot password": sends a reset link to the Site URL (#type=recovery&token=…). await espobase.auth.resetPasswordForEmail(email);
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.
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 exempleaccess_deniedouaccount_exists) et unerror_descriptionà afficher.