GUIDA

Accesso e regole di sicurezza

Permetti alle persone di creare un account nella tua app e decidi, nel database, cosa può vedere e modificare ciascuna.

← Tutte le guide

1. Impostazioni

In Autenticazione › Impostazioni, imposta come Site URL l'indirizzo della tua app. Le email di conferma e di reimpostazione della password rimandano lì. Puoi disattivare la verifica obbligatoria dell'email (ad esempio durante i test). In Autenticazione puoi anche vedere i tuoi utenti, disattivarli, inviare loro una reimpostazione della password o disconnetterli da tutti i dispositivi.

2. Registrazione e accesso

// 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. Accedi con Google o GitHub

Attiva il provider in Authentication › Providers: crea un'app OAuth su Google o GitHub, registra l'URL di callback mostrato lì e inserisci il client ID e il client secret dell'app. Il secret è salvato cifrato e non viene più mostrato. Poi una sola chiamata porta le persone al provider; tornano all'URL del tuo sito (o a un URL di reindirizzamento consentito) con ?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);
}

Viene accettata solo un'email verificata dal provider. Si collega a un account esistente solo se anche l'email di quell'account è confermata. Se l'accesso non può concludersi, l'URL contiene ?error=… (per esempio access_denied o account_exists) e un error_description da mostrare.

5. Accedi senza password

Attiva Accesso via email senza password in Authentication › Settings. Una sola email contiene un link di accesso e un codice di 6 cifre; entrambi funzionano una volta, per 10 minuti. Ognuno usa quello più comodo, per esempio il codice su un altro dispositivo:

// 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. Verifica in due passaggi e cambio email

In Authentication › Settings la verifica in due passaggi può essere facoltativa o obbligatoria: dopo il primo passaggio si inserisce un codice da un'app di autenticazione o da un'email, oppure un codice di recupero. “Consenti di cambiare l'email” permette agli utenti connessi di passare a un nuovo indirizzo, confermato con un link; il vecchio indirizzo riceve un avviso.

// 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. Regole di sicurezza (sicurezza a livello di riga)

La sicurezza a livello di riga è attiva su ogni tabella: finché non aggiungi una policy, nessuno può leggerla o scriverci tramite l'API. In una policy, espobase.user_id() è l'id dell'utente che ha effettuato l'accesso (vuoto per i visitatori che non hanno effettuato l'accesso).

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

Nella dashboard, Database › Policy offre le stesse regole come modelli (Lettura pubblica, Solo utenti che hanno effettuato l'accesso, L'utente è proprietario della riga, Appartenenza all'organizzazione) e mostra l'SQL prima di applicarlo.

8. Quale chiave e dove

  • Chiave pubblicabile (eb_pk_…): nella tua app e nel browser. Ogni richiesta viene eseguita come l'utente che ha effettuato l'accesso (o come visitatore), quindi decidono le tue policy.
  • Chiave segreta (eb_sk_…): solo sul tuo server, per attività come i webhook. Ignora le policy, quindi non inviarla mai a un browser.