0

Canvas 是一个学习管理系统,它使用 LTI(学习工具互操作性)连接到第三方网站并进行身份验证。

我们正在编写一个工具。我们有一个与画布共享秘密的工作服务器,因此可以接收消息。当用户点击链接时,用户 ID 被传递给服务器。我们可以执行我们的代码,然后当我们返回时,我们想在系统中插入一个成绩。Canvas 有一个 REST API 来处理这些事情:

https://canvas.instructure.com/doc/api/index.html

例如,要列出我们将使用的课程:

canvas.instructure.com/api/v1/courses

但是,这将失败,因为用户必须在查询中嵌入 oauth 令牌才能进行身份验证。LTI 如何将授权传递回 Canvas,以便我们可以写成绩?

4

2 回答 2

1

您要查找的内容实际上并不特定于 LTI,而是标准的 OAuth2 流程。您需要首先将工具发布到平台的令牌检索端点,通常类似于oauth/token(特别是如果平台使用 Laravel-Passport)。

我现在实际上正在构建这个等式的另一边,连接一个平台 LTI 集成,并且正处于添加“作业和成绩”支持的中间。在 OIDC 握手和 Deep Link 请求(包括作业和成绩服务等的权限范围)之后,IMS Global 的测试套件会联系平台 API 以获取 OAuth2 令牌,以包含在后续的作业和成绩 API 调用中,这就是您的身份验证将来自。

实际上,他们的测试套件似乎未能在初始 OAuth2 paylaod 中包含“client_id”,尽管当 grant_type 为“client_credentials”时,“client_secret”或“client_secret”是必填字段。这似乎是错误的,但我不确定这是否是他们实用程序中的错误,或者这里有一些特定于 LTI 的实现。目前,我的解决方法是告诉他们的实用程序 OAuth 端点包含一个带有我选择的 client_id 的 GET 参数。

这是他们发送给我的内容,我认为与您的工具必​​须提供的内容相似(不确定您是否仅限于此 grant_type,我怀疑任何 OAuth2 格式都足够了):

grant_type: client_credentials
client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer
scope: https://purl.imsglobal.org/spec/lti-ags/scope/lineitem
client_assertion: eyJraWQiOiJpbXN0ZXN0ZXJfNSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyAic3ViIiA6ICJMZW8gSWQiLCAiaXNzIiA6ICJMZW8gSWQiLCAiYXVkIiA6ICJMZW8gYXVkIiwgImlhdCIgOiAxNjA4MDYwMDUwLCAiZXhwIiA6IDE2MDgwNjA0MTAsICJqdGkiIDogImM1MDRmOWVjOGU5OTQyYjdhYzU1NTViZjhhMDE1ZWU1IiAgfQ.JLOATz1vkBj5nn0mBu4-K-CCUeGwLaW6vXieuH0JAZjLBQb606Ba6Mw31jcHryRVBrIv1-1Tzgva8EITVwsd4_z-EUdGrT6qZlBc3bidECPalD8OwT9she0mtUgaMgBetMI3ZSpXV5PCMESMGY9hOlVfWH8ygE0AciVINE6deTf8QlHmu8a1POAzQaxFr7Lpv5bGzXq-DJ9nKFHl3FahWENLr_9PqFjtmapE3ZfruLemR7qq03qiWW8XP82qfX300B-4-SdFpxg_JgwuGGqfBVYavqQT4UcBqv6OQXDyFpAJjUx6hZ6WOEv3ArVn4M4nCGVH-2qXJmm7OUvoGNdEng

client_assertion值是一个 JWT,您可以将其插入https://jwt.io以查看其内容。预计平台将返回工具的 JWKS 端点(同样,不是特定于 LTI 的事物)以获取用于验证 JWK 的公钥。该工具实际上可能提供一组公钥,因此kidJWK 签名中的 将用于选择适当的公钥。

此安全步骤类似于从您的银行收到一封电子邮件,您无需单击其中的潜在垃圾邮件链接,而是直接致电您的银行以确保电子邮件正常。当然,如果没有client_id,就好像不知道该打电话给哪家银行一样,正如我所说,仍在处理那家银行。(如果您对如何将 PEM 转换为 JWKS 感兴趣,我有一个带有辅助函数的要点。)

无论如何,一旦平台验证并解包该令牌,它就可以自由地交还自己的 JWT 以供工具用作授权令牌。我还不完全清楚令牌声明将是什么,特别是考虑到范围声明已经在之前的 Deep Link 调用期间传达给了工具,但希望这种洞察力至少可以帮助你实现目标.

于 2020-12-15T20:39:21.887 回答
0

根据您的描述,我猜您的工具正在使用 LTI 1.1 集成(您可以在其中与 Canvas 交换使用者密钥和秘密)。

为了从 LTI 1.1 工具回传成绩,您需要使用特殊的LIS 成​​绩回传服务

本质上,在 LTI 1.1 发布期间,发布期间存在两个字段lis_outcome_service_urllis_result_sourcedid

然后,当您准备好将成绩提交回平台时,您创建一个replaceResult POX 消息并将其发布回lis_outcome_service_url字段中指定的 url。

如果/当您将应用程序更新到 LTI 1.3 Advantage 时,此流程将替换为更简单的流程,其中有一个line_item 服务端点,您可以从中读取和写入数据。

应该注意的是,这些 API 都不使用上面列出的专有 Canvas API,而是使用与 lms 平台无关的 LTI 流,并且可以在任何 IMS 认证平台中工作。

于 2021-01-29T18:28:18.187 回答