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.
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();3. Gestiona los enlaces de los correos
Los enlaces de confirmación y de restablecimiento abren tu Site URL con el token en la parte que va después de #, que nunca llega a un servidor. Unas pocas líneas en esa página completan el paso:
// 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. 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.
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 ejemploaccess_deniedoaccount_exists) y unerror_descriptionpara mostrar.