0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LTI 1.3 Deep Linking入門:LMSにコンテンツを登録する仕組み

0
Posted at

はじめに

LTI 1.3でLMSと外部ツールを連携していると、途中で「Deep Linking」という仕組みが出てきます。

ただ、名前だけではイメージしづらく、仕様やサンプルコードを見ても、

  • なんのために使うのか
  • 通常の LTI 起動となにが違うのか
  • Request / Response でなにをやり取りしているのか

が分かりにくいと感じやすいです。

この記事では、Deep Linkingを「ツールの中からコンテンツを選び、その結果をLMSに返して登録する仕組み」 として整理しながら、全体の流れとRequest / Responseの中身を順に見ていきます。

Deep Linkingってなに?

Deep Linkingは、「外部ツールの中から教材や課題を選び、その選択結果をLMSに渡してコースへ追加する仕組み」です。

例えば、教員がLMS上でコースを作成していて、外部の小テストツールの中から「第1章テスト」を選んでコースに追加したいとき、次のような流れになります。

LMSで「外部ツール追加」を押す
↓
外部ツールが開く
↓
ツール内で追加したいコンテンツを選ぶ
↓
その選択結果がLMSに返る
↓
LMSがコース内に項目を作成する

ポイントは、ツールの中でコンテンツを選ぶことと、結果をLMSに返して登録してもらうことです。

どんな場面で使うの?

Deep Linkingは、主に「LMSに外部ツールのコンテンツを登録したい」ときに使います。

例えば、次のようなケースです。

  • 小テストツールで作成したテストをLMSの課題として追加したい
  • 動画配信ツールの中から特定の動画をコースに配置したい
  • デジタル教材サービスの中から教材を選んで授業ページに載せたい

なんでDeep Linkingが必要なの?

Deep Linkingがない場合、外部ツールのコンテンツをLMSに登録するときに手作業が必要になることがあります。

例えば、こんな流れになると思います。

ツールでコンテンツを作る
↓
そのコンテンツのURLを探す
↓
LMS に戻ってURLを貼る
↓
タイトルや点数などを別で設定する

これでも動くかもしれませんが、このやり方では次のような問題があります。

  1. URLを探して貼らなければならない
  2. LMS上の表示名や課題設定を別で加えなくてはならない
  3. LMSが受け取りたい情報を登録できない

問題3つ目のLMSで受け取りたい情報とは、例えば以下のようなものです。

  • LMS上での表示名
  • 説明文
  • 後で起動するためのURL
  • 必要なら採点対象としての設定

Deep Linkingを使うとツールはこれらの情報をまとめてLMSに返せます。
その結果、教員はツール内でコンテンツを選ぶだけでよくなり、LMS側ではその内容に応じて適切な項目を自動で作ることができます。

つまり、Deep Linkingは単にURLを貼る代わりのものではなく、LMSに登録するための情報を標準的な形で渡す仕組みです。

Deep Linkingの流れを知ろう

Deep Linking全体の流れは次の4ステップで考えると整理しやすいです。

  1. LMSがツールを起動する
  2. ツールがコンテンツ選択UIを表示する
  3. 利用者がコンテンツを選ぶ
  4. ツールが選択結果をLMSに返す

このうち、技術的に重要なのは1と4です。
1でLMSからツールへ送られるものはDeepLinkingRequest
4でツールからLMSへ返されるものはDeepLinkingResponseと呼ばれています。

DeepLinkingRequest - LMSはツールになにを送るの?

DeepLinkingRequestはLMSからツールへの起動メッセージです。
役割としてはツールに対する「注文書」と考えると分かりやすいです。

DeepLinkingRequestを見て、ツールは

  • 今回は通常のコンテンツ表示ではなく、Deep Linkingの起動であること
  • どのコースから来たのか
  • 誰が来たのか
  • どこに結果を返せばよいのか
  • どんな種類の項目を返してよいのか

を知ります。

実際のメッセージはJWTというもので行われます。
まずは意味が分かるように簡略化した形で見てみましょう。
以下のJSONは理解しやすさのためにclaim名を短くした疑似コードです。

{
  "message_type": "LtiDeepLinkingRequest",
  "version": "1.3.0",
  "deployment_id": "deployment-123",

  "context": {
    "id": "course-001",
    "title": "サンプルコース"
  },
  "roles": ["Instructor"],

  "deep_linking_settings": {
    "deep_link_return_url": "https://lms.example.com/deep_links",
    "accept_types": ["ltiResourceLink"],
    "accept_multiple": true,
    "accept_lineitem": true,
    "data": "opaque-value"
  }
}

この中で特に重要なのはdeep_linking_settingsの中身です。上から順番に説明していきます。

  1. deep_link_return_url
    選択が終わったあとに、どこへ結果を返せばよいかを表します。

  2. accept_types
    LMSがどの種類のコンテンツを受け取れるかを表します。
    例えば、ltiResourceLinkのみ受け取れる場合、ツールはその形式で返す必要があります。

  3. accept_multiple
    一度に複数のコンテンツを返してよいかどうかを表します。

  4. accept_lineitem
    採点対象としての情報を含めてもよいかどうかの目安です。

  5. data
    LMSから渡される付加情報です。ツールは必要に応じてこれをResponseにそのまま返します。

