69 lines
2.4 KiB
JavaScript
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);
|
|
}
|
|
});
|