Pre-requisitos
- Studeia plano com LTI habilitado (Enterprise ou planos pagos)
- Canvas Admin role (para registrar Developer Key)
- HTTPS em ambos lados (LTI 1.3 exige TLS)
Setup
1. Studeia: gerar 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 gera Client ID + Deployment ID
Studeia exibe JSON config completo (LTI 1.3 spec) — copie.
2. Canvas: registrar Developer Key
- Canvas Admin > Developer Keys > + Developer Key > LTI Key
- Method: Paste JSON
- Cole JSON config do passo 1
- Save > ON (ativar key)
- Copie Client ID gerado pelo Canvas
3. Canvas: instalar app no account/curso
- Account Admin > Settings > Apps > + App > By Client ID
- Cole Client ID
- Configure placements:
- Course Navigation (link no menu lateral do curso)
- Assignment Selection (criar assignment Studeia)
- Link Selection (link em paginas/modulos)
- User Navigation (link no menu do usuario)
4. Validar
Em qualquer curso Canvas: menu lateral > Studeia tool > deve abrir Studeia logado com mesmo usuario (via OIDC launch).
Como funciona
Aluno em Canvas clica em "Studeia Module"
↓
Canvas POST /lti/login?iss=... (Studeia OIDC Login endpoint)
↓
Studeia valida + retorna redirect para Canvas com:
- state (HMAC-signed)
- nonce (Redis 15min anti-replay)
↓
Canvas redirect aluno para /lti/launch com JWT id_token assinado
↓
Studeia LtiService.launch():
1. Valida JWT signature via Canvas JWKS
2. Valida nonce (anti-replay)
3. Valida iss, aud, exp, deployment_id
4. Extract user_id, name, email, roles, context_id
5. JIT provisioning (cria User se nao existe — User.externalId = LTI sub)
6. Cria/atualiza Enrollment (course_id mapping)
7. Inicia sessao Studeia (Supabase auth)
↓
Redirect pra modulo/aula/quiz indicado (LtiLaunch.targetResource)
↓
Aluno usa Studeia normalmente
AGS grade passback
Quando aluno completa atividade Studeia que tem AGS line_item associado:
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 atualiza Gradebook automaticamente
Sem dupla escrita — Canvas Gradebook continua source-of-truth.
Names and Roles Provisioning Service (NRPS)
LTI 1.3 spec permite Studeia consultar lista de alunos do curso Canvas:
GET {nrps_url}/memberships
Auth: Bearer (OAuth 2.0 Client Credentials)
Retorna roster (alunos + roles). Util para pre-popular Enrollments antes do primeiro launch.
Casos de uso comuns
Universidade ja em Canvas quer Studeia em curso especifico
- Departamento de Computacao decide usar Studeia para CS101 (tutor IA real)
- Admin Canvas adiciona Studeia tool no curso CS101
- Estrutura: Canvas tem topics + assignments + gradebook. Studeia tem AI tutor + gamificacao + interactive content
- Quizzes via Studeia → grade passback pro Canvas Gradebook
- Outros cursos Canvas seguem sem Studeia
Migracao gradual Canvas → Studeia
- Adicionar Studeia LTI em todos cursos
- Cursos novos: criar direto no Studeia, link LTI no Canvas como entry point
- Cursos legacy: manter em Canvas, complementar com Studeia
- Em 1-2 anos: avaliar decommission Canvas
Limitacoes
- Deep Linking 1.3: Studeia suporta selecao de recurso especifico (modulo/aula) durante adicionar tool em assignment
- LTI Sub Manage (sub-tenants): nao suportado nativamente — cada tenant Studeia = um Developer Key Canvas
- Canvas plagiarism integration: nao via Studeia LTI (use plugin Canvas separado)
Troubleshooting
JWT validation fails
Verificar JWKS URL Studeia acessivel publicamente: curl https://[tenant].studeia.com/.well-known/jwks.json deve retornar JSON com keys.
Grade passback nao funciona
Verificar AGS scope habilitado em Developer Key Canvas: https://purl.imsglobal.org/spec/lti-ags/scope/score + lineitem.readonly ou lineitem.
Aluno ve "Tool unavailable"
OIDC nonce expirado (>15min) ou state HMAC mismatch. Recarregar pagina Canvas.