La aplicación Next.js ya está configurada para usar tu instancia de Jitsi Meet con autenticación JWT:
.env de Docker de JitsiBasado 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
Después de actualizar el .env, reinicia los servicios:
cd /ruta/a/tu/jitsi-docker
docker compose down
docker compose up -d
Verifica que los contenedores estén corriendo correctamente:
docker compose ps
docker compose logs -f web
Usuario accede a una cita aprobada → /appointments/[id]/meet
Frontend solicita JWT token → GET /api/appointments/[id]/jitsi-token
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
}
Frontend inicializa Jitsi con el token JWT:
new JitsiMeetExternalAPI("meet.checkthis.space", {
roomName: "appointment-123",
jwt: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
// ... otras opciones
})
Jitsi valida el token usando JWT_APP_SECRET:
iss esté en JWT_ACCEPTED_ISSUERSaud esté en JWT_ACCEPTED_AUDIENCESTu 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 JitsiJITSI_APP_SECRET debe coincidir con JWT_APP_SECRET en Jitsicurl https://meet.checkthis.space/
npm run dev
Deberías ver en la consola:
🎥 Jitsi Meet:
Domain: meet.checkthis.space
App ID: ✅ Configurado
App Secret: ✅ Configurado
Use JWT: ✅ Habilitado
Solución:
meet.checkthis.space sea accesible desde el navegadorhttps://meet.checkthis.space/external_api.js cargue correctamenteSolución:
JITSI_APP_ID y JWT_APP_ID coincidan exactamenteJITSI_APP_SECRET y JWT_APP_SECRET coincidan exactamenteJWT_ACCEPTED_ISSUERS incluya el valor de JWT_APP_IDJWT_ACCEPTED_AUDIENCES incluya el valor de JWT_APP_IDdocker compose logs -f prosodySolución:
expiresInSeconds en src/app/api/appointments/[id]/jitsi-token/route.ts:146Solución:
DOCTOR o ADMIN son moderadoresisModerator se calcula en src/app/api/appointments/[id]/jitsi-token/route.ts:138IMPORTANTE: En producción:
JWT_APP_SECRET por un valor secreto y seguroJITSI_APP_SECRET en el frontendJWT_ACCEPTED_ISSUERS y JWT_ACCEPTED_AUDIENCES