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_SECRET

Demander votre instance

Usages 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é.

OptionreunionformationCette 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.

ChampContenu
issIdentifiant de l'application (obligatoire)
roomSalle : 1 à 64 caractères A-Z a-z 0-9 _ -, identique au chemin /r/<salle> (obligatoire)
expExpiration, 24 h au plus ; quelques minutes suffisent (obligatoire)
rolehost (animation) ou participant (par défaut)
nameNom affiché ; absent, il est demandé à l'entrée
subVotre référence de la personne (identité stable dans la salle)
titleTitre affiché dans la salle
backAdresse de retour (bouton « Fermer »)
inviteAnimation : lien d'invitation à afficher en QR code
audFacultatif : 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";
}