Keycloak
O Keycloak é um servidor, não uma página onde você embute um script, então o Caputchin vem como uma extensão do Keycloak: um JAR de provider que você adiciona ao Keycloak. Ele renderiza o widget do Caputchin nas páginas de login, redefinição de senha e registro, e verifica o token de dentro do Keycloak antes de o fluxo prosseguir. Tanto o widget de checkbox quanto o jogo funcionam.
A extensão é de código aberto. A referência completa (cada propriedade de configuração, o JSON de export do realm, o contrato do theme e uma matriz de compatibilidade) fica no repositório: github.com/Caputchin/caputchin-keycloak. Conte com cerca de 15 minutos de uma conta nova até a primeira sessão verificada no servidor.
Funciona com o Keycloak 26.x (a distribuição Quarkus). Você precisa de acesso ao deployment do Keycloak para adicionar um JAR de provider e rodar kc.sh build, e de uma conta de administrador do realm que você protege.
1. Crie uma chave de site
Entre em caputchin.com/login (seu primeiro login cria a conta), abra sua equipe Pessoal, clique em Criar chave de site, dê a ela o nome do seu realm do Keycloak e clique em Criar. Copie os dois valores:
- a Chave pública (
cpt_pub_...), - o Segredo (
cpt_sec_...). Ele aparece uma única vez.
Crie sua conta e a primeira chave de site percorre as mesmas telas com mais detalhes.
2. Instale a extensão
Baixe caputchin-keycloak.jar da versão mais recente, copie-o para o diretório providers/ do Keycloak e reconstrua:
cp caputchin-keycloak.jar "$KEYCLOAK_HOME/providers/"
"$KEYCLOAK_HOME/bin/kc.sh" build
"$KEYCLOAK_HOME/bin/kc.sh" start --optimizedkc.sh build é necessário para o Keycloak descobrir os providers. Numa imagem de contêiner, copie o JAR e rode o build dentro da imagem:
FROM quay.io/keycloak/keycloak:26.4
COPY caputchin-keycloak.jar /opt/keycloak/providers/
RUN /opt/keycloak/bin/kc.sh buildPara compilar o JAR a partir do código-fonte, veja o guia de instalação do repositório.
3. Entregue o segredo ao Keycloak
Mantenha o segredo fora da configuração do realm: defina-o como variável de ambiente no servidor do Keycloak, por exemplo CAPUTCHIN_SECRET, e reinicie o Keycloak. No passo 5 você informa só o nome da variável. Um segredo literal ou uma referência ${vault.*} também funcionam; veja o guia de configuração do repositório.
4. Escolha como o widget renderiza
Há dois jeitos, e você escolhe por realm.
Pronto para usar: o theme embutido
O JAR traz um theme de login caputchin. No Admin Console, abra seu realm, vá em Realm settings → Themes, defina Login theme como caputchin e clique em Save. O widget renderiza nas páginas de login, redefinição e registro sem editar templates. Este é o caminho mais rápido se você usa um login de Keycloak padrão.
Headless: seu próprio theme renderiza o widget
Se você entrega um theme de login próprio (por exemplo um theme React de Keycloakify), mantenha seu theme e rode a extensão em headless. Ela expõe a configuração do widget ao contexto da página e valida o token; seu theme renderiza o elemento <caputchin-widget> (ou <caputchin-game>). O campo do token é caputchin-token. O contrato de atributos completo e um exemplo de Keycloakify estão no guia do theme do repositório.
5. Vincule-a ao fluxo de login
O Keycloak não troca o autenticador de um passo no lugar, então você adiciona o passo do Caputchin a uma cópia do fluxo e remove o passo original.
-
Vá em Authentication. No fluxo browser, abra o menu (⋮), clique em Duplicate, dê um nome à cópia (por exemplo
browser caputchin) e clique em Duplicate. -
Na cópia, encontre o subfluxo forms. Clique no botão + (Add) dele, escolha Add execution, selecione Caputchin Username Password Form e clique em Add.
-
Arraste o passo novo para o topo do subfluxo forms, acima do subfluxo Conditional 2FA, para que ele rode onde o passo antigo rodava. O requisito dele é Required.
-
Exclua o passo original Username Password Form do subfluxo forms.
-
Clique na engrenagem (Settings) do passo do Caputchin e preencha:
- Alias: qualquer nome, como
caputchin-login. - Site key: sua chave pública (
cpt_pub_...), o único valor enviado ao navegador. - Secret key env var: o nome da variável do passo 3, como
CAPUTCHIN_SECRET.
Depois clique em Save. Os outros campos têm padrões que funcionam: Widget mode
checkbox(ouinvisible, ougame), Localekc(segue o locale do realm) e Fail closed ligado, então uma queda da verificação bloqueia os logins em vez de deixá-los passar. - Alias: qualquer nome, como
-
Abra o menu Action do fluxo, clique em Bind flow, mantenha Browser flow e clique em Save.
O desafio renderiza na mesma página que as credenciais, não como um passo à parte. Com as configurações padrão, a conferência roda quando o usuário clica em Sign In.
Redefinição de senha e registro
O mesmo padrão protege os outros dois formulários:
| Fluxo | Adicione este passo | No lugar de |
|---|---|---|
| Reset credentials | Caputchin Reset Credential - Choose User | Choose User |
| Registration | Caputchin, no subfluxo do formulário de registro, como Required | (adicionado junto ao Registration User Creation) |
Cada passo do Caputchin tem as próprias configurações (engrenagem), então informe a chave de site e a variável do segredo em cada um. Não adicione um desafio ao fluxo de direct grant: ali não há navegador, então quebraria as requisições de token por API. Binding to flows no repositório mostra a mesma configuração como JSON de export do realm.
O visual mais rico (qual jogo, skins, marca) é definido uma única vez no painel do Caputchin na própria chave de site, então você não o repete no Keycloak.
6. Confira a Content Security Policy
A Content Security Policy de login padrão do Keycloak (em Realm settings → Security defenses → Headers) é frame-src 'self'; frame-ancestors 'self'; object-src 'none';. Ela restringe frames, não scripts nem conexões, e o jogo roda num frame srcdoc, então a checkbox, o widget invisível e o jogo funcionam com ela sem mudanças.
Se você definir uma política própria mais estrita, parta da que está no guia de CSP do repositório. Uma diretiva script-src também vale para os scripts inline do próprio Keycloak, então teste a página de login e o Account Console depois de qualquer mudança.
A verificação no lado do servidor (do Keycloak ao host de verificação) é uma chamada de servidor para servidor e não é afetada pela política do navegador.
7. Confirme a primeira sessão verificada no servidor
- Abra o login da sua aplicação (ou a página de login do realm) numa janela anônima.
- Entre com um usuário de teste. O widget roda quando você clica em Sign In, e o Keycloak faz o seu login.
- No painel do Caputchin, abra sua equipe e clique na sua chave de site. Atualize as estatísticas.
Verificadas no servidor agora mostra pelo menos 1: o Keycloak confirmou um token com o Caputchin. Essa é a sua primeira sessão verificada. Se a página de login mostrar "Verification failed. Please complete the check and try again." e Verificadas no servidor continuar em 0, o token nunca chegou ao Keycloak: procure um erro de Content Security Policy no console do navegador (passo 6). Se Concluídas no cliente subiu mas o login ainda falha, confira se a variável do segredo do passo 3 está definida no servidor. Estatísticas e sessões explica cada número.
Experimente localmente
O repositório inclui um Keycloak local de um comando só (e2e/) ligado a um stack local do Caputchin, para você clicar pelos três fluxos protegidos antes de implantar. Veja o README do repositório.