Botão de documentação dentro do Accelero
Contrato de integração para o botão que abre o Iongrade Learn a partir de dentro do Accelero, com o operador já identificado.
O operador do Accelero não tem conta no Ozone. Este fluxo dá acesso ao portal sem criar usuário para cada um e registra quem entrou, para captação de contatos.
Como funciona
- O plugin manda ao portal a credencial compartilhada e os dados do operador logado.
- O portal devolve um código de uso único, válido por 2 minutos.
- O botão abre
https://learn.iongrade.com.br/entrar?c=<código>em uma aba nova. - O portal troca o código pela identidade, registra a visita e leva o operador ao destino.
A sessão criada vive na aba. Fechou a aba, acabou: para voltar, o operador clica no botão de novo. É de propósito, e é o que mantém a captação viva a cada visita.
Nenhum cookie tem escopo de aba: cookie sem prazo só morre quando o navegador inteiro fecha. A sessão fica no sessionStorage, que some com a aba e acompanha abas abertas a partir dela.
Endpoint
POST https://learn.iongrade.com.br/api/auth/accelero
A credencial vai no header X-Accelero-Token ou no campo token do corpo. Aceita JSON ou application/x-www-form-urlencoded.
Campos
Todos os campos de identificação são opcionais. Campo ausente ou vazio nunca gera erro: o botão não pode quebrar na frente do operador. Só o token é obrigatório.
| Campo | Conteúdo |
|---|---|
token | A credencial compartilhada (ou o header X-Accelero-Token) |
email | E-mail do operador logado |
nome | Nome do operador |
telefone | Telefone do operador |
cliente | Nome do cliente: condomínio, empresa |
instancia | Host da instalação, ex. jardins.accelerobr.com.br |
destino | Caminho no portal para onde levar o operador |
O destino aceita apenas caminho interno do portal (começando com /). Endereço externo é descartado e o operador cai na home, para o botão não virar redirecionamento aberto.
Cada valor é cortado em 200 caracteres.
Os dois modos de chamada
Escolha conforme onde a credencial pode morar. O corpo é o mesmo, o registro é o mesmo, e o portal decide a forma da resposta pelo header Accept.
Modo servidor (recomendado)
O PHP do plugin chama o portal e recebe o código. A credencial nunca chega ao navegador do operador.
$ch = curl_init('https://learn.iongrade.com.br/api/auth/accelero');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Accelero-Token: ' . ACCELERO_LEARN_TOKEN,
],
CURLOPT_POSTFIELDS => json_encode([
'email' => $operador->email,
'nome' => $operador->nome,
'telefone' => $operador->telefone,
'cliente' => $empresa->descricao,
'instancia' => $_SERVER['HTTP_HOST'],
'destino' => '/docs/software/accelero/apresentacao',
]),
]);
$resposta = json_decode(curl_exec($ch), true);
// $resposta['url'] === '/entrar?c=a9f3...'
O botão então abre https://learn.iongrade.com.br + $resposta['url'] em aba nova.
Se o portal não responder, esconda o botão ou abra https://learn.iongrade.com.br direto. O operador perde a identificação, não o acesso.
Modo navegador
Um formulário na própria tela envia tudo e o portal redireciona sozinho. Não exige chamada no servidor do Accelero.
<form method="POST"
action="https://learn.iongrade.com.br/api/auth/accelero"
target="_blank">
<input type="hidden" name="token" value="...">
<input type="hidden" name="email" value="joao@cliente.com.br">
<input type="hidden" name="nome" value="João Silva">
<input type="hidden" name="telefone" value="11988887777">
<input type="hidden" name="cliente" value="Condomínio Jardins">
<input type="hidden" name="instancia" value="jardins.accelerobr.com.br">
<input type="hidden" name="destino" value="/docs/software/accelero/apresentacao">
<button type="submit">Documentação</button>
</form>
Qualquer operador vê o token no código-fonte da página. Ele não destranca a documentação interna nem o painel admin, mas permite gerar registros falsos de captação. Prefira o modo servidor quando der.
Respostas
| Situação | Resposta |
|---|---|
| Chamada de servidor, tudo certo | 200 com {codigo, expira_em, url} |
| Formulário do navegador, tudo certo | 302 para /entrar?c=<código> |
| Token errado | 401 |
Endpoint sem ACCELERO_TOKEN no servidor | 503 |
| Mais de 120 chamadas por minuto do mesmo IP | 429 |
O código é consumido no resgate. Usado duas vezes ou depois de 2 minutos, o operador vê um aviso pedindo para clicar de novo no Accelero.
O que fica registrado
A visita entra no log de acessos como login com origem: accelero, e aparece na aba Acessos do painel admin, com filtro e exportação CSV.
{
"ts": "2026-09-01T20:14:03.921Z",
"tipo": "login",
"email": "joao.porteiro@jardins.com.br",
"nome": "João Porteiro",
"empresa": "Condomínio Jardins",
"ip": "179.111.77.80",
"detalhe": {
"origem": "accelero",
"telefone": "11988887777",
"instancia": "jardins.accelerobr.com.br",
"destino": "/docs/software/accelero/apresentacao"
}
}
O registro acontece no resgate, não na emissão do código: código gerado e não usado não é visita, e contá-lo inflaria a captação.
Downloads de PDF feitos por esse operador também saem com o nome e o e-mail dele, marcados com origem: accelero para não se confundirem com sessão verificada.
O que essa entrada não dá
- Não alcança
docs/interno/. O gate é no nginx, pelo cookie, e esta entrada não emite cookie. - Não alcança
/admin. Mesmo motivo. - Não renova. Não há prazo nem revalidação: a sessão existe enquanto a aba existir.
Configuração no servidor
A credencial vive no .env do portal, em /srv/learn-iongrade/iongradelearn:
openssl rand -hex 32 # gere e guarde
# .env
ACCELERO_TOKEN=<valor gerado>
Depois, docker compose up -d auth para o container recarregar a variável. Com ACCELERO_TOKEN vazio, o endpoint responde 503 e o botão simplesmente não funciona, sem efeito colateral no resto do portal.