Intégrer votre chat
Créez un espace et déclarez les origines HTTPS autorisées dans la console. Chaque espace possède ses utilisateurs, son historique, ses paramètres et sa clé serveur.
Sans développement serveur
Activez les invités dans Participants, puis copiez l’iframe fournie dans Intégration. Les visiteurs choisissent un pseudonyme ; aucune clé n’est incluse dans le code. Pour distinguer avec certitude la même personne entre plusieurs appareils, utilisez votre authentification.
Avec vos comptes existants
Installez le paquet jose sur votre serveur Node.js. Votre route de grant doit vérifier votre session existante et déduire elle-même l’identité du membre. Ne prenez jamais son identifiant ou son rôle dans les données envoyées par le navigateur.
import { SignJWT } from 'jose';
import { randomUUID } from 'node:crypto';
// Après authentification par VOTRE serveur :
const grant = await new SignJWT({
tenant: process.env.CAPIT_CHAT_TENANT,
name: authenticatedUser.displayName,
role: 'member'
}).setSubject('site:' + authenticatedUser.id)
.setIssuer(process.env.CAPIT_CHAT_ISSUER)
.setAudience('jeanne-chat')
.setIssuedAt().setExpirationTime('60s')
.setJti(randomUUID())
.setProtectedHeader({ alg: 'HS256' })
.sign(new TextEncoder().encode(process.env.CAPIT_CHAT_KEY));
// Réponse privée, Cache-Control: no-store : { grant }Dans votre page :
<div id="chat"></div>
<script src="https://api.capit.net/chat/widget.js"></script>
<script>
const chat = JeanneChat.mount({
container: document.getElementById('chat'),
origin: 'https://api.capit.net', path: '/chat/',
tenant: 'VOTRE_IDENTIFIANT_ESPACE',
grant: async () => {
const response = await fetch('/votre-route-grant', {
method: 'POST', credentials: 'same-origin'
});
if (!response.ok) throw new Error('Connexion nécessaire');
return (await response.json()).grant;
}
});
// Lors de la déconnexion de votre site : chat.logout();
</script>Le SDK renouvelle le grant toutes les 45 secondes et à la reprise de visibilité. Protégez votre route contre les requêtes intersites. Le serveur de votre site garde la clé CAPIT ; aucun mot de passe n’est transmis au chat.
Profils et menus
Le SDK accepte une fonction profiles(keys) retournant des champs publics : key, profileUrl, avatarUrl, gender, age, country, summary. Les liens de profil restent sur votre origine ; les photos peuvent venir de cette origine ou du CDN explicitement pris en charge. Les actions possibles sont profile, public et private. Les réglages serveur limitent toujours les fonctionnalités réellement autorisées.
API et capacité
Les API de participation se trouvent sous /chat/api/, les API de console sous /chat/manage/. Une session se crée avec POST /api/session et un grant à usage unique. Les appels suivants utilisent Authorization: Bearer suivi du jeton opaque reçu. Les connexions WebSocket utilisent /chat/socket.
Gratuit : cinq personnes simultanément admises. Les appareils d’un même compte partagent une place. À la capacité maximale, une nouvelle admission reçoit HTTP 409, code chat_full. Les admissions déjà actives continuent. Les places inactives sont libérées après 90 secondes ; les invités sont identifiés par un jeton signé conservé dans leur navigateur pendant au plus 24 heures.
Sécurité et données
Les conversations privées ne sont visibles que par leurs participants, hors examen limité des contenus signalés. Les exports webmaster sont limités aux salons publics. Aucune clé ne doit entrer dans un dépôt public, une URL, un journal ou un navigateur de participant. Une rotation de clé impose la mise à jour du serveur intégrateur.