Como grupos diferem de 1:1
A criptografia ainda é: Chat XDK para chaves e payloads; X API para criar o grupo, publicar envelopes de chave para participantes, enviar mensagens e carregar eventos.
Crie o grupo e estabeleça as chaves
- Emita o ID do grupo com
POST /2/chat/conversations/group/initialize— odata.conversation_idda resposta é o ID prefixado com g que você usa em todos os passos a seguir. - Carregue a chave pública de identidade e o
public_key_versionde cada membro (rotasGETde chave pública em Chaves de criptografia;GET /2/users/public_keysbusca vários usuários em uma única requisição). Verifique cada registro comverify_key_bindingantes de usá-lo (veja o aviso em Guia de introdução). - Execute
prepare_group_createuma vez, com todos os membros (incluindo você mesmo), o ID prefixado com g e as listas de IDs de membros/admins. Uma chamada gera a chave de conversa, envelopa-a para cada membro e assina a criação — ela retorna duas assinaturas de ação (a mudança de chave de conversa e a criação do grupo). POST /2/chat/conversations/groupcom os members/admins do grupo,conversation_key_version,conversation_participant_keys(SDKencrypted_key→ APIencrypted_conversation_key) e ambas asaction_signatures. Falhas de validação retornam mensagens estáveis e legíveis por humanos, por exemplo"Too many members: adding these members would exceed the allowed group size."ou"Cannot add all members: one or more of the requested members cannot be added to this conversation.".- Mantenha a chave de conversa em bruto e a versão para criptografar/descriptografar.
title e o avatar_url que você passa para prepare_group_create são assinados e embutidos literalmente no evento de criação do grupo, e o servidor os compara com a requisição — portanto os valores group_name / group_avatar_url no corpo do POST precisam ser byte a byte idênticos ao que você passou para o SDK, ou a chamada falha na validação de assinatura.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
message_id, encoded_message_event_detail, message_event_signature aninhado) é o mesmo do POST de chaves em Guia de introdução — chaves de conversa.
Quando a composição muda, chame prepare_group_members_change com os novos IDs de membros mais a lista atual (membros, admins, membros pendentes e o título/avatar/TTL atuais, se definidos). Ela rotaciona a chave de conversa e, como a criação de grupo, retorna duas assinaturas de ação — faça POST de tudo em add members (POST /2/chat/conversations/{id}/members). Depois, espere tráfego de mudança de chave: trate-o como a rotação de chave no Guia de introdução (extract_conversation_keys / decrypt_events, depois criptografe com a versão mais recente).
Como prepare_group_members_change gera uma nova chave de conversa envelopada apenas para a lista que você passa, novos membros recebem a nova versão da chave e não podem descriptografar mensagens enviadas sob versões anteriores. O inverso não é verdadeiro: a rotação nunca revoga o acesso a versões anteriores — quem já possui uma chave antiga ainda pode ler as mensagens criptografadas sob ela. Se você suspeitar que uma chave de conversa foi exposta, rotacione com prepare_conversation_key_change; isso protege apenas mensagens futuras.
Metadados de grupo criptografados
Alguns campos de conversa (por exemplo, nome de exibição ou URL do avatar) podem chegar criptografados sob a chave de conversa. Isso não éencrypt_message; é o par genérico encrypt / decrypt do Chat XDK (string UTF-8 na entrada, texto cifrado base64 na saída, com a chave de conversa em bruto).
Se um dado campo é armazenado criptografado é decidido pelo cliente que o escreve: prepare_group_create assina e envia o título exatamente como você o fornece (a chave de conversa não existe até que essa chamada a gere, então um título no momento da criação não pode ser criptografado sob ela). Quando você lê uma conversa cujos campos são texto cifrado, descriptografe-os com decrypt e a versão de chave que estava ativa quando o campo foi escrito.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Mensagens e eventos
Enviar e receber em um grupo é igual ao 1:1 uma vez que você tem a chave de conversa em bruto:- Enviar:
encrypt_message→ API de enviar mensagem (Guia de introdução) - Receber: API de eventos ou entrega em tempo real →
decrypt_event/decrypt_events - Mídia: Mídia com o ID de conversa do grupo
Checklist
- Emita o ID prefixado com g com
POST /2/chat/conversations/group/initialize prepare_group_createcom cada membro; POST dos envelopes de chave dos participantes e ambas as assinaturas de ação paraPOST /2/chat/conversations/group- Faça cache da chave em bruto + versão; atualize em eventos de mudança de chave
- Em mudanças de composição,
prepare_group_members_change(duas assinaturas) →POST /2/chat/conversations/{id}/members - Descriptografe metadados de grupo com
decryptquando os campos são texto cifrado - Envie/receba com os mesmos padrões do 1:1