/** * Exemplo 01: Login Seguro via Certificado Digital (Challenge-Response) * * Demonstra como autenticar um usuário sem senhas, assinando um desafio emitido * pelo servidor backend da sua aplicação web. */ import { CyberCoreSigner, AgentNotRunningError } from '@cybercore/signer-sdk'; async function main() { const signer = new CyberCoreSigner({ applicationName: 'Portal Corporativo ERP' }); // 1. Verifica se o agente desktop está ativo na máquina const isRunning = await signer.isInstalled(); if (!isRunning) { console.error('O CyberCore Signer não está em execução. Baixe e abra o aplicativo para continuar.'); return; } // 2. Conecta e obtém autorização console.log('Conectando ao agente...'); await signer.connect(); // 3. Lista os certificados digitais disponíveis const certs = await signer.getCertificates(); console.log(`Foram localizados ${certs.length} certificado(s) no computador:`); certs.forEach((c, idx) => { console.log(`[${idx + 1}] ${c.alias} (${c.certificate_type}) - ${c.subject_name}`); }); if (certs.length === 0) { console.warn('Nenhum certificado digital A1 ou token A3 encontrado.'); return; } // Seleciona o primeiro certificado disponível const selectedCert = certs[0]; // 4. Obtém o desafio emitido pelo seu backend (simulado aqui) const serverChallenge = `auth-session-${Date.now()}-${Math.random().toString(36).substring(2)}`; console.log(`Desafio recebido do servidor: ${serverChallenge}`); // 5. Executa a autenticação criptográfica console.log('Solicitando confirmação de login no CyberCore Signer...'); const authResult = await signer.authenticate({ certificateId: selectedCert.id, challenge: serverChallenge }); console.log('Login realizado com sucesso!'); console.log('Titular:', authResult.subjectName); console.log('CPF/CNPJ:', authResult.subjectCpfCnpj); console.log('Algoritmo:', authResult.algorithm); console.log('Assinatura do Desafio (Base64):', authResult.signature.substring(0, 32) + '...'); // O payload retornado deve ser enviado ao seu backend para verificação final: // POST /api/auth/verify-signature { challenge, signature, certificate } } main().catch(err => { if (err instanceof AgentNotRunningError) { console.error('Agente offline!\n' + err.actionableGuidance); } else { console.error(`Erro no login (${err.code}):`, err.message); } });