Configuración
1. Google Cloud Console
- https://console.cloud.google.com > APIs & Services > Library
- Habilitar Google Calendar API + Google Meet REST API v2
- Credentials > OAuth 2.0 Client ID > Web application
- Authorized redirect URI:
https://[tenant].studeia.com/api/institution/video-provider/callback/google-meet - Copie Client ID + Client Secret
2. Studeia
- Settings > Video Provider > Google Meet > Connect
- Pegue Client ID + Client Secret
- Haga clic en "Authorize" — redirige a Google OAuth admin consent
- Acepte los permisos (administrador del dominio Google Workspace)
- Studeia almacena access_token + refresh_token cifrados con AES-256-GCM
3. Validar
Cree un LiveClass con videoProvider=google_meet > Studeia llama a Calendar API > evento creado con enlace Meet > el alumno accede via joinMethod=external (nueva pestaña).
Cómo funciona
Studeia GoogleMeetAdapter.createMeeting()
→ Calendar API: events.insert
{
summary: "Clase: Matemáticas - Geometría",
start: { dateTime: ... },
end: { dateTime: ... },
conferenceData: { createRequest: { requestId: uuid, conferenceSolutionKey: { type: "hangoutsMeet" } } },
attendees: [...alumnos.map(s => ({ email: s.email }))]
}
→ Google devuelve el evento + hangoutLink (ej: https://meet.google.com/abc-defg-hij)
↓
Studeia guarda LiveClass.providerJoinUrl = hangoutLink
↓
El alumno accede: joinMethod=external (X-Frame-Options bloquea el iframe)
Sincronización de grabaciones
Cron /api/cron/recording-sync cada 15 min:
- Lista LiveClasses completados hace más de 15 min sin recordingUrl
- Para cada uno, llama a
adapter.getRecordings(meetingId) - Meet REST API v2:
GET https://meet.googleapis.com/v2/conferenceRecords/{name} - Si la grabación está disponible: actualiza recordingUrl + crea LiveClassTranscription (si hay transcript)
Importante: la grabación debe haber sido INICIADA por el host durante la reunión. Si el host olvidó grabar, no habrá grabación que sincronizar.
Refresh tokens
Los tokens OAuth de Google expiran cada hora. Studeia:
- Cachea access_token en Redis (TTL 55 min)
- Antes de cada llamada: verifica la expiración, refresca via refresh_token si es necesario
- Si el refresh falla: marca la integración como inactiva + notifica al administrador
Limitaciones vs Zoom/Teams
| Recurso | Google Meet | Zoom | Teams |
|---|---|---|---|
| Crear reunión via API | Sí (Calendar) | Sí | Sí (Graph) |
| Finalizar reunión via API | NO | Sí | NO |
| Iniciar grabación via API | NO | Sí | NO |
| Obtener grabación via API | Sí (Meet REST v2) | Sí (webhook) | Sí (Graph) |
| Transcripción automática | Sí (Workspace Edu+) | Sí (VTT) | Sí (VTT) |
| Webhook de ciclo de vida | NO (solo via polling) | Sí | Sí (Graph Notifications) |
Cuándo NO usar Google Meet
- ❌ Escuela sin Workspace de pago (límite de 1 hora por reunión)
- ❌ Si se requiere grabación automática sin depender de que el host haga clic
- ❌ Si se necesita embed en iframe (Studeia + BBB lo resuelve)
- ❌ Si se necesitan eventos webhook de la reunión (Google no los expone — Studeia depende de polling cron)