Árvore Docs Guia

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

ClaimTipoUso
issstringIdentifica a plataforma; precisa bater com o issuer registrado
audstringPrecisa ser o client_id registrado
substringIdentificador único do usuário na plataforma; chave do lti_user_links
noncestringToken anti-replay; consumido no banco depois do uso
exp / iatnumberTTL do JWT
https://purl.imsglobal.org/spec/lti/claim/message_typestringDeve ser LtiResourceLinkRequest
https://purl.imsglobal.org/spec/lti/claim/versionstringDeve ser 1.3.0
https://purl.imsglobal.org/spec/lti/claim/deployment_idstringBate com deployment_id registrado
https://purl.imsglobal.org/spec/lti/claim/resource_link.idstringIdentifica o link específico dentro de um contexto

Claims usados para perfil

Se presentes, são gravados no usuário Árvore criado:

ClaimMapeia para
emailusers.email
nameusers.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 LTIRole Árvore
...membership#Instructor ou ...institution/person#InstructorProfessor (admin profile, role Avançado)
...system/person#Administrator ou ...institution/person#AdministratorAdmin de escola (admin profile, role Admin)
...membership#Learner ou ...institution/person#Student ou ausência das outrasAluno (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.