ENGENHARIA

Autenticação e captcha configuráveis no RustCMS

27 AGO 2026 ◆ 2 MIN DE LEITURA ◆ 67 VISUALIZAÇÕES

A ideia: tudo opcional, nada fixo no código

O RustCMS nasceu como projeto genérico, feito para ser reaproveitado em instalações diferentes. Por isso quase todo recurso sensível a ambiente é opcional e configurável por variável de ambiente. O arquivo .env (a partir do modelo .env.exemplo) é a única fonte de configuração — nada disso exige recompilar o binário.

A regra geral: se as credenciais de um provedor não estiverem preenchidas, o recurso simplesmente não aparece. O botão some da tela de login e nenhum código morto fica ativo.

Login local (sempre ligado)

A autenticação por e-mail e senha usa Argon2id e está sempre disponível. É o piso: mesmo sem nenhum provedor externo, dá para administrar o CMS. Cada usuário pode ativar MFA por TOTP (Google Authenticator, Authy, etc.), e o administrador pode tornar o MFA obrigatório para todos:

MFA_OBRIGATORIO=false

Login com Google

Basta criar um par de credenciais OAuth no Google Cloud Console e registrar a URI de redirecionamento.

# ─── OIDC — Google (opcional) ────────────────────────────
# Deixe vazio para desabilitar o botão "Entrar com Google"
# Obtenha as credenciais em: https://console.cloud.google.com/apis/credentials
# Authorized redirect URI: {BASE_URL}/auth/google/callback
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

Preencheu os dois campos, o botão aparece. Deixou em branco, ele não existe.

Login com Microsoft

Mesma lógica, com um detalhe a mais: o tenant, que controla quais contas podem entrar.

# ─── OIDC — Microsoft (opcional) ─────────────────────────
# Deixe vazio para desabilitar o botão "Entrar com Microsoft"
# Obtenha as credenciais em: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps
# Authorized redirect URI: {BASE_URL}/auth/microsoft/callback
MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=
# Opções: common (qualquer conta), organizations (só corporativas), ou UUID do tenant
MICROSOFT_TENANT_ID=common
  • common — qualquer conta Microsoft, pessoal ou corporativa
  • organizations — só contas corporativas ou de instituição de ensino
  • <uuid> — apenas o tenant específico daquela organização

Login com GitHub

Um OAuth App comum, criado em github.com/settings/developers.

# ─── OIDC — GitHub (opcional) ────────────────────────────
# Deixe vazio para desabilitar o botão "Entrar com GitHub"
# Crie um OAuth App em: https://github.com/settings/developers
# Authorization callback URL: {BASE_URL}/auth/github/callback
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=

Provedor OIDC próprio

Para quem roda o próprio servidor de identidade — Keycloak, Authentik, Dex, RHSSO ou qualquer coisa compatível com OpenID Connect. Aqui são quatro campos obrigatórios; faltando qualquer um, o provedor inteiro é desligado. O texto do botão também é configurável.

# ─── OIDC — Provedor genérico (opcional) ─────────────────
# Para Keycloak, RHSSO, Authentik, Dex ou qualquer provedor OIDC compatível
# Deixe OIDC_CLIENT_ID vazio para desabilitar
# Redirect URI a registrar no provedor: {BASE_URL}/auth/oidc/callback
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
# URL do discovery document do provedor:
# Keycloak: https://sso.empresa.com/realms/minha-org/.well-known/openid-configuration
OIDC_DISCOVERY_URL=
# Texto exibido no botão de login (ex: "Entrar com SSO Corporativo")
OIDC_BOTAO_LABEL=

Quem pode entrar: cadastro automático

Ter conta no provedor não significa ter acesso ao CMS. Por padrão, só entra quem o administrador já cadastrou — na primeira autenticação, o sistema vincula o provedor ao usuário existente pelo e-mail. Para abrir o cadastro automático (novos usuários criados com papel "visualizador"):

# false (padrão): só entra quem o admin já cadastrou previamente
# true: cria usuário novo automaticamente com papel "visualizador"
#
# OIDC_PERMITIR_CADASTRO aplica-se a Google, Microsoft e GitHub
# OIDC_GENERICO_PERMITIR_CADASTRO aplica-se ao provedor genérico (Keycloak etc.)
OIDC_PERMITIR_CADASTRO=false
OIDC_GENERICO_PERMITIR_CADASTRO=false

Os dois controles são separados de propósito: dá para deixar Google, Microsoft e GitHub abertos e manter o Keycloak restrito a quem já foi cadastrado — ou o contrário.

Captcha: Cloudflare Turnstile

O Turnstile protege o formulário de comentários contra bots. Mesma filosofia: sem chaves, sem captcha. Com as duas chaves preenchidas, o widget aparece sozinho no formulário e a validação passa a ser exigida no servidor.

# ─── CAPTCHA (opcional) ──────────────────────────────────
# Cloudflare Turnstile para proteção dos comentários
# Deixe vazio para desabilitar o captcha
# Obtenha as chaves em: https://dash.cloudflare.com/?to=/:account/turnstile
TURNSTILE_SITE_KEY=
TURNSTILE_SECRET_KEY=

O Content-Security-Policy do RustCMS já libera challenges.cloudflare.com nas diretivas script-src e frame-src, então não é preciso ajustar nada de segurança para o widget carregar. Com o captcha desligado, um rate limit em memória continua servindo de barreira contra abuso.

Fontes extras no CSP, sem recompilar

Precisou adicionar Google Analytics, uma fonte de CDN ou imagens de um domínio externo ao template? Dá para estender o Content-Security-Policy por variável de ambiente:

CSP_EXTRA_SCRIPT_SRC=https://www.googletagmanager.com
CSP_EXTRA_STYLE_SRC=https://cdn.jsdelivr.net
CSP_EXTRA_IMG_SRC=https://images.unsplash.com
CSP_EXTRA_CONNECT_SRC=https://api.exemplo.com

Múltiplas origens na mesma diretiva: separe por espaço.

Resumo

Todo o comportamento de autenticação e captcha do RustCMS é decidido em tempo de execução pelo .env:

  • Login local com Argon2id — sempre ativo, com MFA/TOTP opcional ou obrigatório
  • Google, Microsoft e GitHub — cada um ligado só quando suas credenciais existem
  • Provedor OIDC próprio — quatro campos, texto de botão personalizável
  • Cadastro automático — controlado separadamente para provedores públicos e para o OIDC genérico
  • Turnstile — widget e validação aparecem sozinhos quando as chaves estão presentes
  • CSP extensível por variável, sem recompilar

O .env.exemplo no repositório documenta cada uma dessas variáveis com comentários e links para onde obter as credenciais.