Intégrer Visio
Visio est une salle de visioconférence en marque blanche. Chaque instance a sa marque, son domaine et ses options ; vos applications y envoient leurs utilisateurs par un lien signé. L'instance ne garde rien : pas de base, pas de compte.
Une instance à votre marque
Une instance se décrit dans un fichier de configuration : la marque, l'usage, les options, les limites et les applications autorisées. Les secrets n'y figurent pas : chaque application a le sien, dans une variable d'environnement.
instance:
id: votre-marque # préfixe de vos salles
name: visio.votre-site.fr # nom affiché
brand:
logo: logo.svg # ou une adresse https://…
primary: "#0066FF"
accent: "#00C2FF"
preset: formation # reunion | formation
features:
rankings: false # chaque option s'active ou se coupe
limits:
maxParticipants: 50
maxHours: 4
apps: # applications autorisées à signer des liens
- id: mon-app
secretEnv: VISIO_APP_MON_APP_SECRETUsages et options
Deux préréglages fixent les options par défaut ; features les ajuste une à une. Sans API de votre application, les activités et la discussion passent de navigateur à navigateur : rien n'est enregistré.
| Option | reunion | formation | Cette instance |
|---|---|---|---|
Discussion chat | ✓ | ✓ | ✓ |
Tableau blanc whiteboard | ✓ | ✓ | ✓ |
Annotation des pages annotations | ✓ | ✓ | ✓ |
Flou et arrière-plans backgrounds | ✓ | ✓ | ✓ |
Activités en direct (sondage, nuage de mots, quiz, présence…) activities | — | ✓ | — |
Classements (podium, Top 10) rankings | — | ✓ | — |
Mur des caméras (seconde fenêtre) wall | ✓ | ✓ | ✓ |
QR code pour rejoindre qr | ✓ | ✓ | ✓ |
Le lien d'entrée signé
L'application signe un lien d'entrée (JWT HS256) avec son secret, puis y redirige la personne : https://visio.okto.it/r/<salle>?t=<jeton>. Aucun appel préalable, aucun compte : l'instance vérifie la signature. Deux applications ne partagent jamais une salle.
| Champ | Contenu |
|---|---|
iss | Identifiant de l'application (obligatoire) |
room | Salle : 1 à 64 caractères A-Z a-z 0-9 _ -, identique au chemin /r/<salle> (obligatoire) |
exp | Expiration, 24 h au plus ; quelques minutes suffisent (obligatoire) |
role | host (animation) ou participant (par défaut) |
name | Nom affiché ; absent, il est demandé à l'entrée |
sub | Votre référence de la personne (identité stable dans la salle) |
title | Titre affiché dans la salle |
back | Adresse de retour (bouton « Fermer ») |
invite | Animation : lien d'invitation à afficher en QR code |
aud | Facultatif : identifiant de l'instance visée |
Le lien vaut autorisation : signez-le au dernier moment, avec une expiration courte, et ne l'envoyez pas par courriel.
Node.js (jose)
import { SignJWT } from "jose";
const t = await new SignJWT({ room: "dossier-1234", role: "participant", name: "Julie Martin" })
.setProtectedHeader({ alg: "HS256" })
.setIssuer("mon-app") // identifiant déclaré dans la configuration de l'instance
.setSubject("user-42") // votre référence de la personne (facultatif)
.setExpirationTime("15m")
.sign(new TextEncoder().encode(process.env.VISIO_SECRET));
redirect(`https://visio.okto.it/r/dossier-1234?t=${t}`);PHP
function visio_link(string $room, string $role, string $name, string $ref): string {
$b64 = fn($v) => rtrim(strtr(base64_encode($v), '+/', '-_'), '=');
$head = $b64(json_encode(['alg' => 'HS256', 'typ' => 'JWT']));
$body = $b64(json_encode(['iss' => 'mon-app', 'sub' => $ref, 'room' => $room,
'role' => $role, 'name' => $name, 'exp' => time() + 900]));
$sig = $b64(hash_hmac('sha256', "$head.$body", getenv('VISIO_SECRET'), true));
return "https://visio.okto.it/r/$room?t=$head.$body.$sig";
}