#author("2024-12-12T11:01:58+00:00","default:iseki","iseki") #author("2025-02-04T10:53:47+00:00","default:iseki","iseki") * LTI (Learning Tools Interoperability) [#y2ccd68a] - IMS グローバル ラーニング コンソーシアムが開発している ELシステム間の接続規格 ** jupyterhub-ltiauthenticator (Moodle - JupyterHub) [#o7520050] - https://pypi.org/project/jupyterhub-ltiauthenticator/ - 各種LMS - [[JupyterHub]] 接続 - LMS([[Moodle]]) が TC(Tool Consumer),JupyterHub が TP(Tool Provider) としてうごく. - see also. [[Moodle+JupyterHub]] **** v1.6.2 (2024/12/10 最新) - https://pypi.org/project/jupyterhub-ltiauthenticator/1.6.2/ **** v1.5.0 [#r1618b3a] - https://pypi.org/project/jupyterhub-ltiauthenticator/1.5.0/ **** v1.3.0 [#x60f34bd] - pip install jupyterhub-ltiauthenticator==1.3.0 - https://pypi.org/project/jupyterhub-ltiauthenticator/1.3.0/ **** v1.2.0 [#f62333d7] - Moodle については Patch 不要 (jupyterhub)# pip install jupyterhub-ltiauthenticator==1.2.0 - jupyterhub_config.py [#yc7afb52] # for LTI v1.2.0 c.JupyterHub.authenticator_class = 'ltiauthenticator.LTIAuthenticator' c.LTI11Authenticator.consumers = { "b18e82ec683724743236fade71350720029a29144a585c66f6741d8e9c6e0d83" : "c0fe2924dbb0f4701d898d36aaf9fd89c7a3ed3a7db6f0003d0e825a7eccb41c" } c.LTI11Authenticator.username_key = 'ext_user_username' *** Moodle 側 [#sd9e4f7f] - 管理者‘IDで,「サイト管理」=> 「プラグイン」=> 「外部ツール:ツールを管理する」(=>「ツールを手動設定する」) -- デフォルト起動コンテナは「新しいウィンドウ」にする. - url -- 例: https://castor5.nsl.tuis.ac.jp/hub/lti/launch - 埋め込み表示に設定した場合,chrome, edge では cookieが送信されないので,ログインできない(Firefox は可能 2021 9/3) -- SameSite=Lax であるため,iframe 使用時は Moodleのホストと JupyterHub のホストが異なる場合は cookie が送信されない. -- JupyterHub のソースコードを散々引っ掻き回して,ようやく理解した. - [[Hack>Moodle/Moodle-LTI]] *** etc [#fd7583af] - error : module 'oauthlib.oauth1.rfc5849.signature' has no attribute 'signature_base_string' [#l6c7a130] - ライブラリが足りない -- conda install oauthlib **** 欠点:利点? [#w4038708] - %%一度 Moodle 経由でログインすると,ブラウザがアカウントを覚えているらしく,次回からは Moodle 経由で無くともログイン可能.%% ログアウトすればOK - その他の一般ユーザ認証と併用できない. ** OLD: v1.0.0 [#a6e2e114] *** Learning Tools Interoperability [#lde959fa] - https://github.com/jupyterhub/ltiauthenticator - 既にインストールされている ltiauthenticator だと Moodle にログインできない. -- "Moodleと Jupyter Notebookの 連携 によるプログラミング 教育環境 の 構築" 石坂徹,桑田喜隆, et. al., Moodle Moot Japan 2019 Proceedings (2019), pp.32-37 --- /usr/local/anaconda/envs/jupyterhub/lib/python3.8/site-packages/ltiauthenticator/__init__.py 152 # Before we return lti_user_id, check to see if a canvas_custom_user_id was sent. 153 # If so, this indicates two things: 154 # 1. The request was sent from Canvas, not edX 155 # 2. The request was sent from a Canvas course not running in anonymous mode 156 # If this is the case we want to use the canvas ID to allow grade returns through the Canvas API 157 # If Canvas is running in anonymous mode, we\'ll still want the \'user_id\' (which is the `lti_user_id``) 158 159 canvas_id = handler.get_body_argument('custom_canvas_user_id', default=None) 160 + product_code = handler.get_body_argument('tool_consumer_info_product_family_code', default=None) 161 162 if canvas_id is not None: 163 user_id = handler.get_body_argument('custom_canvas_user_id') 164 + elif 'moodle' in product_code: 165 + user_id = handler.get_body_argument('ext_user_username') 166 else: 167 user_id = handler.get_body_argument('user_id') 168 *** jupyterhub_config.py [#c6db4f7a] c.JupyterHub.authenticator_class = 'ltiauthenticator.LTIAuthenticator' c.LTIAuthenticator.consumers = { "b18e82ec683724743236fade71350720029a29144a585c66f6741d8e9c6e0d83" : "c0fe2924dbb0f4701d898d36aaf9fd89c7a3ed3a7db6f0003d0e825a7eccb41c" } - キーは二つとも openssl rand -hex 32 で生成. -- openssl rand -hex 32