GUÍA

Inicio de sesión y reglas de seguridad

Permite que las personas creen cuentas en tu app y decide, en la base de datos, qué puede ver y cambiar cada una.

← Todas las guías

1. Configuración

En Autenticación › Configuración, define como Site URL la dirección de tu app. Los correos de confirmación y de restablecimiento de contraseña enlazan ahí. Puedes desactivar la verificación de correo obligatoria (por ejemplo, mientras haces pruebas). En Autenticación también puedes ver a tus usuarios, desactivarlos, enviarles un restablecimiento de contraseña o cerrar todas sus sesiones.

2. Registro e inicio de sesión

// 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. Inicia sesión con Google o GitHub

Activa el proveedor en Authentication › Providers: crea una app OAuth en Google o GitHub, registra la URL de callback que aparece ahí e ingresa el client ID y el client secret de la app. El secret se guarda cifrado y no se vuelve a mostrar. Luego, una sola llamada envía a las personas al proveedor; vuelven a tu URL del sitio (o a una URL de redirección permitida) 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);
}

Solo se acepta un email verificado por el proveedor. Se une a una cuenta existente solo si el email de esa cuenta también está confirmado. Si el inicio de sesión no puede completarse, la URL lleva ?error=… (por ejemplo access_denied o account_exists) y un error_description para mostrar.

5. Inicia sesión sin contraseña

Activa Inicio de sesión por correo sin contraseña en Authentication › Settings. Un solo correo lleva un enlace de inicio de sesión y un código de 6 dígitos; ambos funcionan una vez, durante 10 minutos. Cada persona usa lo que le resulte más fácil, por ejemplo el código en otro 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. Verificación en dos pasos y cambio de correo

En Authentication › Settings, la verificación en dos pasos puede ser opcional u obligatoria: después del primer paso, cada persona introduce un código de una app de autenticación o de un correo, o un código de recuperación. “Permitir cambiar el correo” deja que los usuarios con sesión iniciada pasen a una nueva dirección, confirmada con un enlace; la dirección anterior recibe un aviso.

// 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. Reglas de seguridad (seguridad a nivel de fila)

La seguridad a nivel de fila está activada en todas las tablas: hasta que agregues una política, nadie puede leerlas ni escribir en ellas a través de la API. En una política, espobase.user_id() es el id del usuario que inició sesión (vacío para los visitantes que no han iniciado sesión).

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

En el panel, Base de datos › Políticas ofrece lo mismo como plantillas (Public read, Authenticated only, User owns row, Organization membership) y muestra el SQL antes de aplicarlo.

8. Qué clave usar en cada lugar

  • Clave publicable (eb_pk_…): en tu app y en el navegador. Cada solicitud se ejecuta como el usuario que inició sesión (o como visitante), así que tus políticas deciden.
  • Clave secreta (eb_sk_…): solo en tu propio servidor, para tareas como webhooks. Omite las políticas, así que nunca la envíes a un navegador.