Системы управления обучением (LMS), такие как Canvas, Moodle, Blackboard и D2L Brightspace, это основные платформы, которыми пользуются университеты и корпоративные команды обучения. Чтобы сделать оценки Testlify доступными внутри этих систем, я спроектировал и построил интеграцию Testlify LTI с нуля в роли ведущего инженера. Интеграция позволяет преподавателям встраивать оценки Testlify прямо в курсы LMS и автоматически синхронизировать баллы с журналом оценок.

Интеграция официально сертифицирована 1EdTech для LTI Advantage (v1.3), охватывая Names and Role Provisioning Services (NRPS 2.0) и Assignment & Grade Services (AGS 2.0).
Что я сделал
- Собственный слой безопасности LTI 1.3: реализовал полную спецификацию безопасности LTI 1.3 на Next.js 14, включая сторонние потоки запуска OpenID Connect (OIDC), проверку подписи JWT RSA SHA-256 и динамические эндпоинты JWKS.
- Сервисы LTI Advantage: зарегистрировал Deep Linking как поддерживаемый тип сообщения при регистрации платформы, построил полную интеграцию NRPS 2.0 для получения списков курса (с пагинацией и нормализацией role-URN между платформами LMS), а также эндпоинты AGS 2.0 для автоматической синхронизации оценок.
- Мультитенантная full-stack архитектура: построил мультитенантный административный дашборд на React 18, настроил схемы MongoDB для ключей регистрации платформ и подключился к сети отдельно запущенного Docker-окружения Moodle для локального тестирования. Canvas, размещённый Instructure, вместо этого тестировался напрямую на живом инстансе.
Почему это было важно
Получение официальной сертификации 1EdTech позволило Testlify выйти на рынки высшего образования и корпоративного обучения. Автоматическая синхронизация списков и передача оценок устранили ручной ввод данных для преподавателей.
Команда и сроки
25 коммитов за примерно 7 недель (с февраля по март 2026 года), при этом рядом со мной работали двое коллег. Я написал примерно 80% коммитов и вёл архитектуру и работу над сертификацией; «ведущий инженер», это точное описание роли, а не завышенное.
Написано самостоятельно, а не через ltijs
ltijs, это стандартная библиотека Node.js для LTI 1.3, и большинство интеграций обращаются именно к ней. Эта интеграция от неё не зависит. Получение JWKS, сопоставление ключей и проверка JWT по RS256 реализованы напрямую в этой кодовой базе, наряду с паттерном сессии без состояния, описанным в сопутствующем посте блога: подписанный 24-часовой токен сессии (ltik), передаваемый в URL вместо куки, отправляемый как bearer-токен при каждом вызове API, специально для того, чтобы интеграция продолжала работать, когда браузер блокирует сторонние куки внутри iframe LMS. Прохождение сертифицированной интеграции через тестирование на соответствие 1EdTech означает, что слой безопасности должен в точности соответствовать спецификации; владение этим кодом напрямую, вместо зависимости от релизного цикла сторонней библиотеки и её трактовки спецификации, упростило проверку и сертификацию.
NRPS и AGS, два полностью построенных сервиса LTI Advantage, идут дальше минимума спецификации: NRPS обрабатывает пагинацию через собственные заголовки Link LMS и нормализует role-URN между платформами, которые форматируют их по-разному, с клиентским фильтром в качестве страховки для платформ LMS, не полностью соответствующих спецификации.
Четыре платформы LMS, один локальный тестовый стенд
Moodle не поднимается собственным файлом Docker Compose этого репозитория; он подключается к сети отдельно запущенного проекта moodle-docker для локального тестирования. Canvas, это собственный хостинговый SaaS от Instructure без эквивалентного самостоятельно размещаемого образа для локального запуска, поэтому вместо этого он тестируется напрямую на живом инстансе Canvas. Продакшен работает на Vercel. Production Dockerfile существовал на раннем этапе и позже был удалён, как только Vercel стал единственной реальной целью деплоя; остался только dev-only Dockerfile для локальной итерации, а не как запасной вариант для самостоятельного хостинга. Поддержка D2L Brightspace была добавлена позже, датированным коммитом, добавившим поддержку регистрации для четвёртой LMS, не входившей в изначальные три.
Модель данных и масштаб
- Каждая зарегистрированная платформа LMS (инстанс Canvas/Moodle/Blackboard/Brightspace университета или учреждения) представляет собой отдельную запись тенанта со своими ключами регистрации, а не общими глобальными учётными данными.
- Отдельные сервисные модули обрабатывают NRPS (получение списков) и AGS (позиции и отправку баллов) в соответствии со спецификацией LTI Advantage, плюс отдельный эндпоинт вебхука для баллов.
- MongoDB через Mongoose обеспечивает хранение конфигурации платформ и записей назначения оценок.
Проект перерос собственный README: более подробный и более свежий внутренний обзор описывает полную архитектуру с 4 LMS, развёрнутую на Vercel, с собственной документацией по безопасности, базе данных и справочником API, которой эта интеграция в итоге стала.
Своё решение или готовое
Самописная логика JWKS/JWT/сессий вместо библиотеки ltijs: полный контроль над соответствием спецификации для интеграции, привязанной к сертификации, вместо того чтобы наследовать собственную трактовку спецификации от зависимости. Vercel вместо самостоятельного хостинга: как только он стал единственной реальной целью деплоя, production Dockerfile был удалён, а не оставлен неиспользуемым, остался только dev-only Dockerfile для локальной итерации.
Стек
Next.js 14, React 18, MongoDB с Mongoose, Docker Compose для локального тестирования Moodle, развёрнуто на Vercel, сертифицировано по набору проверки соответствия 1EdTech LTI Advantage (1.3).