はじめに
LTI(Learning Tools Interoperability)は、LTIプロトコルを利用して、LMS(Learning Management System)と各種ツールを相互連携させる仕組みです。
これにより、各種ツールごとにユーザーや授業を管理する必要がなくなり、LMSだけで全体を一元管理できます。
当社の製品であるalpha Vclass Cloud では、LMSとの連携が可能であり、教員や学生の個別の登録や授業の登録が不要になり、事前準備の手間を大幅に軽減できます。
本記事では、NestJSを使用してLTI Advantageを活用したLTI連携の実装手順を紹介しています。NestJSについてはこちらの記事を併せてご参照ください。
alpha Vclass Cloud とは
alpha Vclass Cloud(アルファ ブイクラス クラウド)は、マルチOS・マルチデバイス・マルチロケーションに対応したクラウド型授業支援サービスです。
学生端末のデスクトップ画面を教員端末のデスクトップ画面に表示し、オンライン授業を実施できます。
詳しくはこちら ⧉をご参照ください。
LTI連携によるメリット
今日では、さまざまな授業支援システムやツールがあります。
LTI連携を利用せず、各システムやツールが独立している場合、管理者はそれぞれにユーザー情報や授業情報を登録する必要があります。
また、学生や教員はそれぞれ個別にログインを行う必要があります。
LTI連携を利用すると、管理者はユーザー登録の手間が省け、学生や教員はLMSにログインするだけで、利用可能なシステムをすぐに使えるようになります。
LTI連携の処理の流れ
LTI連携での処理の流れについて説明します。
- 利用者がLTI対応のプラットフォーム(LMS)にアクセスすると、認証リクエストが開始されます。
- LMSはLTI 1.3のLaunch Requestを生成し、ツール(リソース提供者)に送信します。
- ツールは、LMSからのリクエストを受け取り、バリデーションを行います。
- Launch Requestがバリデーションをパスすると、ツールはLMSに対してアクセストークンを発行します。
- LMSは、アクセストークンを使用してツールのAPIエンドポイントなどへリクエストを送信します。
- ツールはリクエストを処理し、結果をLMSに返します。
- LMSは結果を利用者に表示したり、適切な処理を実行したりします。
ツールの作成
ここからは実際に小テストを提供するツールを作成しながら実装を見ていきます。
今回作成するツールの仕様とその実現方法は以下の通りです。
実施する小テストの種類を選択できる
管理者が、受講者の実施する小テストの種類を選択することができます。
この仕様を実現するために、Deep Linkingを利用します。
Deep Linkingは、ツールからLMSに対して特定のリソースを選択・リンクするためのプロトコルです。
これにより、ユーザーは外部ツールから特定のコンテンツ(例えばクイズ・課題・ビデオ・ドキュメントなど)をLMSのコースにシームレスに埋め込むことができます。
小テストを受講しているユーザーを一覧で表示できる
学生は、小テストを受講している他のユーザーを一覧で確認することができます。
この仕様を実現するために、NRPS(Names and Role Provisioning Services)を利用します。
NRPSは、ツールがLMSからコース参加者の名前と役割情報を取得するためのサービスです。
NRPSを使用することで、外部ツールはLMS内のユーザーデータにアクセスできます。
プロジェクト作成
まず初めに@nestjs/cliをインストールします。こちらをインストールすることで、NestJSのコマンドが入力できるようになります。
次に、プロジェクトを作成します。今回はプロジェクト名をlti-sampleにします。
初期設定
今回はMVC(Model-View-Controller)のパターンで実装します。
ビューエンジンはhbs(Handlebars)
を利用します。
まず、必要なライブラリをインストールします。
次に、ビューエンジンの設定をおこないます。main.ts
を以下のように修正します。
./src/main.ts
次に、process.env.{変数名}
で、.envに記載した環境変数を参照できるようにするため、app.module.ts
を以下のように修正します。
./src/app.module.ts
Controllerの実装
LTI連携に必要なAPIを実装します。
まず、LTI連携用のモジュールを作成します。
次に、lti.controller.ts
を修正してAPIを定義します。
- 公開鍵セットを返却するAPI
- OpenID Connectを受け付けるAPI
- IDトークンを受け取り、実施する小テストの種類を選択するページ、または小テストを表示するAPI
- 選択した小テストの種類を保存するAPI
./src/lti/lti.controller.ts
次に、APIで利用するリクエストボディの型を定義します。
.src/lti/dto/lti.dto.ts
次に、表示する小テストのビューを実装します。
lti-sampleフォルダ直下にviews
フォルダを作成します。
作成したviews
フォルダ配下に、lti.hbs
ファイルを作成します。
./views/lti.hbs
Guardの実装
OpenID Connectで利用するIDトークンを検証するGuardを実装します。
次のコマンドを実行してソースファイルを作成します。
次に、lti.guard.ts
を以下のように修正します。
lti.guard.ts
次に、以下コマンドを実行してストラテジーファイルを作成します。
作成したlti.strategy.ts
を以下のように修正します。
.src/lti/lti.strategy.ts
次に、作成したストラテジーでLtiServiceクラスを呼び出せるようにlti.module.ts
を修正します。
.src/lti/lti.module.ts
次に、作成したストラテジーを利用するようにapp.module.ts
を修正します。
.src/app.module.ts
Serviceの実装
Controllerで呼び出しているServiceのメソッドを実装します。
バリデーションなどのエラー処理は省略しています。
.src/lti/dto/lti.service.ts
次に、JwtServiceの設定をおこないます。lti.module.ts
を以下のように修正します。
JWT作成時に利用する秘密鍵・暗号化アルゴリズム・keyidを設定します。
.src/lti/dto/lti.module.ts
LTI連携に必要な情報の取得と.envファイルの作成
今回作成したAPIサーバを、連携するLMSにLTIツールとして登録します。
LMSの例にはMoodleを使用して紹介します。
LTIツールとして登録
- Moodleに管理者としてログインし、「サイト管理」 > 「プラグイン」 > 「活動モジュール」 > 「外部ツール」に移動します。
- 「ツールを管理する」内にある「ツールを手動設定」のリンクをクリックします。
- ツール設定画面が表示されますので、以下のように設定してください。
- ツール名:サンプルLTIツール
- ツールURL:LTI連携を有効にするで表示された「ツールURL」
- LTIバージョン:LTI 1.3
- 公開鍵タイプ:192.168.1.1:3000/lti/jwks
- 公開鍵セット:「LTI連携を有効にする」で表示された「公開鍵セットURL」
- ログイン開始URL:「LTI連携を有効にする」で表示された「ログイン開始URL」
- リダイレクトURL:「LTI連携を有効にする」で表示された「リダイレクトURI」
- ツール設定使用:活動チューザまたは事前設定ツールに表示する
- デフォルト起動コンテナ:新しいウィンドウ
- ディープリンクをサポートする:チェックを入れる
- 「サービス」>「IMS LTI氏名およびロールプロビジョニング」:このサービスをプライバシー設定を基にメンバシップ情報を検索するため使用します
- 「プライバシー」>「ランチャ名をツールと共有する」:常に
- 「変更を保存する」をクリックします。
※注: 自己証明書を利用した場合、公開鍵セットURLの指定では正しく動作しないことがあります。その場合は公開鍵タイプ
をRSAキー
に設定し、公開鍵
を設定してください。
LTI連携に必要な情報の取得
LTI連携に必要な情報をLMSから取得します。
- Moodleに管理者としてにログインし、「サイト管理」 > 「プラグイン」 > 「活動モジュール」 > 「外部ツール」に移動します。
- 「ツールを管理する」に登録されている「alpha Vclass Cloud」を表示します。
- ハンバーガーメニューをクリックします。
.envファイルの作成
- 以下コマンドを実行して.envファイルを作成します。
- 前項で取得した情報を入力します。(例としてMoodleサーバのIPアドレスが
192.168.1.100
とします)
.env
次に、Deep Linkingで利用するJWTの作成に必要な秘密鍵と公開鍵を生成します。
OpenSSLを使用して自己証明書とプライベートキーファイルを生成します。以下のコマンドを使用します。
上記のコマンドを実行すると、いくつかのプロンプトが表示されますので、必要な情報を入力してください。
次に、生成した秘密鍵から公開鍵を生成します。
OpenSSLを使用して、プライベートキーファイルから公開鍵(.pem形式)を生成します。
作成したkey.pem・public-key.pemの中身を.envファイルに記載します。以下は例です。
.env
以上で、LTI連携の実装と準備は完了です。
LTIツールの登録と利用
LMSのコースにLTIツールを登録します。
- Moodleに管理者としてログインします。
- 「マイコース」タブに表示されるコース一覧から、開始する授業を選択します。
- 「編集モード」をONにします。
- 「活動またはリソースを追加する」をクリックします。
- 外部LTIツール一覧に表示されている「サンプルLTIツール」をクリックします。
- 「コンテンツを選択する」をクリックすると、小テストの種類を選択する画面が表示されます。
- 実施する小テストの種類を選択します。今回は例として小テスト3を選択します。
- 決定ボタンをクリックします。
- コンテンツ選択画面が閉じたあと、「コンテンツ」の右側に"選択済みコンテンツ"のチェックが入り、活動名に「小テスト」が表示されます。
- 「保存してコースに戻る」をクリックし、設定を保存します。
LTIツールの起動
登録したLTIツールを起動します。
- Moodleに学生としてログインします。
- LTIツールを登録したコースをクリックします。
- LTIツール(サンプルLTIツール)をクリックします。
- 選択した種類の小テストが表示されます。また、小テストを受けている人、このコースを受けているメンバ一覧が表示されます。
ユーザーは、ツールに直接アクセスすることなく、LMSから小テストを表示することができました。
また、ツールは、LTIを通してLMSからユーザー情報を取得し、表示することができました。
おわりに
今回は、NestJSを使用してLTI連携の実装フローを紹介しました。
LTI連携はLMSを利用するユーザーにとって手間を削減できる重要な仕組みとなっていますので、みなさんもぜひ試してみてください。