LTI基礎編  ②利用の流れ（連携初期設定～ツール呼び出しまで）

# はじめに
LTIとはLearning Tools Interoperability（学習ツールの相互運用性）の略称であり、LMS（学習管理システム）を始めとする学習用プラットフォームと教材・学習ツールを連携させるための国際技術標準です。
教育関連のシステムやアプリケーションの利用者、導入者、開発・提供者それぞれにとってLTIを活用することには様々なメリットがあります。
今回はLTIの概要・詳細について、次の4つの記事を作成しました。
**LTI基礎編**
記事①[LTIの基本](https://qiita.com/Hiroki_Kobari/items/2419299342367a9f2535)
記事②LTI利用の流れ（連携初期設定～ツール呼び出しまで) ⇒ 本記事
記事③[押さえておきたいキーワード](https://qiita.com/Hiroki_Kobari/items/75e216b7be6b6cadb430)
**LTI詳細編**
記事④[LTI Coreの通信フロー](https://qiita.com/Hiroki_Kobari/items/c9054769efad0f6b2822)

本記事は2つ目のLTI概要編②LTI利用の流れ（連携初期設定～ツール呼び出しまで）になります。
ここでは、LTIを利用するために必要となる連携初期設定からツールを呼び出すまでの一連の流れについて説明します。

※本記事では、次の用語は以下の内容を指しています。
- LTI ⇒ LTI 1.3
- プラットフォーム ⇒ LMS
※一般的には、LMSがプラットフォームになることが多いですが、必ずしもLMSである必要はありません。
- ツール ⇒ 教材や学習コンテンツなどの学習ツール
- マイクロコンテンツ ⇒ 教材や学習コンテンツの特定の単元・コースのようなツール内の特定のコンテンツ
- OIDC ⇒ OpenID Connectの略称

# 1. 利用の流れ
プラットフォームとツール間でLTI連携されたツールを使用するための大まかな流れは、次のようになっています。それぞれの項目について、「具体的にどのような設定が必要か」、「誰がその設定を行うのか」など、運用の観点についても説明していきます。

**1. 初期設定**
LTI連携に必要となる接続情報をプラットフォームとツール間で相互に交換した後、相手側の情報を登録します。
作業者：システム管理者
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/cecf6ffc-669f-47f4-7718-eb7f4eb263bb.png)

**2. LTIリンクの設置**
プラットフォーム上にツールを起動するためのリンクを設置します。
作業者：指導者（教育委員会、教員など）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/ed5198d5-949e-f6d3-d0c3-a7c142c5a23e.png)

**3. ツールの呼び出し**
設置したLTIリンクからツールを起動します。
作業者：学習者
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/7a89142b-f5ab-a4c5-2616-6bb67025a5fa.png)


# 2. 初期設定
LTI連携に必要となる接続情報をプラットフォームとツール間で相互に交換した後、相手側の情報を登録します。

## 2.1. 初期設定の単位
プラットフォームとツールがそれぞれ複数の顧客に対して分離された環境を提供するために、どのような方式を用いているか（平たく言えば、シングルテナントなのか、それとも近年のSaaSで一般的になりつつあるマルチテナント方式なのか）によって、初期設定の単位や頻度が変わります。一般的には、次のような組み合わせがあります。

**パターンA（プラットフォーム、ツールともにマルチテナント）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/bf17f1d0-88d7-0366-e633-ee2e524c7a68.png)

**パターンB（プラットフォームはマルチテナント、ツールはシングルテナント）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/aadc6bbb-fbea-17ea-03fa-b3c521c34eb3.png)

**パターンC（プラットフォーム、ツールともにシングルテナント）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/38ae5572-1e7c-0050-e1a3-54525653e5fa.png)

パターンAの場合、ツールを区別するための使用するClient IDをツールAとツールBそれぞれに対して1つずつ払い出します。
対してパターンBの場合は、ツール内のテナント1とテナント2は同じツールですが、環境的にはそれぞれ独立しているため、テナントごとにClient IDを払い出す必要があります。そのため、パターンAより初期設定を行う回数が多くなります。
さらにパターンCにおいては、プラットフォームもシングルテナントであり、プラットフォーム内の各テナントは独立した環境になっているため、3パターンの中で最も初期設定を行う回数が多くなります。
また、Deployment IDについて、今回作成したイメージ図内ではテナントに対して紐づける形になっていますが、プラットフォームやツールの仕様によってDeployment IDを払い出す単位は異なります。例として、K-12では教育委員会ごとに作成したテナントの中に複数の学校があり、それぞれの学校ごとにDeployment IDを払い出すといったケースがあります。
 
上の図は、各パターンの初期設定の単位・頻度を表すイメージ図です。設定の頻度としては、パターンA→B→Cの順に増えていきます。パターンBやパターンCのようにシングルテナントの場合は、環境が独立しているため、各テナントに対して設定を行う必要があります。そのため、パターンAに比べて初期設定の頻度が多くなります。

## 2.2. プラットフォームの情報とツールの情報を相互に登録する
初期設定では、プラットフォームとツールの接続情報を交換し、お互いに登録する必要があります。交換する接続情報には次のようなものがあります。

### ツール側に登録するプラットフォームの情報
|パラメーター|必須/任意　|概要  |
|---|---|---|
|Issuer ID  |必須|トークンの発行者を識別するための値|
|Client ID  |必須|プラットフォームがツールを識別するために使用する一意の値|
|Deployment ID  |必須<br>[*注1]|ツールがプラットフォームにどのようにデプロイされているかを識別するために使用する一意の値|
|Platform JWKS URL|必須|Platformの公開鍵を含むJWKSを参照するためのURL|
|Platform OIDC Auth URL|必須|ツールからプラットフォームに対して認証リクエストを行う際に使用するURL|
|OAuth2 Access Token URL|任意<br>[*注2]|ツールがプラットフォームからアクセストークンを取得するために使用するURL|

