LTI 1.3 Brightspace POC集成:获取Access Token验证断言失败求助
先说明,虽然LTI 1.3是统一标准,但Brightspace在细节实现上确实有几个容易踩坑的地方,结合你之前Moodle集成成功的情况,按下面几个方向排查:
核对签名算法与公钥格式
Brightspace强制要求JWT签名用RS256算法,而且公钥必须是PKCS#8编码的PEM格式——也就是开头是-----BEGIN PUBLIC KEY-----,不能是PKCS#1的-----BEGIN RSA PUBLIC KEY-----。Moodle可能兼容两种格式,但Brightspace卡得很严,先检查工具配置里的公钥是否符合要求。确认Audience(aud)字段完全匹配
请求令牌时,JWT断言里的aud必须和Brightspace的令牌端点URL丝毫不差,包括HTTPS协议、完整域名和路径(比如https://你的域名/d2l/lti/authenticate)。多一个斜杠、少个参数或者域名大小写不对,都会触发验证失败。检查成员数据Scope的正确性
要获取成员数据,必须明确携带https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly这个Scope,而且要用空格分隔多个Scope(如果有其他必要的),不能用数组形式。别把无关的Scope混进去,Brightspace对Scope的解析很严格。校准JWT的时间字段
Brightspace对JWT的exp(过期时间)和iat(签发时间)时间窗口要求很窄:exp不能晚于当前时间5分钟,iat不能早于当前时间5分钟之前。如果你的服务器和Brightspace的服务器时间差超过1分钟,就可能触发验证异常。先同步服务器到NTP时间,再调整断言的时间范围试试。核对Deployment ID和Client ID的一致性
Brightspace工具配置里的Deployment ID和Client ID,必须和你JWT断言里的https://purl.imsglobal.org/spec/lti/claim/deployment_id以及sub字段完全一致,大小写也不能错。Moodle可能对大小写不敏感,但Brightspace是严格校验的。查看Brightspace的详细验证日志
登录Brightspace管理员后台,找到对应的LTI 1.3工具,查看验证日志——里面会有比“Unknown validation exception”更具体的错误原因,比如签名不匹配、aud字段错误、时间戳异常等等,直接看日志能快速定位问题。
另外,你可以把Moodle里成功的JWT和Brightspace请求用的JWT做对比,用本地的JWT解码工具看字段差异,重点盯上面提到的几个字段,大概率能找到问题。
内容的提问来源于stack exchange,提问作者Gil Cohen

