Что такое LTI?

Из Рецепта создания поставщиков инструментов LTI 1 | IMS Global Learning Consortium :

LTI (Learning Tools Interoperability®) предоставляет стандартный механизм для авторизации пользователей, получающих доступ к веб-приложению (поставщик инструментов) из другого веб-приложения (Потребитель инструментов, обычно LMS). Это можно рассматривать как замену страницы входа в систему, которую поставщик инструментов мог бы в противном случае предоставить, и позволяет избежать необходимости сообщать имя пользователя и пароль каждому пользователю. Вместо этого получено подписанное сообщение о запуске от потребителя инструмента, которое можно проверить, а затем доверять. Это сообщение должно содержать достаточно данных для создания учетных записей пользователей и соответствующих ресурсов (или сопоставлений ресурсов) «на лету». Пользователи получают беспрепятственный опыт без необходимости какой-либо предварительной подготовки, участия каких-либо других серверов (например, поставщиков удостоверений) или изменения каких-либо брандмауэров (сообщение отправляется через браузер пользователя). LTI работает лучше всего, когда поставщик инструментов делегирует полную ответственность за авторизацию пользователей потребителю инструментов и не позволяет пользователям напрямую обращаться к своей системе, тем самым обходя эту авторизацию. Это означает, что нет необходимости синхронизировать две системы с любыми изменениями прав пользователей, поэтому нет риска того, что пользователю будет предоставлен доступ к ресурсам, на которые он больше не имеет права.

Пример кода

В этом примере я реализовал простой потребитель инструмента LTI 1.0 (TC) на статической HTML-странице, используя JavaScript для генерации нестатических параметров сообщения формы: Simple LTI Launch Test

Этот TC включает в себя минимум полей, необходимых для создания действительного запуска LTI. В этом случае сгенерированный запуск будет опубликован в saLTIre эмулятор поставщика инструментов LTI, который способен проверить наш запрос на запуск.

Если вы откроете инструменты разработчика на странице Простой тест запуска LTI, вы увидите, что и форма, и скрипт были зарегистрированы в консоли.

Расширение тега <script> в консоли показывает сценарий, использованный для генерации <form> выше, а также логику, которая генерирует значения для полей oauth_nonce, oauth_timestamp и oauth_signature. Для удобства сюда же включен скрипт:

Этот скрипт использует модуль npm oauth-sign для генерации действительной подписи HMAC-SHA1 из коллекции params, а затем добавляет значение подписи к новому свойству в params, называемому oauth_signature. Затем весь набор параметров используется для заполнения атрибута action и узлов <input> в форме с идентификатором ltiForm, как мы можем видеть, развернув <form> в консоли. Для удобства ниже приведен пример:

OAuth 1.0a

Руководство по внедрению IMS Global Learning Tools Interoperability ™ Basic LTIv1 | IMS Global Learning Consortium

Базовый LTI использует протокол OAuth (http://www.oauth.net) для защиты взаимодействия сообщений между TC и TP. OAuth требует ключ и общий секрет для подписи сообщений. Ключ передается с каждым сообщением, а также сгенерированная OAuth подпись на основе ключа. TP ищет секрет на основе предоставленного ключа, повторно вычисляет подпись и сравнивает повторно вычисленную подпись с переданной подписью, чтобы проверить учетные данные отправителя.

Согласно разделу 4.2 спецификации LTI 1.0 Базовая подпись сообщений LTI и спецификации OAuth 1.0a для действительного запроса OAuth 1.0a требуются следующие поля OAuth:

  • oauth_consumer_key
  • oauth_nonce
  • oauth_signature_method
  • oauth_timestamp
  • oauth_version
  • oauth_signature

LTI 1.0

Параметры, необходимые для действительного запроса LTI, являются надмножеством параметров, необходимых для действительного запроса OAuth. Другими словами, вам понадобятся как минимум поля, перечисленные выше, а также обязательные поля LTI, перечисленные ниже:

Минимальные обязательные поля для запроса на запуск LTI

  • lti_message_type (всегда: basic_lti-launch-request)
  • lti_version (всегда: LTI-1p0)
  • resource_link_id

Хотя эти поля действительно являются минимальным обязательным полем для действительного запроса на запуск LTI, следующие дополнительные поля рекомендуются спецификацией, при этом некоторые из следующих полей обязательны в определенных Поставщики инструментов LTI:

  • resource_link_title
  • user_id
  • roles
  • context_id
  • context_title
  • context_label
  • launch_presentation_document_target
  • launch_presentation_width
  • launch_presentation_height
  • launch_presentation_return_url
  • tool_consumer_instance_guid
  • tool_consumer_instance_name
  • tool_consumer_instance_contact_email

Следующие дополнительные поля рекомендуются, если они не заблокированы из-за настроек конфиденциальности:

  • lis_person_name_given
  • lis_person_name_family
  • lis_person_name_full
  • lis_person_contact_email_primary

В перспективе: преимущества LTI

В одном из следующих постов (после завершения спецификации LTI 1.3) я рассмотрю новые методы аутентификации и подписи OAuth 2 + JWT, необходимые в LTI 1.3 и LTI Advantage.

Проблемы с методом подписи OAuth 1.0a LTI 1.x

(tl; dr - SHA1 небезопасен, OAuth 1.0a устарел)

LTI 1.3+ OAuth 2 / JWT

Участвующие участники IMS Global Learning Consortium, которые возглавляют развитие LTI, отреагировали на опасения рынка по поводу конфиденциальности и безопасности данных учащихся, приняв отраслевой стандартный протокол OAuth2 для служб аутентификации вместе с веб-токенами JSON (JWT) для безопасной подписи сообщений.

Новые требования к сертификации в 2018 году

Дополнительное чтение