>*注1：初期設定で登録する場合と後から登録する場合があります。
*注2：AGS（Assignment and Grade Services）やNRPS（Names and Role Provisioning Services）を使う場合は設定が必要になります。

### プラットフォーム側に登録するツールの情報
|パラメーター  |必須/任意　|概要  |
|---|---|---|
|Tool OIDC Login Initiation URL  |必須|プラットフォームからツールを起動するための認証プロセスを開始する際に使用するURL|
|Tool Launch URL  |必須|ツールの起動リクエストを送信するために使用するURL|
|Tool JWT Key Set URL|任意<br>[*注3]|JWTの検証に使用する公開鍵の情報を提供するためのURL|

>*注3：Deep Linkingを使う場合は設定が必要になります。

### 作業者と運用フロー
プラットフォームやツールがSaaSであればそれぞれの事業者、OSSを使って自前で構築・運用をしている場合はその管理者の間で情報のやり取りを行い、登録作業を行うことになります。作業の順番としては、Client IDやDeployment IDはプラットフォーム側で発行するため、本記事の記載順で登録作業を行うケースが多いかと思います。（作業者や作業の順番については、プラットフォームやツールの仕様、事業者間での取り決め等によって異なる場合があります。）

# 3. LTIリンクの設置
初期設定が完了したら、次はツールを呼び出すためのLTIリンクをプラットフォーム上に設置する作業を行います。各LTIリンクは、初期設定で指定した"Client ID"によってリンク先のツールを識別します。LTIリンクを設置する際、マイクロコンテンツ連携なしの場合は1つのツールに対して1つのLTIリンクを設置するだけですが、マイクロコンテンツ連携ありの場合は1つのツールに対して複数のLTIリンクを登録することになります。前者のパターンでは、あるツールのトップページへのリンクをプラットフォーム上で学校ごとに設置するといったケースも一般的です。
ツールによって提供されるリソースやコンテンツへのリンクは"Resource Link（リソースリンク）"と呼ばれ、プラットフォームは各リソースリンクに割り振られた"resource_link_id（リソースリンクID）"という一意の値を使って複数のリンクを区別します。例えば、同じテストへのリンクが2つ設置されている場合、どちらのリンクからテストを受けても問題は同じですが、2つのリンクのリソースリンクIDは異なるため、どちらのリンクからテストを受けたかを判別することができます。

### 作業者と運用フロー
教育委員会や教員の方々のような指導者にあたる方がプラットフォームにログインし、その中でLTIリンク設置の作業を行うケースが一般的です。

# 4. ツールの呼び出し
学習者が3章で設置したLTIリンクを使って、プラットフォームからツール上のコンテンツを呼び出し、学習活動を行います。この際、ツールへのログインはSSOにより自動で行われ、学習者の名前・所属情報・ロールなどの情報も連携されます。

下図は、LTIリンクにアクセスしてからツールが起動するまでのフローを簡易的に表したものになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725519/0de13377-fac3-b8f6-7f58-31c453687288.png)

**①Tool OIDC Login Initiation URL**
プラットフォームからツールを起動する際、最初にアクセスするURLであり、認証を開始するためのURLです。

**②Platform OIDC Auth URL**
ツールからプラットフォームに対する認証リクエストを行う際に使用されるURLです。

**③Tool Launch URL（Target Link URI）**
認証が完了した後、ツールの起動リクエストを送信するために使用されるURLです。最終的にユーザに表示されるコンテンツや画面は、このリクエストで送られるIDトークン中の"target_link_uri"によって指定されます。
また、IDトークンにはプラットフォームの秘密鍵で署名がされており、これによってトークンの改ざんを防止することができます。IDトークンを受け取ったツール側では、それが正当なものであることを証明するために、初期設定で指定したPlatform JWKS URLからプラットフォームの公開鍵を取得し、IDトークンの検証を行います。正しいIDトークンであることが証明されると、target_link_uriで指定されたコンテンツや画面が開かれ、ツールの呼び出しが完了します。

LTIでは、③で説明したIDトークンの検証のように、OIDCや1EdTech Security Frameworkに基づいた各種検証を行うことによってセキュアな通信を実現しており、それによって学習者の情報などをプラットフォーム・ツール間で安全に連携することができます。

### 作業者と運用フロー
学習者がプラットフォームにログインし、設置されたLTIリンクからツールを起動して使用するケースが一般的です。

# 参考資料
+ [Learning Tools Interoperability (LTI)® Core Specification](https://www.imsglobal.org/spec/lti/v1p3/)
+ [Learning Tools Interoperability (LTI) Assignment and Grade Services Specification](https://www.imsglobal.org/spec/lti-ags/v2p0/)
+ [Learning Tools Interoperability (LTI)® Deep Linking Specification](https://www.imsglobal.org/spec/lti-dl/v2p0/)
+ [Learning Tools Interoperability (LTI)® Names and Role Provisioning Services](https://www.imsglobal.org/spec/lti-nrps/v2p0)
+ [1EdTech Security Framework](https://www.imsglobal.org/spec/security/v1p1)
+ [OpenID Connect Core 1.0 incorporating errata set 1](https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html)
+ [学習基盤を拡張する国際技術標準 IMS LTI 1.3 第1回～第3回](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_snippet&all=&title=%E5%AD%A6%E7%BF%92%E5%9F%BA%E7%9B%A4%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%E5%9B%BD%E9%9A%9B%E6%8A%80%E8%A1%93%E6%A8%99%E6%BA%96%20ims%20lti%201.3&count=20&order=7&pn=1&page_id=13&block_id=8)