ここまでの情報をまとめると、要するにDeepLinkingRequestは

このコース向けにこういう種類のコンテンツを選ばせて、選び終わったらこのURLに返してください

というLMSの指示を書いているものと言えます。

DeepLinkingResponse - ツールはLMSになにを返すの?

DeepLinkingResponseは、ツールからLMSへの返答です。
役割としては「この内容でコースに登録してください」という登録指示です。

DeepLinkingResponseの中身を簡略化した形で書くと次のようなイメージになります。

{
  "message_type": "LtiDeepLinkingResponse",
  "version": "1.3.0",
  "deployment_id": "deployment-123",
  "data": "opaque-value",

  "content_items": [
    {
      "type": "ltiResourceLink",
      "title": "第1章テスト",
      "text": "理解度チェック用の小テスト",
      "url": "https://tool.example.com/path/to/quiz/ch1",
      "lineItem": {
        "label": "第1章テスト",
        "scoreMaximum": 100,
        "resourceId": "quiz-ch1"
      }
    }
  ]
}

このメッセージが LMS に伝えているのは、だいたい次のような内容です。

第1章テストという名前の項目をコースに追加してください。
その項目はLTIリンクとして扱い、起動先はこのURLです。
さらに、採点対象として満点が100点になるように設定してください。

content_itemsにはLMSに追加してほしいコンテンツの情報が入ります。
この中身を上から順番に説明していきます。

  1. type
    なにを追加するかの種類です。
    ここではltiResourceLinkと書いてあるので、LTIで起動されるリンク項目を作ってほしいという意味になります。

  2. title
    LMS上で表示される名前です。

  3. text
    説明文です。
    LMSによって表示される場所は異なりますが、この項目がなにかを補足するためのテキストです。

  4. url
    その項目が後で起動されるときのURLです。
    その場で表示するためのURLではなく、LMSに登録された項目を後から開いたときの起動先です。
    省略された場合はツールのベースLTI URLが使われます。

  5. lineItem
    採点対象として扱うための情報です。
    例えば、scoreMaximum: 100と書いてあれば満点が100点の課題としてLMSに登録できます。

ここまで見ると分かる通り、Deep Linkingで返しているのは単なるリンクではありません。
LMSにどういう項目を作ってほしいか、その設定情報をまとめて返しているわけです。

ここまでの情報をまとめると、要するにDeepLinkingResponseは

LMSにどういう項目を作ってほしいかの設定情報

を返しているものと言えます。

補足 - ツールはどうやってResponseを返すの?

先ほど書いたコードはあくまでもDeepLinkingResponseの中身です。
JSONをそのまま返すわけではなく、実際にはJWTにしてLMSのdeep_link_return_urlPOSTします。

次のようなイメージです。

<form action="https://lms.example.com/deep_links" method="POST">
  <input type="hidden" name="JWT" value="signed.jwt.here" />
</form>
<script>
  document.forms[0].submit();
</script>

actionに入るURLはツールが固定で持っているものではなく、DeepLinkingRequestの deep_link_return_urlから受け取った値です。

つまり、Deep Linkingは

  1. LMSがここに返してと言う
  2. ツールがその返却先に値を返す

という往復の流れになっています。

通常のLTI起動となにが違うの?

さて、Deep Linkingと通常のLTI起動はなにが違うのでしょうか?
一言で言うと、以下の通りです。

  • 通常のLTI起動
    すでにLMSに登録されている項目を利用するために起動する

  • Deep Linking
    これからLMSに登録する項目を選ぶために起動する

起動したときの流れで比べてみると以下のようになります。

  • 通常のLTI 起動
    LMS → ツール → コンテンツを表示

  • Deep Linking
    LMS → ツール → コンテンツを選ぶ → LMS に結果を返す

通常の起動は「使う」ためのもの、Deep Linkingは「登録するものを選ぶ」ためのものと考えると分かりやすいです。

まとめ

Deep Linkingは次の3点を押さえておきましょう。

  1. DeepLinkingRequest = LMSからツールへの注文書
    どのコース向けか、どこに返すか、なにを返してよいかが入っています。

  2. DeepLinkingResponse = ツールからLMSへの登録指示書
    ツールは選ばれたコンテンツをLMSにどう登録してほしいかを返します。

  3. Deep Linkingが返しているもの = LMSに登録するための情報一式
    title、url、必要ならlineItemまで含めて返します。

Deep Linkingは最初は少しわかりづらいですが、

  1. LMSが選択用にツールを起動する
  2. ツールが選択結果を返す
  3. LMSがその結果をコースに登録する

という流れで捉えるとわかりやすいと思います。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?