A autenticação para um ERP é um processo de verificação de identidade e autorização para acessar um sistema. Dessa forma, apenas sistemas autorizados podem interagir, validando a origem das solicitações de suporte, permitindo a criação de contatos no Nex Chat. Isso é fundamental para a segurança e integridade das informações.
A estratégia de autenticação é realizada pela utilização de chave pública/privada para a comunicação e autenticação entre o sistema ERP e o Nex Chat.
Siga o passo a passo para a primeira fase:
Após a conclusão das etapas, o sistema ERP estará pronto para iniciar a comunicação com o Nex Chat!
A seguir, há um exemplo para geração de chaves e também a request JavaScript para o envio da chave pública durante o cadastro de um cliente:
const crypto = require('crypto');
const jwt = require('jsonwebtoken');
let globalPrivateKey = '';
let globalPublicKey = '';
function gerarChaves() {
//Define as opções para a geração de chave
const options = {
modulusLength: 4096, // comprimento da chave em bits
publicKeyEncoding: {
type: 'pkcs1', // formato da chave pública
format: 'pem' // formato da chave pública
},
privateKeyEncoding: {
type: 'pkcs8', // formato da chave privada
format: 'pem' // formato da chave privada
}
};
// Gera o par de chaves
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', options);
globalPrivateKey = privateKey;
globalPublicKey = btoa(publicKey); // base64 da chave pública
}
gerarChaves();
fetch("https://nexxchatapi.com.br/api/v1/cliente/64010829161964827f4afd2f", {
"method": "PATCH",
"headers": {
"cookie": "connect.sid=s%253Ah3HrvRRkQp3XnVp5pGAfatGLbeldtvhN.jSfhlIUmlV6%252BNTqYD28KAKu13BGL8EXMEUPquqgrvZw",
"Content-Type": "application/json",
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY0MTg5N2NjZjc4N2ZiNzAxZDdhZDFiNyIsImlhdCI6MTY3OTMzMzMzM30.UJQkUc08SN_qA5RmJHR4o5P-eZtYjSRdVLQ4L8kfDfM"
},
"body": "{\"publicKey\":\"LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUNDZ0tDQWdFQXVGclNZUE12WkRUOTQyV2pNay9SUElDak5VVWQxTlRuU01GNm81eFVwZzhDRVl6OWZkZ0UKWEM0VjFzak13VEJaMlp3YjExbzY1dmxDdGxpeVAyNFYzQkNUOUxhZWJxcUx4QXZ4NEpQNnlKaXV0L25rMkNEagpwZ08zV0ZlYVA4SXhQSFpMOGxibXV4dktCL0pCeHJscGl4YkJlb2RHWThWMXNJRHBGT29sMGFDVFR4UXFYdjB4CmxNSDZTMUZxUDJxRzBqM3N2azczRVduUW8yQnlRNnNOci9hZStFSWFkcEo0cUJ3MnVXRzFPVmViVjNPTng5OTgKU1JqZWJKbFFhZzhLTitRaVlOcVRTNGZ6WVdWWmt5cEt6S09CeTVwWkwvWDhZbGd6UGlCRjdLZU8zWUdBU2ltRgptV2V0RVlBdnZrVExGNEdleWU1elMybEFXUDNqL1hKWFU1TDF4MEdPWkx3aTJXekxVaGl6SlpxVkdmV1JPREw3CklaV015VzFsNFpPUWdmZk5RUGFEajAraUxxSDhHQmtWbHg0YXZFeXF5b2xuSmZmaEtIdDhVREJnak5reEptUUMKWEk3RWxoL2VVeHpOQzBKc1RPS3lRdkFPeS9NQkZxSUcxWERRQ3lkR2RsK1ZHY0V1cGI2TEFKSTd1bHVrM0dLUQpQMHFXTjM2L2pIaWp4ejUyR0hPVWh5aFJBQmoydGlHcUR5My81RW13Wnh3dlNNRURhclVSU3JGa0xEbzlFSm93CmRsdnR5NTliZGJvekc2bGlFa2p1R0ovamVWaVE3dm5ad3ZJQmN4Sk9iNnNaUnNCdmhtbk5pMXJIVHpuK3pRL2QKNnhxZklpU0xaTk00RUhDYWRoc1ZpU3Q1M3NpaDZaNDNlZjc4b1FpMSs1RGZiemJZVytQOXZHMENBd0VBQVE9PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCg==\"}"
})
.then(response => {
console.log(response);
})
.catch(err => {
console.error(err);
});
A segunda fase será iniciada quando ocorrer a solicitação de suporte do ERP, geralmente quando houver ações como o acionamento de um botão.
Enviando as seguintes credenciais:
Código:
function gerarToken() {
// Configurações do JWT
const options = {
algorithm: 'RS256', // Algoritmo de criptografia
};
const dados = {
email: "wagnerteste@ixcsoft.com.br",
nome: "Wagner"
};
// Gerar o token JWT com o payload criptografado
const token = jwt.sign(dados, globalPrivateKey, options);
// Retornar o token
return token;
}
Nesta fase, o Nex Chat recebe as informações enviadas pelo ERP nas etapas anteriores, a seguir estão as validações:
O Nex fará a validação da presença de informações de token e ID na requisição;
Será feita a busca do registro do cliente no banco a partir do ID fornecido, validando a existência do cliente e se possui uma chave pública;
Através da chave pública do cliente, o sistema verifica o token que coleta os dados, validando se o token pertence ao ERP de origem e se o Nex está apto a usar as informações;
Se todas as validações estiverem adequadas, o Nex cria o contato do ERP, liberando o caminho para a utilização da funcionalidade solicitada pelo cliente.
Recomenda-se que o ERP execute a autenticação em duas etapas:
Exemplo de código PHP para as duas etapas comentadas:
$curl = curl_init();
// Esse primeiro request é chamado para validar as credenciais do cliente que está se autenticando,
// por isso, é enviado juntamente com o token a flag notRedirect: true, para que em caso de falha seja retornado o erro
// do login e em caso de sucesso retorne o usuário autenticado.
curl_setopt_array($curl, [
CURLOPT_URL => "https://nexxchat.com.br/uzera/login/chamar-suporte", //Url de chamada para o endpoint de autenticaçao do Nex
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\n \"id\": \"3\", \n\t\"notRedirect\": true,\n \"token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IndhZ25lcnRlc3RlQGl4Y3NvZnQuY29tLmJyIiwibm9tZSI6IldhZ25lciIsImlhdCI6MTY4MTM5NDI2OX0.gp-xJW3XagZxJzstMkqWt2u3WcfhxBL6pfuEG-ONO22I27PvJo9du7sWVM7R9WarhHnh0pDCJN6yRLFmnIl3ThBnzpTgIqZ1SmCEQPJCq6L0pmR9JSJMJsYiA-pDFDl-qDMJFzzWZ_wdYHnhw0tA1FYqSDTsQOTqu3xdOrrpfo4F22AMiArJafl7QRTz6AZOYEqxzSw3ZerM87DJBAeJINg2eAhhYZnvhHXrdCE1xTP2yl8Ey14xBejO_OrT99MdHgdDYeRRc1v3Uzjy5JHuCm6_RVwrZaZLZVDTfRdBIvsmKlht4CnIO-za0E4B_5XmpujXrakGudcnnw__gmGdtAzMmFz8QOLuo7oT5MZNoCaNqCVX4cQEPAXt88_9q3FnXXe9H20fvvirmIB8y7Azl87kcOTxcQ9eaQ3_OQ711yMCfPu74s6aChEtIxQsNtUEzt0OpsXgoJQ5LoI54eTRKmRHj5SoHcX1lVTTE3HNmY2JXqNclyPlgiF1GHpk1dApA_FFGgdgzmMsvYsR4DPQkTQQRAbk7TuxXAP44KuROjKD26IjLopPkmNlFp2TJcWPNYS4BjJa4HgxqzONh9Nma4_WolYQpPCkRDJLorblwHtM5Bx-2FER5lcZ764mfXWv6-SYswwjztW62ptbNatFTNbFIrtsZTsmyfsTvWIio_4\"\n}",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer ",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
$resp = json_decode($response);
echo $resp->error;
}
// Exibe o erro em caso de falha
if (isset($resp->error)) {
echo "Error: " . $resp->error;
// Em caso de sucesso, é disparado uma action com as mesmas informaçãoes de autenticação da chamada anterior, fazendo com que ocorra
// o redirecionamento para o Nex cliente.
} else {
function input_form($nome, $valor) {
return '<input name="' . $nome . '" type="hidden" value="' . $valor . '">';
}
echo
'<!doctype html>
<html>
<head>
<title>Suporte IXCsoft</title>
<meta charset="ISO-8859-1">
</head>
<body>
<form id="form_suporte" name="form_suporte" action="https://nexxchat.com.br/uzera/login/chamar-suporte" method="post">' . PHP_EOL;
echo input_form('id', '3');
echo input_form('token', 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IndhZ25lcnRlc3RlQGl4Y3NvZnQuY29tLmJyIiwibm9tZSI6IldhZ25lciIsImlhdCI6MTY4MTM5NDI2OX0.gp-xJW3XagZxJzstMkqWt2u3WcfhxBL6pfuEG-ONO22I27PvJo9du7sWVM7R9WarhHnh0pDCJN6yRLFmnIl3ThBnzpTgIqZ1SmCEQPJCq6L0pmR9JSJMJsYiA-pDFDl-qDMJFzzWZ_wdYHnhw0tA1FYqSDTsQOTqu3xdOrrpfo4F22AMiArJafl7QRTz6AZOYEqxzSw3ZerM87DJBAeJINg2eAhhYZnvhHXrdCE1xTP2yl8Ey14xBejO_OrT99MdHgdDYeRRc1v3Uzjy5JHuCm6_RVwrZaZLZVDTfRdBIvsmKlht4CnIO-za0E4B_5XmpujXrakGudcnnw__gmGdtAzMmFz8QOLuo7oT5MZNoCaNqCVX4cQEPAXt88_9q3FnXXe9H20fvvirmIB8y7Azl87kcOTxcQ9eaQ3_OQ711yMCfPu74s6aChEtIxQsNtUEzt0OpsXgoJQ5LoI54eTRKmRHj5SoHcX1lVTTE3HNmY2JXqNclyPlgiF1GHpk1dApA_FFGgdgzmMsvYsR4DPQkTQQRAbk7TuxXAP44KuROjKD26IjLopPkmNlFp2TJcWPNYS4BjJa4HgxqzONh9Nma4_WolYQpPCkRDJLorblwHtM5Bx-2FER5lcZ764mfXWv6-SYswwjztW62ptbNatFTNbFIrtsZTsmyfsTvWIio_4');
echo '
</form>
<script type="text/javascript">
document.getElementById(\'form_suporte\').submit();
</script>
</body>
</html>';
}
A autenticação para a chamada de suporte foi concluida!