Canvas LMS LTI 1.3 JWS 签名无效 400 ERROR

Canvas LMS LTI 1.3 JWS signature invalid 400 ERROR

希望每个人都安全 :) 实际上,我的 LTI 与我们客户的生产环境的集成存在问题。

我们在客户端的开发端 Canvas LMS 和我们的开发 Canvas 实例中实施了我们的平台。所有这些设置都运行良好。

在生产端安装开发人员密钥后,我们的平台显示 401 ERROR。

我检查了日志,发现在尝试获取访问令牌时出现 400 错误。

{ error: 'invalid_request',
error_description: 'JWS signature invalid.' } }

所以我仔细检查了我的 PEM 文件、JWK、JWK URL,它们都像我们的开发环境一样采用正确的形式。

此外,我检查了 JWT 签名,它们也被验证了。

{ grant_type: 'client_credentials',
  client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
  client_assertion:'JWT Tokens',
  scope:
   'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly' }

JWT 令牌的负载

{
  "iat": 1631687585,
  "exp": 1631860385,
  "aud": "https://[canvas_url]/login/oauth2/token",
  "iss": "https://[canvas_url]",
  "sub": "developer_key",
  "jti": "jwt id -> random"
}

这是我们发送到 https://[canvas url]/login/oauth2/token

的数据

请帮我解决这个问题。 非常感谢。

我不确定我是否遇到了同样的问题,但是在开发过程中我将 JWK 粘贴到开发人员密钥中,但是当我们投入生产时我们使用了 JWK URL 并且当我们发现在使用 JWK URL 时,我们总是从 Canvas 得到一个无效的签名,但在粘贴单个密钥时一切正常。

事实证明,当使用 JWK URL 时,您 必须 在 JWT header 中指定密钥 ID (kid) 所以Canvas 从 JWK 文件中知道要使用哪个密钥。即使文件中只有一个密钥,您仍然需要 kid。您在原始问题中没有 post JWT header 但可能值得检查一下您是否没有包含它。

在规范中,kid 是可选的,这就是为什么我最初在创建 JWT 时没有包含它的原因:https://www.rfc-editor.org/rfc/rfc7515#section-4.1.4