Autenticação e segurança¶
O plugin não recebe cookies nem o token global de login do usuário. Recebe contexto e uma capacidade temporária limitada à instalação, usuário e reunião. A identidade vem de identity:read, com permissão declarada.
sequenceDiagram
participant P as Plugin iframe
participant E as Elo host
participant A as Elo API
P->>E: elo.ready
E-->>P: elo.context (nonce, escopos, grant)
P->>E: elo.request (requestId, operação)
E->>A: Validar instalação, usuário e reunião
A-->>E: Resultado autorizado
E-->>P: elo.response (mesmo requestId)
SDK no iframe¶
Valida origem exata e janela pai, correlaciona requestId e utiliza o nonce do host. Há até 8 operações simultâneas na bridge; o SDK rejeita uma chamada sem resposta após 30 segundos. Capture erros e desfaça o loading. Não use * em postMessage.
Backend externo¶
O contexto pode incluir session: { token, endpoint, expires }. O grant dura cinco minutos. O servidor confere expiração, instalação, publicação, titularidade e permissões em cada operação.
// Backend: mantenha o grant em memória; não registre seu conteúdo.
const response = await fetch(context.session.endpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${context.session.token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ operation: 'transcript:read', meetingId: context.meetingId })
});
const result = await response.json();
Renove com await elo.request('session'). Grants de configuração não permitem ler a transcrição; a rota /config trata apenas identidade e preferências. Nunca encaminhe cookies Elo.
Hospedagem e dados¶
Permita incorporação pelo dashboard com Content-Security-Policy: frame-ancestors https://dash.elomeet.app. Não envie X-Frame-Options: DENY. O iframe usa sandbox, sem câmera, microfone ou geolocalização.
Renderize textos com textContent ou um renderer sanitizado. Não interprete HTML da transcrição. Logs devem conter apenas correlação, operação, status e duração, sem tokens, e-mails completos, transcrições ou notas. A revogação é aplicada no servidor mesmo com o iframe aberto.
Segurança de times¶
Um time pode exigir aprovação da instalação. Selecionar o time no consentimento cria uma solicitação sem instalar automaticamente. Após aprovação, o usuário confirma a instalação. A API verifica a política novamente ao emitir a sessão e em cada operação sobre a reunião; uma instalação pessoal não contorna a política do time. Erro team_plugin_approval (403) significa que é necessário solicitar a revisão. Remoção do membro ou recusa posterior revoga novas operações.
Transcrições de times podem estar cifradas. O plugin continua usando a mesma API autorizada e recebe texto legível; nunca recebe chaves privadas do time. Ele deve proteger seus próprios logs e dados externos.