はじめに
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を貼る
↓
タイトルや点数などを別で設定する
これでも動くかもしれませんが、このやり方では次のような問題があります。
- URLを探して貼らなければならない
- LMS上の表示名や課題設定を別で加えなくてはならない
- LMSが受け取りたい情報を登録できない
問題3つ目のLMSで受け取りたい情報とは、例えば以下のようなものです。
- LMS上での表示名
- 説明文
- 後で起動するためのURL
- 必要なら採点対象としての設定
Deep Linkingを使うとツールはこれらの情報をまとめてLMSに返せます。
その結果、教員はツール内でコンテンツを選ぶだけでよくなり、LMS側ではその内容に応じて適切な項目を自動で作ることができます。
つまり、Deep Linkingは単にURLを貼る代わりのものではなく、LMSに登録するための情報を標準的な形で渡す仕組みです。
Deep Linkingの流れを知ろう
Deep Linking全体の流れは次の4ステップで考えると整理しやすいです。
- LMSがツールを起動する
- ツールがコンテンツ選択UIを表示する
- 利用者がコンテンツを選ぶ
- ツールが選択結果を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の中身です。上から順番に説明していきます。
-
deep_link_return_url
選択が終わったあとに、どこへ結果を返せばよいかを表します。 -
accept_types
LMSがどの種類のコンテンツを受け取れるかを表します。
例えば、ltiResourceLinkのみ受け取れる場合、ツールはその形式で返す必要があります。 -
accept_multiple
一度に複数のコンテンツを返してよいかどうかを表します。 -
accept_lineitem
採点対象としての情報を含めてもよいかどうかの目安です。 -
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に追加してほしいコンテンツの情報が入ります。
この中身を上から順番に説明していきます。
-
type
なにを追加するかの種類です。
ここではltiResourceLinkと書いてあるので、LTIで起動されるリンク項目を作ってほしいという意味になります。 -
title
LMS上で表示される名前です。 -
text
説明文です。
LMSによって表示される場所は異なりますが、この項目がなにかを補足するためのテキストです。 -
url
その項目が後で起動されるときのURLです。
その場で表示するためのURLではなく、LMSに登録された項目を後から開いたときの起動先です。
省略された場合はツールのベースLTI URLが使われます。 -
lineItem
採点対象として扱うための情報です。
例えば、scoreMaximum: 100と書いてあれば満点が100点の課題としてLMSに登録できます。
ここまで見ると分かる通り、Deep Linkingで返しているのは単なるリンクではありません。
LMSにどういう項目を作ってほしいか、その設定情報をまとめて返しているわけです。
ここまでの情報をまとめると、要するにDeepLinkingResponseは
LMSにどういう項目を作ってほしいかの設定情報
を返しているものと言えます。
補足 - ツールはどうやってResponseを返すの?
先ほど書いたコードはあくまでもDeepLinkingResponseの中身です。
JSONをそのまま返すわけではなく、実際にはJWTにしてLMSのdeep_link_return_urlにPOSTします。
次のようなイメージです。
<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は
- LMSがここに返してと言う
- ツールがその返却先に値を返す
という往復の流れになっています。
通常のLTI起動となにが違うの?
さて、Deep Linkingと通常のLTI起動はなにが違うのでしょうか?
一言で言うと、以下の通りです。
-
通常のLTI起動
すでにLMSに登録されている項目を利用するために起動する -
Deep Linking
これからLMSに登録する項目を選ぶために起動する
起動したときの流れで比べてみると以下のようになります。
-
通常のLTI 起動
LMS → ツール → コンテンツを表示 -
Deep Linking
LMS → ツール → コンテンツを選ぶ → LMS に結果を返す
通常の起動は「使う」ためのもの、Deep Linkingは「登録するものを選ぶ」ためのものと考えると分かりやすいです。
まとめ
Deep Linkingは次の3点を押さえておきましょう。
-
DeepLinkingRequest = LMSからツールへの注文書
どのコース向けか、どこに返すか、なにを返してよいかが入っています。 -
DeepLinkingResponse = ツールからLMSへの登録指示書
ツールは選ばれたコンテンツをLMSにどう登録してほしいかを返します。 -
Deep Linkingが返しているもの = LMSに登録するための情報一式
title、url、必要ならlineItemまで含めて返します。
Deep Linkingは最初は少しわかりづらいですが、
- LMSが選択用にツールを起動する
- ツールが選択結果を返す
- LMSがその結果をコースに登録する
という流れで捉えるとわかりやすいと思います。
参考資料
- 1EdTech Deep Linking Specification | 1EdTech Standards
- 1EdTech LTI Core | 1EdTech Standards
- 1EdTech Assignment and Grade Services | 1EdTech Standards