Anmeldung und Sicherheitsregeln
Lass Leute Konten in deiner App anlegen und entscheide in der Datenbank, was jeder von ihnen sehen und ändern darf.
1. Einstellungen
Setz unter Authentifizierung › Einstellungen die Site-URL auf die Adresse deiner App. Bestätigungs- und Passwort-Zurücksetzungs-E-Mails verlinken dorthin. Die verpflichtende E-Mail-Bestätigung lässt sich ausschalten (zum Beispiel beim Testen). Unter Authentifizierung kannst du außerdem deine Nutzer sehen, sie deaktivieren, ihnen eine Passwort-Zurücksetzung senden oder sie überall abmelden.
2. Registrierung und Anmeldung
// 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. Links aus E-Mails verarbeiten
Bestätigungs- und Zurücksetzungslinks öffnen deine Site-URL mit dem Token im Teil nach #, der nie einen Server erreicht. Ein paar Zeilen auf dieser Seite schließen den Schritt ab:
// 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. Ohne Passwort anmelden
Schalte E-Mail-Anmeldung ohne Passwort unter Authentication › Settings ein. Eine E-Mail enthält einen Anmeldelink und einen 6-stelligen Code; beide funktionieren einmal, 10 Minuten lang. Man nutzt, was einfacher ist, zum Beispiel den Code auf einem anderen Gerät:
// 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. Zwei-Schritt-Anmeldung und E-Mail-Änderung
Unter Authentication › Settings kann die Zwei-Schritt-Anmeldung optional oder Pflicht sein: Nach dem ersten Schritt gibt man einen Code aus einer Authenticator-App oder einer E-Mail ein, oder einen Wiederherstellungscode. „Nutzern das Ändern der E-Mail erlauben“ lässt angemeldete Nutzer zu einer neuen Adresse wechseln, die per Link bestätigt wird; die alte Adresse bekommt einen Hinweis.
// 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. Sicherheitsregeln (Row Level Security)
Row Level Security ist für jede Tabelle aktiviert: Bis du eine Richtlinie hinzufügst, kann niemand sie über die API lesen oder beschreiben. In einer Richtlinie ist espobase.user_id() die ID des angemeldeten Nutzers (leer für Besucher, die nicht angemeldet sind).
-- 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);
Im Dashboard bietet Datenbank › Richtlinien dasselbe als Vorlagen an (Öffentlich lesbar, Nur angemeldete Nutzer, Nutzer besitzt Zeile, Organisationsmitgliedschaft) und zeigt das SQL, bevor es angewendet wird.
8. Welcher Schlüssel wohin
- Öffentlicher Schlüssel (
eb_pk_…): in deiner App und im Browser. Jede Anfrage läuft als der angemeldete Nutzer (oder als Besucher), also entscheiden deine Richtlinien. - Geheimer Schlüssel (
eb_sk_…): nur auf deinem eigenen Server, für Aufgaben wie Webhooks. Er umgeht die Richtlinien, also gib ihn nie an einen Browser weiter.
4. Anmelden mit Google oder GitHub
Schalte den Anbieter unter Authentication › Providers ein: Erstelle bei Google oder GitHub eine OAuth-App, trage dort die angezeigte Callback-URL ein und gib die Client-ID und das Client-Secret der App ein. Das Secret wird verschlüsselt gespeichert und nie wieder angezeigt. Dann schickt ein einziger Aufruf die Nutzer zum Anbieter; sie kommen mit
?code=…zu deiner Site-URL (oder einer erlaubten Weiterleitungs-URL) zurück:// 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); }Nur eine vom Anbieter bestätigte E-Mail-Adresse wird akzeptiert. Sie wird nur dann mit einem bestehenden Konto verbunden, wenn dessen E-Mail ebenfalls bestätigt ist. Klappt die Anmeldung nicht, enthält die URL
?error=…(zum Beispielaccess_deniedoderaccount_exists) und eineerror_descriptionzum Anzeigen.