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.
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();3. Gestisci i link delle email
I link di conferma e di reimpostazione aprono il tuo Site URL con il token nella parte dopo #, che non arriva mai a un server. Poche righe in quella pagina completano il passaggio:
// 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. 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.
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 esempioaccess_deniedoaccount_exists) e unerror_descriptionda mostrare.