Protótipo de login sem password com WebAuthn (passkeys), exigindo validação do utilizador (userVerification: required) num dispositivo móvel.
- Registo de passkey por utilizador.
- Login com passkey (utilizador obrigatório).
- Sessão local via cookie.
- Persistência em ficheiro JSON local.
- Apenas 1 passkey por utilizador.
- Registo restrito a autenticador externo (cross-platform), com validação de transporte
hybridpor defeito. - Gestão da passkey no checkpoint: visualização de metadata, último uso e revogação para reenrolamento.
- Frase de recuperação com 10 palavras para recuperar a conta e reenrolar uma nova passkey se o dispositivo for perdido.
- Node.js 20+ (recomendado).
- Browser com suporte WebAuthn (Chrome, Edge, Safari, etc.).
npm install
npm run startAbrir:
http://localhost:3000
- Inserir nome de utilizador.
- Clicar em
Registar passkeye confirmar biometria/PIN no dispositivo. - Clicar em
Entrar com passkey. - No checkpoint autenticado, ver a passkey ativa e revogá-la se for preciso registar outra.
- Guardar a frase de recuperação mostrada uma única vez.
- Num PC, o browser pode oferecer usar outro dispositivo (normalmente via QR code/Bluetooth).
- A verificação exata (Face ID, impressão digital, PIN) depende do SO e do autenticador.
- O servidor exige apenas que exista verificação do utilizador.
- Nota: a WebAuthn não permite garantir 100% "apenas telemóvel"; esta app aplica a política mais restritiva possível (
cross-platform+hybrid).
- Depois do primeiro registo, o sistema gera uma frase de recuperação com 10 palavras e mostra-a uma única vez.
- O servidor guarda apenas
salt + hashda frase. - Se o dispositivo da passkey for perdido, o utilizador pode validar a frase e reenrolar uma nova passkey.
- No final da recuperação, a passkey antiga é revogada e a frase de recuperação é regenerada.
- A conta é criada normalmente com passkey e verificação biométrica.
- Depois do registo inicial, o sistema gera uma frase de recuperação com 10 palavras aleatórias.
- Essa frase é mostrada uma única vez ao utilizador e deve ser guardada offline.
- No servidor, a frase não é guardada em claro: apenas
salt + hash. - Se a passkey do dispositivo for perdida, o utilizador pode iniciar o fluxo
Recuperar conta. - A frase validada não faz login direto. Em vez disso, abre uma sessão curta de recuperação.
- Nessa sessão, o utilizador é obrigado a registar uma nova passkey.
- Quando a nova passkey fica ativa, a passkey anterior é revogada e a frase de recuperação é renovada.
- O login normal continua a ser apenas com passkey.
- A frase de recuperação serve apenas para recuperar a conta, não para autenticar no dia a dia.
- A revogação da passkey ativa exige que exista uma frase de recuperação configurada, para evitar lockout acidental.
- O reenrolamento de uma nova passkey para contas existentes só é permitido pelo fluxo de recuperação.
PORT(default3000)RP_ID(defaultlocalhost)ORIGIN(defaulthttp://localhost:<PORT>)SESSION_SECRET(default gerado no arranque)DB_PATH(default./data/passkeys.json)ENFORCE_HYBRID_TRANSPORT(defaulttrue; usarfalsepara desativar o bloqueio porhybrid)
server.js: API + verificação WebAuthn.public/index.html: UI simples.public/app.js: chamadas API e WebAuthn no browser.data/passkeys.json: armazenamento local (criado automaticamente).