JITSI_SETUP.md 7.2 KB

Configuración de Jitsi Meet con JWT

✅ Completado en la aplicación

La aplicación Next.js ya está configurada para usar tu instancia de Jitsi Meet con autenticación JWT:

🔧 Configuración requerida en tu servidor Jitsi

1. Actualizar tu archivo .env de Docker de Jitsi

Basado en la configuración que ya tienes, actualiza las líneas comentadas:

# JWT authentication
AUTH_TYPE=jwt

# Application identifier
JWT_APP_ID=reuniones_utb

# Application secret known only to your token generator
JWT_APP_SECRET=theystolemyfuckingmoney

# (Recomendado) Set asap_accepted_issuers as a comma separated list
JWT_ACCEPTED_ISSUERS=reuniones_utb

# (Recomendado) Set asap_accepted_audiences as a comma separated list
JWT_ACCEPTED_AUDIENCES=reuniones_utb

# (Opcional) Permitir invitados sin autenticación
# Si quieres que solo usuarios autenticados puedan unirse, déjalo comentado
# ENABLE_GUESTS=1

2. Reiniciar los contenedores de Jitsi

Después de actualizar el .env, reinicia los servicios:

cd /ruta/a/tu/jitsi-docker
docker compose down
docker compose up -d

3. Verificar la configuración

Verifica que los contenedores estén corriendo correctamente:

docker compose ps
docker compose logs -f web

🔐 Cómo funciona la autenticación JWT

Flujo de autenticación:

  1. Usuario accede a una cita aprobada/appointments/[id]/meet

  2. Frontend solicita JWT tokenGET /api/appointments/[id]/jitsi-token

    • Valida que el usuario sea PATIENT, DOCTOR o ADMIN
    • Valida que la cita esté aprobada
    • Valida el tiempo (15 min antes hasta 1 hora después)
  3. Backend genera JWT token usando src/lib/jitsi-jwt.ts:

    {
     "iss": "reuniones_utb",        // JWT_APP_ID
     "aud": "reuniones_utb",         // JWT_APP_ID
     "sub": "meet.checkthis.space",  // Tu dominio
     "room": "appointment-123",      // Sala específica
     "context": {
       "user": {
         "id": "user-id",
         "name": "Juan Pérez",
         "email": "juan@example.com",
         "avatar": "https://..."
       }
     },
     "moderator": true,              // true para DOCTOR/ADMIN
     "exp": 1699123456               // 2 horas de expiración
    }
    
  4. Frontend inicializa Jitsi con el token JWT:

    new JitsiMeetExternalAPI("meet.checkthis.space", {
     roomName: "appointment-123",
     jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
     // ... otras opciones
    })
    
  5. Jitsi valida el token usando JWT_APP_SECRET:

    • Verifica la firma del token
    • Verifica que iss esté en JWT_ACCEPTED_ISSUERS
    • Verifica que aud esté en JWT_ACCEPTED_AUDIENCES
    • Verifica que el token no haya expirado

👥 Roles y permisos

DOCTOR y ADMIN (moderadores):

  • ✅ Pueden grabar la reunión
  • ✅ Pueden hacer streaming
  • ✅ Pueden expulsar participantes
  • ✅ Pueden silenciar a otros participantes
  • ✅ Pueden finalizar la reunión para todos

PATIENT (participantes):

  • ✅ Pueden unirse a la reunión
  • ✅ Pueden compartir audio/video
  • ✅ Pueden usar el chat
  • ❌ No pueden expulsar a otros
  • ❌ No pueden grabar

🔑 Variables de entorno en tu aplicación

Tu archivo .env ya está configurado con:

JITSI_DOMAIN="meet.checkthis.space"
JITSI_APP_ID="reuniones_utb"
JITSI_APP_SECRET="theystolemyfuckingmoney"
JITSI_USE_JWT="true"

⚠️ IMPORTANTE:

  • JITSI_APP_ID debe coincidir con JWT_APP_ID en Jitsi
  • JITSI_APP_SECRET debe coincidir con JWT_APP_SECRET en Jitsi
  • Estos valores deben ser EXACTAMENTE iguales

🧪 Testing

1. Verificar que el servidor esté accesible:

curl https://meet.checkthis.space/

2. Crear una cita de prueba y probar el flujo completo:

  1. Crear una cita como PATIENT
  2. Aprobarla como DOCTOR
  3. Ambos usuarios intentar unirse a la videollamada
  4. Verificar que:
    • El token JWT se genera correctamente
    • Jitsi acepta el token
    • Los permisos de moderador funcionan correctamente

3. Verificar logs del backend:

npm run dev

Deberías ver en la consola:

🎥 Jitsi Meet:
   Domain: meet.checkthis.space
   App ID: ✅ Configurado
   App Secret: ✅ Configurado
   Use JWT: ✅ Habilitado

🐛 Troubleshooting

Problema: "No se pudo conectar con el servidor de videollamadas"

Solución:

  • Verifica que meet.checkthis.space sea accesible desde el navegador
  • Verifica que el certificado SSL sea válido
  • Verifica que el script https://meet.checkthis.space/external_api.js cargue correctamente

Problema: "Invalid JWT token"

Solución:

  1. Verifica que JITSI_APP_ID y JWT_APP_ID coincidan exactamente
  2. Verifica que JITSI_APP_SECRET y JWT_APP_SECRET coincidan exactamente
  3. Verifica que JWT_ACCEPTED_ISSUERS incluya el valor de JWT_APP_ID
  4. Verifica que JWT_ACCEPTED_AUDIENCES incluya el valor de JWT_APP_ID
  5. Revisa los logs de Jitsi: docker compose logs -f prosody

Problema: Token expirado

Solución:

Problema: Usuario no tiene permisos de moderador

Solución:

📚 Referencias

🔒 Seguridad

IMPORTANTE: En producción:

  1. ✅ Cambia JWT_APP_SECRET por un valor secreto y seguro
  2. ✅ Usa HTTPS para todo (tu dominio y tu app)
  3. ✅ No expongas JITSI_APP_SECRET en el frontend
  4. ✅ Los tokens se generan en el backend (ya implementado)
  5. ✅ Configura JWT_ACCEPTED_ISSUERS y JWT_ACCEPTED_AUDIENCES

🎯 Próximos pasos opcionales

Configuración adicional de Jitsi:

  • Grabar reuniones: Configurar Jibri para grabación
  • Transcripción: Configurar Jigasi para transcripción
  • TURN server: Para mejorar conectividad detrás de firewalls
  • Límites de sala: Limitar número de participantes por sala
  • Branding: Personalizar logo y colores de Jitsi

Mejoras en la aplicación:

  • Agregar notificaciones cuando un participante se une
  • Guardar duración de la videollamada en la base de datos
  • Agregar grabación automática para citas específicas
  • Implementar espera virtual (waiting room)