技术解析与集成指南)
教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载导读Moodle 仓库内置的 public/lib/ltiprovider 目录是一套面向 PHP 的 LTILearning Tools Interoperability®学习工具互操作性工具提供方Tool Provider实现类库。它封装了工具提供方与 LTI 工具消费方Tool Consumer如各种学习管理系统通信所需的完整代码支持 LTI 1.1、LTI 1.0 非官方扩展以及 LTI 2.0 的注册流程与服务。读完本文你将掌握该库的核心架构、请求处理流程、持久化连接器设计以及它在 Moodle 中被enrol_lti选课插件LTI 发布为工具实际消费的方式为自行阅读、扩展或移植该库提供完整索引。该库解决什么问题LTI 工具提供方的通信抽象public/lib/ltiprovider/README.md开篇即点明该库的定位这一组 PHP 类封装了 LTI 合规的工具提供方与 LTI 工具消费方通信所需的全部代码。它并不仅覆盖某一种协议版本而是同时涵盖LTI 1.1正式消息规范LTI 1.0 的非官方扩展包括 outcomes 结果服务、memberships 成员服务、setting 设置服务等ext_前缀扩展参数LTI 2.0 的注册流程与服务Tool Proxy 注册、安全契约、服务发现。这些类源自 ceLTIc 项目创建的 LTI Tool Provider 类库是其在 PHP 环境下的扩展实现。原文档强调单纯支持 LTI并不困难但借助这样一个类库开发者能获得以下实质性收益抽象层隔离类库将 LTI 通信细节与应用业务代码彻底分离工具提供方的业务逻辑不必感知底层 OAuth 签名、HTTP 交换等实现可复用性同一套类库代码可复用于多个不同的工具提供方应用数据对象化与默认值填充LTI 请求中的原始参数被转换为User、Context、ResourceLink等业务对象缺失的数据会自动以合理的默认值补齐结果服务自动降级outcomes 服务会依据工具消费方实际支持的能力自动选择 LTI 1.1 正式结果服务或非官方 outcomes 扩展非官方扩展支持memberships成员名单与 setting工具设置服务均有现成实现附加管控能力可启用/禁用某个消费方密钥、为每个消费方密钥设置访问的启用开始/结束时间窗口、支持资源共享sharing安排使来自不同资源链接的用户能在同一个工具提供方链接内协作平滑升级工具提供方应用可在最小代码改动的前提下受益于 LTI 规范的后续更新。源码结构从命名空间看库的组织方式类库遵循 PSR-4 自动加载规范见 public/lib/ltiprovider/composer.json命名空间根为IMSGlobal\LTI对应src/目录要求 PHP 5.6.0。其核心源码结构如下public/lib/ltiprovider/src/ ├── OAuth/ # OAuth 1.0 签名实现 │ ├── OAuthConsumer.php / OAuthRequest.php / OAuthServer.php │ ├── OAuthSignatureMethod.php │ ├── OAuthSignatureMethod_HMAC_SHA1.php │ └── OAuthSignatureMethod_HMAC_SHA256.php ├── Profile/ # LTI 2.0 工具/消费方画像描述 │ ├── Item.php / Message.php │ ├── ResourceHandler.php / ServiceDefinition.php ├── ToolProvider/ # 工具提供方核心对象 │ ├── ToolProvider.php # 请求处理中枢 │ ├── ToolConsumer.php / ToolProxy.php │ ├── Context.php / ResourceLink.php / User.php │ ├── Outcome.php / ContentItem*.php │ ├── ConsumerNonce.php / ResourceLinkShare*.php │ ├── DataConnector/ # 持久化抽象层 │ │ ├── DataConnector.php # 基类默认无持久化 │ │ ├── DataConnector_mysql.php # MySQL 实现 │ │ ├── DataConnector_pdo.php # PDO 实现 │ │ └── DataConnector_pdo_sqlite.php# SQLite 实现 │ ├── MediaType/ # LTI 2.0 JSON 媒体类型 │ │ ├── ToolProxy.php / ToolProfile.php │ │ ├── SecurityContract.php / Message.php / ResourceHandler.php │ └── Service/ # LTI 2.0 服务调用 │ ├── Service.php / Membership.php / ToolSettings.php └── HTTPMessage.php # HTTP 消息封装从源码结构可以看出三层职责划分OAuth 层负责消息签名与校验同时提供 HMAC-SHA1 与 HMAC-SHA256 两种签名方法对象层负责把 LTI 参数映射为领域对象DataConnector 层负责与数据库交互让上层对象获得持久化能力。请求处理流程handleRequest 与消息类型分派工具提供方的入口是 ToolProvider.php 中的handleRequest()方法其处理管线清晰且可验证handleRequest() ├─ authenticate() // 校验 OAuth 签名、lti_message_type、lti_version 等 │ // ToolProvider.php#L675 起 ├─ doCallback() // 按 lti_message_type 分派到对应回调方法 │ // ToolProvider.php#L584 起 └─ result() // 输出结果重定向、渲染 HTML 或返回错误信息 // ToolProvider.php#L610 起authenticate()首先校验请求中是否包含lti_message_type且其值在受支持的消息类型集合内然后校验lti_version必须是LTI-1p0或LTI-2p0之一对应类常量LTI_VERSION1与LTI_VERSION2对于basic-lti-launch-request还会强制要求resource_link_id非空。库支持的三种消息类型及其分派目标定义于静态属性$MESSAGE_TYPES/$METHOD_NAMESToolProvider.php消息类型lti_message_type分派方法含义basic-lti-launch-requestonLaunch()标准的 LTI 1.x 启动请求ContentItemSelectionRequestonContentItem()LTI Content-Item资源选择请求ToolProxyRegistrationRequestonRegister()LTI 2.0 工具代理注册请求这些方法在基类中默认只调用onError()即要求子类覆写实现业务逻辑设计上正是模板方法 回调模式基类完成认证、参数校验等通用工作业务代码只需覆写对应回调即可。doCallback()还会在注册请求成功后自动调用$this-consumer-save()持久化消费方对象。错误处理同样完善若认证失败且消费方提供了launch_presentation_return_url或content_item_return_urlresult()会构造带lti_errormsg/lti_errorlog参数的重定向 URL 返回给消费方custom_debugtrue时还会输出带Debug error:前缀的详细原因。此外 ToolProvider.php 提供setParameterConstraint($name, $required, $maxLength, $messageTypes)允许应用为特定参数设置必填与长度约束在启动时自动校验。LTI 数据对象化与默认值机制原文档强调LTI 数据被转换为有用的对象缺失数据自动替换为合理默认值这一点在源码中体现得十分具体领域对象ToolConsumer消费方、Context课程/上下文、ResourceLink资源链接、User用户、Outcome结果分别封装 LTI 参数例如消费方的密钥、上下文标题、用户的邮箱/姓名等均以对象属性形式访问。自定义参数替换变量CUSTOM_SUBSTITUTION_VARIABLESToolProvider.php维护了一张完整的 LTI 能力capability到消息参数名的映射表涵盖User.id、Person.name.full、Person.email.primary、Context.id、Context.type、ResourceLink.title、Result.sourcedId、BasicOutcome.url等二十余项使工具提供方能够自动完成 LTI 2.0 画像能力与 LTI 1.x 消息参数之间的相互转换。ID 作用域类常量ID_SCOPE_ID_ONLY、ID_SCOPE_GLOBAL、ID_SCOPE_CONTEXT、ID_SCOPE_RESOURCEToolProvider.php定义了用户 ID 的生成策略——是仅用 ID 值还是以消费方密钥、上下文 ID、资源 ID 为前缀分隔符:生成全局唯一 ID这也是用户来自不同资源链接可协作特性的底层支撑。保留设置参数LTI_CONSUMER_SETTING_NAMES、LTI_CONTEXT_SETTING_NAMES、LTI_RESOURCE_LINK_SETTING_NAMES三张表ToolProvider.php列出了从请求中截取并保留在消费方/上下文/资源链接设置属性中的参数名如lis_result_sourcedid、lis_outcome_service_url、ext_ims_lis_memberships_url等是结果服务与成员服务得以工作的数据基础。持久化设计DataConnector 抽象层DataConnector.php 是库的持久化抽象基类其默认行为是无持久化loadToolConsumer()直接返回一个用默认值填充的消费方对象具体数据库适配由子类实现。基类定义了七张标准表名常量常量表名存储内容CONSUMER_TABLE_NAMElti2_consumer工具消费方TOOL_PROXY_TABLE_NAMElti2_tool_proxy待处理的工具代理LTI 2.0CONTEXT_TABLE_NAMElti2_context上下文课程RESOURCE_LINK_TABLE_NAMElti2_resource_link资源链接USER_RESULT_TABLE_NAMElti2_user_result用户与结果RESOURCE_LINK_SHARE_KEY_TABLE_NAMElti2_share_key资源共享密钥NONCE_TABLE_NAMElti2_nonceOAuth nonce 防重放仓库随附三种实现DataConnector_mysql.php、DataConnector_pdo.phpPDO 通用与DataConnector_pdo_sqlite.phpSQLite开发者可直接选用或仿照它们实现自己的数据库适配。这正是原文档所说代码可在多个工具提供方之间复用的落点数据库差异被压缩在 DataConnector 一层内。Moodle 集成实证enrol_lti 如何消费该库该库在 Moodle 中最典型的使用者是 LTI 选课插件enrol_lti将 Moodle 课程发布为 LTI 工具供外部平台调用。其数据连接器 public/enrol/lti/classes/data_connector.php 直接继承库的IMSGlobal\LTI\ToolProvider\DataConnector\DataConnector构造函数以enrol_lti_作为数据库表名前缀拼出enrol_lti_consumer、enrol_lti_context、enrol_lti_nonce、enrol_lti_resource_link、enrol_lti_share_key、enrol_lti_tool_proxy、enrol_lti_user_result等实际表名覆写loadToolConsumer()等持久化方法改由 Moodle 全局$DB数据对象访问记录并按消费方密钥的 SHA-256 摘要consumerkey256字段查询避免明文密钥直接参与索引查询。这清晰印证了原文档所述抽象层把 LTI 通信与应用程序代码分离的价值enrol_lti只需实现连接器接口即可把 LTI 对象接入 Moodle 自身的数据库基础设施。仓库内维护说明Moodle 对上游库的本地化改动仓库内随附的 public/lib/ltiprovider/readme_moodle.txt 记录了 Moodle 维护该第三方库时的本地改动清单这些信息对任何打算集成或升级该库的开发者都极具参考价值Consumer 画像属性为ToolConsumer类补充 consumer profile 成员变量并为Context类新增context_type属性当 POST 中提交context_type参数时予以设置放宽必填约束不再强制要求tool_consumer_instance_guid参数并防止对发往提供方的请求进行再修改PHP 版本兼容MDL-67034 的 PHP 7.4 兼容修复MDL-78144 的 PHP 8.2 兼容——为避免动态属性弃用警告在类声明上方批量添加#[\AllowDynamicProperties]特性文档给出了基于sed的批量处理命令网络层改造MDL-71920 将上游的curl_exec直接调用迁移为 Moodle 自身的 curl 封装见 HTTPMessage.php 中require_once($CFG-libdir . /filelib.php)以便统一遵守站点的安全设置反向代理支持MDL-64152 使用 Moodle 的$FULLME作为 OAuth 签名所用 URL解决反向代理场景下的签名校验问题升级注意升级该库前应比对DataConnector.php与DataConnector_mysql.php的变更若表结构有变化需同步更新enrol_lti的data_connector.php、db/install.xml与db/upgrade.php。另外值得注意的是上游文档建议通过 Composer 安装依赖而 Moodle 仓库选择直接捆绑源码内含自动加载器因此无需在 Moodle 内再执行 composer install。结语与延伸阅读public/lib/ltiprovider是一份结构清晰、协议覆盖完整LTI 1.1 / LTI 1.0 扩展 / LTI 2.0 注册与服务的工具提供方实现其对象化数据 DataConnector 持久化抽象 回调分派的设计使应用代码得以与 LTI 细节解耦。若需深入建议按以下顺序阅读仓库源码入口与分派ToolProvider.php持久化抽象DataConnector.php 及其 MySQL/PDO/SQLite 实现领域对象src/ToolProvider/下的ToolConsumer.php、Context.php、ResourceLink.php、User.phpMoodle 集成实例public/enrol/lti/classes/data_connector.php维护与升级说明public/lib/ltiprovider/readme_moodle.txt需要提醒的是该库的正式文档与示例应用托管于上游项目LTI-Tool-Provider-Library-PHP 的 wiki 与基于本库开发的 rating 示例工具提供方应用本仓库内不包含这些外部文档涉及协议规范细节时建议以 IMS Global 的 LTI 规范为准。赞分享教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载相关推荐BigBlueButton LTI 集成指南通过 LTI 启动请求接入 LMS 虚拟教室BigBlueButton LTI 集成指南通过 LTI 启动请求接入 LMS 虚拟教室 BigBlueButton 原生支持接收来自 LTILearnin教育音视频后端前端ai-sdk/provider-utils 能力全景解析AI SDK 提供方实现工具库的版本演进与技术内核ai sdk/provider utils 能力全景解析AI SDK 提供方实现工具库的版本演进与技术内核 导读 ai sdk/provider util人工智能AI 应用AI Agent工具调用MCP Clients上一篇OpenClaw 客户端遇到 AUTH_RATE_LIMITED 认证限流锁定时如何理解与缓解下一篇5分钟玩转Pyecharts主题切换从内置主题到个性化定制全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考