ANLEITUNG

Anmeldung und Sicherheitsregeln

Lass Leute Konten in deiner App anlegen und entscheide in der Datenbank, was jeder von ihnen sehen und ändern darf.

← Alle Anleitungen

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();

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 Beispiel access_denied oder account_exists) und eine error_description zum Anzeigen.

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.