GUIA

Login e regras de segurança

Permita que as pessoas criem contas no seu app e decida, no banco de dados, o que cada uma pode ver e alterar.

← Todos os guias

1. Configurações

Em Autenticação › Configurações, defina a URL do site como o endereço do seu app. Os e-mails de confirmação e de redefinição de senha apontam para lá. A verificação de e-mail obrigatória pode ser desativada (por exemplo, durante os testes). Em Autenticação você também pode ver seus usuários, desativá-los, enviar uma redefinição de senha ou desconectá-los de todos os lugares.

2. Cadastro e login

// 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. Entre com Google ou GitHub

Ative o provedor em Authentication › Providers: crie um app OAuth no Google ou no GitHub, registre a URL de callback mostrada ali e informe o client ID e o client secret do app. O secret é armazenado criptografado e nunca mais exibido. Depois, uma única chamada leva as pessoas ao provedor; elas voltam para a URL do site (ou uma URL de redirecionamento permitida) com ?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);
}

Só é aceito um email verificado pelo provedor. Ele se junta a uma conta existente apenas se o email dessa conta também estiver confirmado. Se o login não puder ser concluído, a URL traz ?error=… (por exemplo access_denied ou account_exists) e um error_description para mostrar.

5. Entre sem senha

Ative Entrada por e-mail sem senha em Authentication › Settings. Um único e-mail traz um link de entrada e um código de 6 dígitos; os dois funcionam uma vez, por 10 minutos. Cada pessoa usa o que for mais fácil, por exemplo o código em outro 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ção em duas etapas e troca de e-mail

Em Authentication › Settings, a verificação em duas etapas pode ser opcional ou obrigatória: depois da primeira etapa, a pessoa digita um código de um app autenticador ou de um e-mail, ou um código de recuperação. “Permitir trocar o e-mail” deixa usuários conectados mudarem para um novo endereço, confirmado por um link; o endereço antigo recebe um 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. Regras de segurança (segurança em nível de linha)

A segurança em nível de linha está ativada em todas as tabelas: até você adicionar uma política, ninguém pode lê-las nem gravar nelas pela API. Em uma política, espobase.user_id() é o id do usuário conectado (vazio para visitantes que não entraram).

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

No painel, Banco de dados › Políticas oferece o mesmo como modelos (Leitura pública, Somente usuários conectados, Usuário é dono da linha, Associação à organização) e mostra o SQL antes de aplicá-lo.

8. Qual chave usar em cada lugar

  • Chave publicável (eb_pk_…): no seu app e no navegador. Cada requisição é executada como o usuário conectado (ou como visitante), então suas políticas decidem.
  • Chave secreta (eb_sk_…): somente no seu próprio servidor, para tarefas como webhooks. Ela ignora as políticas, então nunca a envie a um navegador.