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
希望每个人都安全 :) 实际上,我的 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