Autenticação
O EmDash usa autenticação por passkey como seu método de login principal. As passkeys são resistentes a phishing, não exigem senhas e funcionam entre dispositivos através do seu navegador ou gerenciador de senhas.
Para implantações no Cloudflare, você pode opcionalmente usar o Cloudflare Access como um provedor de autenticação alternativo.
Como Funciona
Seção intitulada “Como Funciona”As passkeys usam WebAuthn, um padrão da web que cria credenciais de chave pública armazenadas no seu dispositivo ou sincronizadas através do seu gerenciador de senhas. Quando você faz login, seu dispositivo prova a posse da credencial sem nunca enviar uma senha pela rede.
Benefícios da autenticação por passkey:
- Nenhuma senha para lembrar ou vazar
- Resistente a phishing — as credenciais estão vinculadas ao domínio do seu site
- Sincronização entre dispositivos — funciona com iCloud Keychain, Google Password Manager, 1Password, etc.
- Login rápido — um toque com biometria ou PIN
Configuração do Primeiro Usuário
Seção intitulada “Configuração do Primeiro Usuário”Na primeira vez que você acessa o painel de administração, o Assistente de Configuração guia você pela criação da sua conta de administrador.
-
Navegue até
http://localhost:4321/_emdash/admin -
Você será redirecionado para o Assistente de Configuração. Insira:
- Título do Site — O nome do seu site
- Slogan — Uma breve descrição
- E-mail do Administrador — Seu endereço de e-mail
-
Clique em Criar Site para registrar sua passkey
-
Seu navegador solicitará que você crie uma passkey:
- No macOS: Touch ID, senha do dispositivo ou chave de segurança
- No Windows: Windows Hello ou chave de segurança
- No celular: Face ID, impressão digital ou PIN
-
Uma vez que sua passkey seja registrada, você estará logado e será redirecionado para o painel de administração.
Fazendo Login
Seção intitulada “Fazendo Login”Após a configuração, retornar ao painel de administração aciona a autenticação por passkey:
-
Visite
/_emdash/admin -
Se não estiver logado, você verá a página de login
-
Clique em Entrar para autenticar
-
Seu navegador solicitará sua passkey (biometria, PIN ou chave de segurança)
-
Após a verificação, você é redirecionado para o painel de administração
Fallback por Link Mágico
Seção intitulada “Fallback por Link Mágico”Se você não puder usar sua passkey (ex.: dispositivo perdido), os links mágicos fornecem uma alternativa. Isso requer que o e-mail esteja configurado.
-
Na página de login, clique em Entrar com e-mail
-
Insira seu endereço de e-mail
-
Verifique sua caixa de entrada por um link de login
-
Clique no link para autenticar (válido por 15 minutos)
Login OAuth
Seção intitulada “Login OAuth”O EmDash suporta login OAuth com GitHub e Google quando configurado. Os usuários podem vincular suas contas após a configuração inicial da passkey.
Consulte o guia de Configuração para instruções de configuração.
Funções de Usuário
Seção intitulada “Funções de Usuário”O EmDash usa controle de acesso baseado em função com cinco níveis:
| Função | Nível | Descrição |
|---|---|---|
| Assinante | 10 | Acesso somente leitura |
| Colaborador | 20 | Criar conteúdo (precisa de aprovação) |
| Autor | 30 | Criar/editar/publicar seu próprio conteúdo |
| Editor | 40 | Gerenciar todo o conteúdo |
| Admin | 50 | Acesso total, incluindo configurações |
Cada função herda permissões de todos os níveis inferiores. O primeiro usuário é sempre criado como Admin.
Convidando Usuários
Seção intitulada “Convidando Usuários”Administradores podem convidar novos usuários através do painel de administração:
-
Vá para Configurações > Usuários
-
Clique em Convidar Usuário
-
Insira o e-mail do usuário e selecione uma função
-
Clique em Enviar Convite
-
O usuário recebe um e-mail com um link de convite
-
Eles clicam no link e registram sua passkey
Os convites são válidos por 7 dias. Os administradores podem reenviar ou revogar convites na página Usuários.
Gerenciando Passkeys
Seção intitulada “Gerenciando Passkeys”Os usuários podem gerenciar suas passkeys nas configurações da conta:
- Adicionar passkey — Registrar passkeys adicionais para backup ou outros dispositivos
- Remover passkey — Excluir passkeys que você não usa mais
- Renomear passkey — Dar nomes descritivos às passkeys
Cada usuário pode ter até 10 passkeys registradas.
Cadastro Automático
Seção intitulada “Cadastro Automático”Para sites de equipe, você pode habilitar o cadastro automático para domínios de e-mail específicos:
import { defineConfig } from "astro/config";import emdash from "emdash/astro";
export default defineConfig({ integrations: [ emdash({ auth: { selfSignup: { domains: ["example.com"], defaultRole: "contributor", }, }, }), ],});Usuários com domínios de e-mail correspondentes podem se cadastrar sem um convite. Eles receberão um e-mail de verificação e registrarão uma passkey para completar o cadastro.
Configuração de Sessão
Seção intitulada “Configuração de Sessão”As sessões usam cookies HttpOnly seguros com padrões sensatos:
js title="astro.config.mjs"emdash({ auth: { session: { maxAge: 30 * 24 * 60 * 60, // 30 days (default) sliding: true, // Reset expiry on activity }, },});Notas de Segurança
Seção intitulada “Notas de Segurança”- As passkeys são armazenadas como chaves públicas — a chave privada nunca sai do seu dispositivo
- A verificação de desafio previne ataques de repetição
- Limitação de taxa protege contra força bruta (5 tentativas/minuto/IP)
- As sessões são HttpOnly, Secure, SameSite=Lax para segurança dos cookies
- Os tokens de link mágico são hash SHA-256 — os tokens brutos nunca são armazenados
Solução de Problemas
Seção intitulada “Solução de Problemas””Nenhuma passkey registrada”
Seção intitulada “”Nenhuma passkey registrada””Se você vir este erro no login, sua passkey pode ter sido excluída do seu gerenciador de senhas. Peça a um administrador para enviar um link mágico ou novo convite.
”Autenticação por passkey falhou”
Seção intitulada “”Autenticação por passkey falhou””Isso geralmente significa que a passkey foi criada para um domínio diferente. As passkeys são vinculadas ao domínio — uma passkey para localhost:4321 não funcionará em example.com. Registre uma nova passkey para cada domínio.
”Sessão expirada”
Seção intitulada “”Sessão expirada””As sessões duram 30 dias por padrão com expiração contínua. Se você foi desconectado inesperadamente, limpe seus cookies e faça login novamente.
Perdeu todas as passkeys
Seção intitulada “Perdeu todas as passkeys”Se você perdeu o acesso a todas as suas passkeys registradas:
- Peça a outro administrador para enviar um link mágico (requer configuração de e-mail)
- Use o link mágico para fazer login
- Registre uma nova passkey nas configurações da conta
Se você for o único administrador e o e-mail não estiver configurado, será necessário redefinir a autenticação do seu site através do banco de dados.
Cloudflare Access
Seção intitulada “Cloudflare Access”Ao implantar no Cloudflare, você pode usar o Cloudflare Access como seu provedor de autenticação em vez de passkeys. O Access gerencia a autenticação na borda usando seu provedor de identidade existente.
Por que usar o Cloudflare Access?
Seção intitulada “Por que usar o Cloudflare Access?”- Single Sign-On — Os usuários se autenticam com o IdP da sua empresa
- Controle de acesso centralizado — Gerencie quem pode acessar o admin no painel do Cloudflare
- Sem gerenciamento de passkeys — Não é necessário registrar ou gerenciar passkeys
- Funções baseadas em grupos — Mapeie grupos do IdP para funções do EmDash automaticamente
Configuração
Seção intitulada “Configuração”- Crie um aplicativo Cloudflare Access para seu site EmDash
- Anote a Tag de Público-Alvo do Aplicativo (AUD) nas configurações do aplicativo
- Configure o EmDash para usar o Access:
js title="astro.config.mjs"import { defineConfig } from "astro/config";import cloudflare from "@astrojs/cloudflare";import emdash from "emdash/astro";import { d1, access } from "@emdash-cms/cloudflare";
export default defineConfig({ output: "server", adapter: cloudflare(), integrations: [ emdash({ database: d1({ binding: "DB" }), auth: access({ teamDomain: "myteam.cloudflareaccess.com", audience: "abc123def456...", // From Access app settings }), }), ],});Opções de Configuração
Seção intitulada “Opções de Configuração”| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
teamDomain | string | obrigatório | Seu domínio de equipe do Access (ex: myteam.cloudflareaccess.com) |
audience | string | obrigatório | Tag de Público-Alvo do Aplicativo (AUD) das configurações do Access |
autoProvision | boolean | true | Criar usuários do EmDash no primeiro login via Access |
defaultRole | number | 30 | Função para usuários que não correspondem a nenhum grupo (30 = Autor) |
syncRoles | boolean | false | Atualizar função em cada login com base nos grupos do IdP |
roleMapping | object | — | Mapear nomes de grupos do IdP para níveis de função |
audienceEnvVar | string | "CF_ACCESS_AUDIENCE" | Nome da variável de ambiente para a tag de público-alvo (alternativa à codificação fixa) |
Mapeamento de Funções
Seção intitulada “Mapeamento de Funções”Mapeie seus grupos do IdP para funções do EmDash:
js title="astro.config.mjs"emdash({ auth: access({ teamDomain: "myteam.cloudflareaccess.com", audience: "abc123...", roleMapping: { Admins: 50, // Admin "Content Editors": 40, // Editor Writers: 30, // Author }, defaultRole: 20, // Contributor for users not in any group }),});O primeiro grupo correspondente vence se um usuário pertencer a múltiplos grupos. O primeiro usuário a acessar o site sempre se torna Admin, independentemente dos grupos.
Comportamento de Sincronização de Funções
Seção intitulada “Comportamento de Sincronização de Funções”Por padrão (syncRoles: false), a função de um usuário é definida no primeiro login e não muda depois. Isso permite que administradores ajustem funções manualmente no EmDash.
Defina syncRoles: true se quiser que os grupos do IdP sejam autoritários — a função do usuário será atualizada em cada login com base em seus grupos atuais.
Como Funciona
Seção intitulada “Como Funciona”- Usuário visita
/_emdash/admin - O Cloudflare Access intercepta e redireciona para seu IdP
- Usuário se autentica (SSO, MFA, etc.)
- O Access define um JWT assinado na requisição
- O EmDash valida o JWT e cria/autentica o usuário
Funcionalidades Desativadas
Seção intitulada “Funcionalidades Desativadas”Quando o Access está ativado, estas funcionalidades ficam indisponíveis:
- Página de login (
/_emdash/admin/login) - Registro e gerenciamento de passkeys
- Login via OAuth
- Login via link mágico
- Auto-cadastro
- Convites de usuário
O gerenciamento de usuários é feito inteiramente através das suas políticas do Cloudflare Access.
Solução de Problemas
Seção intitulada “Solução de Problemas””Nenhum JWT do Access presente”
Seção intitulada “”Nenhum JWT do Access presente””A requisição chegou ao EmDash sem um JWT do Access. Isso significa:
- O Access não está configurado para proteger seu aplicativo
- A política do Access não está correspondendo às rotas de admin
Verifique se seu aplicativo do Access cobre /_emdash/admin/*.
”Incompatibilidade de público-alvo do JWT”
Seção intitulada “”Incompatibilidade de público-alvo do JWT””O audience na sua configuração não corresponde ao JWT. Verifique novamente a Tag de Público-Alvo do Aplicativo nas configurações do seu aplicativo Access.
”Usuário não autorizado”
Seção intitulada “”Usuário não autorizado””O usuário se autenticou via Access, mas autoProvision está false e ele não existe no EmDash. Ou:
- Defina
autoProvision: true, ou - Crie o usuário manualmente antes dele fazer login