
本文详解 LTI 1.3 中获取用户身份(如姓名、角色、邮箱)及课程成员列表的两种标准方式:通过启动 JWT 解析用户声明,或调用 Names and Roles Provisioning Service(NRPS)API;同时阐明 auth.php 与 token.php 的核心职责与安全边界。
本文详解 lti 1.3 中获取用户身份(如姓名、角色、邮箱)及课程成员列表的两种标准方式:通过启动 jwt 解析用户声明,或调用 names and roles provisioning service(nrps)api;同时阐明 `auth.php` 与 `token.php` 的核心职责与安全边界。
在构建符合 IMS Global LTI 1.3 规范的第三方教学工具时,开发者常面临一个关键问题:如何在工具端可靠、合规地获取当前用户的详细信息(如真实姓名、LMS 角色、邮箱)以及其所处课程的完整成员列表? 这并非通过简单调用 /token.php 或 /auth.php 即可实现——二者定位截然不同,且用户数据的获取必须严格遵循 LTI 安全框架设计。
? auth.php 与 token.php 的本质区别
/mod/lti/auth.php是 Moodle(及其他 LMS)实现 OpenID Connect 启动流程(OIDC Launch) 的入口点。当教师在课程内容区点击一个 LTI 工具链接时,LMS 会重定向至该地址,并携带login_hint、target_link_uri等必需参数。此端点负责发起 OIDC 认证授权码流,最终将用户导向 LMS 的登录页或完成静默认证,并最终跳转回你的工具——它不返回用户数据,而是启动整个信任链建立过程。
✅ 正确用途:由 LMS 主动调用,不可手动在 Postman 中直接请求(缺少 OIDC 上下文)。/mod/lti/token.php是 LMS 提供的 OAuth 2.0 Token Endpoint,用于交换授权码(code)换取访问令牌(access_token)。你手动构造 JWT 并调用它,本质上绕过了标准 OIDC 流程,属于调试行为,且默认不包含任何用户或成员信息权限。
⚠️ 注意:Moodle 默认不会为此 endpoint 预置contextmembership.readonly等 NRPS 作用域(scope),因此即使成功获取 token,也无法凭此调用成员服务。
? 获取用户信息的两种标准路径
✅ 方式一:解析 Launch JWT(推荐首选)
每次 LMS 启动你的工具时,都会以 POST 方式将一个已签名 JWT 发送到你的工具启动 URL(如 /launch)。该 JWT 的 payload(载荷)中即嵌入了标准的 User Identity Claims,无需额外 API 调用:
{
"https://purl.imsglobal.org/spec/lti/claim/user_id": "12345",
"https://purl.imsglobal.org/spec/lti/claim/roles": [
"http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor"
],
"https://purl.imsglobal.org/spec/lti/claim/name": "Jane Doe",
"https://purl.imsglobal.org/spec/lti/claim/given_name": "Jane",
"https://purl.imsglobal.org/spec/lti/claim/family_name": "Doe",
"https://purl.imsglobal.org/spec/lti/claim/email": "jane.doe@school.edu",
"https://purl.imsglobal.org/spec/lti/claim/context": {
"id": "course-101",
"label": "Intro to Biology",
"title": "Biology 101 - Fall 2026"
}
}✅ 优势:零延迟、无额外网络请求、无需 scope 授权、所有 LTI 1.3 平台均强制支持。
? 实践建议:在你的工具启动处理器中,务必验证 JWT 签名(使用 LMS 提供的公钥/JWKS URL),再安全解析上述字段。
✅ 方式二:调用 Names and Roles Provisioning Service(NRPS)
当你需要获取整个课程的成员列表(例如显示所有学生头像、批量发送通知),则需调用 NRPS API。这要求:
- 在获取 access token 时,显式声明 scope:
https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly - 使用该 token 请求 NRPS 成员端点(URL 由 Launch JWT 中的
https://purl.imsglobal.org/spec/lti-nrps/claim/names_roles_service提供):
# 示例:获取课程成员 GET https://moodle.example.com/mod/lti/nrps/v2/courses/course-101/members Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
响应示例:
{
"members": [
{
"status": "Active",
"user_id": "12345",
"name": "Jane Doe",
"email": "jane.doe@school.edu",
"roles": ["Instructor"],
"picture": "https://moodle.example.com/pluginfile.php/123/user/icon/core/monotone"
},
{
"status": "Active",
"user_id": "67890",
"name": "John Smith",
"email": "john.smith@school.edu",
"roles": ["Learner"],
"picture": "https://moodle.example.com/pluginfile.php/456/user/icon/core/monotone"
}
]
}⚠️ 关键提醒:若未在 token 请求中包含正确 scope,NRPS 调用将返回
403 Forbidden。Moodle 的token.php默认不接受自定义 scope,需确保 LMS 管理员已在 LTI 工具配置中启用 NRPS 并勾选对应权限。
?️ 安全与实施要点总结
- 绝不硬编码或猜测用户数据:所有身份信息必须源自 LMS 签发的 JWT 或经 OAuth 授权的 NRPS 响应。
-
JWT 验证是强制前提:必须使用 LMS 公布的 JWKS(如
https://moodle.example.com/mod/lti/jwks.php)验证签名,防止伪造。 - Scope 不是可选配置:NRPS、Deep Linking、Grades 等高级服务均依赖精确 scope,缺失即失败。
-
auth.php和token.php是 LMS 内部组件:不应作为工具端主动调用的目标;你的工具只应响应 Launch 请求,并按规范消费 JWT 与调用服务端点。
遵循上述路径,你即可构建出既符合 LTI 1.3 标准、又具备生产级安全与兼容性的跨平台教学工具。

















