Claims do id_token
Um Resource Link Launch traz um id_token (JWT) com vários claims definidos pela spec LTI 1.3. A Árvore usa um subconjunto deles.
Claims obrigatórios
| Claim | Tipo | Uso |
|---|---|---|
iss | string | Identifica a plataforma; precisa bater com o issuer registrado |
aud | string | Precisa ser o client_id registrado |
sub | string | Identificador único do usuário na plataforma; chave do lti_user_links |
nonce | string | Token anti-replay; consumido no banco depois do uso |
exp / iat | number | TTL do JWT |
https://purl.imsglobal.org/spec/lti/claim/message_type | string | Deve ser LtiResourceLinkRequest |
https://purl.imsglobal.org/spec/lti/claim/version | string | Deve ser 1.3.0 |
https://purl.imsglobal.org/spec/lti/claim/deployment_id | string | Bate com deployment_id registrado |
https://purl.imsglobal.org/spec/lti/claim/resource_link.id | string | Identifica o link específico dentro de um contexto |
Claims usados para perfil
Se presentes, são gravados no usuário Árvore criado:
| Claim | Mapeia para |
|---|---|
email | users.email |
name | users.name (fallback: given_name + family_name, depois preferred_username) |
picture | (ainda não usado) |
Quando email não vem no id_token, a Árvore gera um placeholder no formato lti-<platform_id>-<sub>@lti.arvore.com.br para satisfazer a constraint de email único. Depois disso, qualquer atualização vinda de NRPS ou de novo launch atualiza o registro.
Claim de contexto (turma)
{
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "course-12345",
"label": "MATH-101",
"title": "Matemática 6º ano A",
"type": ["http://purl.imsglobal.org/vocab/lis/v2/course#CourseSection"]
}
}
A Árvore usa context.id como chave em lti_resource_links. Na primeira vez que vê um context_id novo, cria uma entity do tipo class com nome igual a context.title (fallback context.label).
Claim de roles
{
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
]
}
Mapeamento:
| Role LTI | Role Árvore |
|---|---|
...membership#Instructor ou ...institution/person#Instructor | Professor (admin profile, role Avançado) |
...system/person#Administrator ou ...institution/person#Administrator | Admin de escola (admin profile, role Admin) |
...membership#Learner ou ...institution/person#Student ou ausência das outras | Aluno (reader profile) |
Claim de NRPS
{
"https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice": {
"context_memberships_url": "https://lms.exemplo.com/api/lti/courses/123/names_and_roles",
"service_versions": ["2.0"]
}
}
Quando presente, o context_memberships_url é salvo em lti_resource_links.nrps_url e usado pelo cron diário para puxar o roster completo da turma.