Requisitos previos
- Studeia con plan que tenga LTI habilitado (Enterprise o planes de pago)
- Rol de Canvas Admin (para registrar Developer Key)
- HTTPS en ambos lados (LTI 1.3 requiere TLS)
Configuración
1. Studeia: generar config LTI tool
/institution/lti-tools > New Tool:
- Tool name: "Canvas Production"
- Target Link URI:
https://[tenant].studeia.com/lti/launch - OIDC Login URI:
https://[tenant].studeia.com/lti/login - Public JWKS URL:
https://[tenant].studeia.com/.well-known/jwks.json - Studeia genera Client ID + Deployment ID
Studeia muestra el JSON config completo (LTI 1.3 spec) — cópialo.
2. Canvas: registrar Developer Key
- Canvas Admin > Developer Keys > + Developer Key > LTI Key
- Method: Paste JSON
- Pegar el JSON config del paso 1
- Save > ON (activar key)
- Copiar el Client ID generado por Canvas
3. Canvas: instalar app en account/curso
- Account Admin > Settings > Apps > + App > By Client ID
- Pegar Client ID
- Configurar placements:
- Course Navigation (enlace en el menú lateral del curso)
- Assignment Selection (crear assignment de Studeia)
- Link Selection (enlace en páginas/módulos)
- User Navigation (enlace en el menú del usuario)
4. Validar
En cualquier curso de Canvas: menú lateral > Studeia tool > debe abrir Studeia con el mismo usuario autenticado (via OIDC launch).
Cómo funciona
Alumno en Canvas hace clic en "Studeia Module"
↓
Canvas POST /lti/login?iss=... (Studeia OIDC Login endpoint)
↓
Studeia valida + retorna redirect a Canvas con:
- state (HMAC-signed)
- nonce (Redis 15min anti-replay)
↓
Canvas redirige al alumno a /lti/launch con JWT id_token firmado
↓
Studeia LtiService.launch():
1. Valida JWT signature via Canvas JWKS
2. Valida nonce (anti-replay)
3. Valida iss, aud, exp, deployment_id
4. Extrae user_id, name, email, roles, context_id
5. JIT provisioning (crea User si no existe — User.externalId = LTI sub)
6. Crea/actualiza Enrollment (course_id mapping)
7. Inicia sesión de Studeia (Supabase auth)
↓
Redirect al módulo/clase/quiz indicado (LtiLaunch.targetResource)
↓
El alumno usa Studeia con normalidad
AGS grade passback
Cuando el alumno completa una actividad de Studeia que tiene un AGS line_item asociado:
LessonCompletion / QuizAttempt finaliza
↓
Studeia LtiAdvantageService.sendScore():
POST {issuer}/api/lti/courses/{courseId}/line_items/{itemId}/scores
Body: {
userId: lti.sub,
scoreGiven: 85,
scoreMaximum: 100,
activityProgress: "Completed",
gradingProgress: "FullyGraded",
timestamp: now()
}
Auth: OAuth 2.0 Client Credentials grant (Studeia private key signs JWT)
↓
Canvas actualiza el Gradebook automáticamente
Sin escritura doble — el Canvas Gradebook sigue siendo source-of-truth.
Names and Roles Provisioning Service (NRPS)
La spec LTI 1.3 permite a Studeia consultar la lista de alumnos del curso en Canvas:
GET {nrps_url}/memberships
Auth: Bearer (OAuth 2.0 Client Credentials)
Devuelve el roster (alumnos + roles). Útil para pre-popular Enrollments antes del primer launch.
Casos de uso comunes
Universidad ya en Canvas que quiere Studeia en un curso específico
- El Departamento de Informática decide usar Studeia para CS101 (tutor IA real)
- El Admin de Canvas añade la Studeia tool al curso CS101
- Estructura: Canvas tiene topics + assignments + gradebook. Studeia tiene AI tutor + gamificación + interactive content
- Quizzes via Studeia → grade passback al Canvas Gradebook
- Los demás cursos de Canvas continúan sin Studeia
Migración gradual Canvas → Studeia
- Añadir Studeia LTI en todos los cursos
- Cursos nuevos: crear directamente en Studeia, enlace LTI en Canvas como entry point
- Cursos legacy: mantener en Canvas, complementar con Studeia
- En 1-2 años: evaluar decommission de Canvas
Limitaciones
- Deep Linking 1.3: Studeia soporta la selección de recurso específico (módulo/clase) al añadir la tool en un assignment
- LTI Sub Manage (sub-tenants): no soportado de forma nativa — cada tenant de Studeia = una Developer Key de Canvas
- Canvas plagiarism integration: no via Studeia LTI (usar plugin de Canvas por separado)
Solución de problemas
JWT validation fails
Verificar que la JWKS URL de Studeia sea accesible públicamente: curl https://[tenant].studeia.com/.well-known/jwks.json debe retornar JSON con las keys.
Grade passback no funciona
Verificar que el scope AGS esté habilitado en la Developer Key de Canvas: https://purl.imsglobal.org/spec/lti-ags/scope/score + lineitem.readonly o lineitem.
El alumno ve "Tool unavailable"
OIDC nonce expirado (>15min) o state HMAC mismatch. Recargar la página de Canvas.