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.
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();3. Trate os links dos e-mails
Os links de confirmação e de redefinição abrem a URL do site com o token na parte depois do #, que nunca chega a um servidor. Algumas linhas nessa página concluem a etapa:
// 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. 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.
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 exemploaccess_deniedouaccount_exists) e umerror_descriptionpara mostrar.