Files
cybercore-signer/sdk/examples/01-crypto-login.js

69 lines
2.4 KiB
JavaScript

/**
* 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);
}
});