Hi,
I've been trying to set up LTI 1.3 with Moodle for Webwork 2.19 on RHEL, proxied via httpd. It has been set up, I believe correctly, only Moodle, and I believe I have set things up correctly on Webwork. When I first click on Select Content, I get The "No Webwork course associated to the LMS course" alert, but no extra information. I understand that this means the JWT is not being decoded.
Any help in getting LTI 1.3 working would be greatly appreciated.
Thanks!
The output I get in debug.log is
===> Begin WeBWorK::dispatch() <===
[Tue Jul 29 15:51:55.379643 2025] (eval): Hi, I'm the new dispatcher!
[Tue Jul 29 15:51:55.379985 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.380081 2025] (eval): Okay, I got some basic information:
[Tue Jul 29 15:51:55.380278 2025] (eval): The site location is /webwork2
[Tue Jul 29 15:51:55.380348 2025] (eval): The request method is POST
[Tue Jul 29 15:51:55.380726 2025] (eval): The URI is /webwork2/ltiadvantage/login
[Tue Jul 29 15:51:55.380830 2025] (eval): The argument string is iss=https%3A%2F%2Fsandbox.kpu.ca&target_link_uri=https%3A%2F%2Fwebwork2.kpu.ca%2Fwebwo>
[Tue Jul 29 15:51:55.381029 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.381162 2025] (eval): The path is /ltiadvantage/login/
[Tue Jul 29 15:51:55.381397 2025] (eval): The current route is ltiadvantage_login
[Tue Jul 29 15:51:55.381471 2025] (eval): Here is some information about this route:
[Tue Jul 29 15:51:55.381664 2025] (eval): The display module for this route is WeBWorK::ContentGenerator::LTIAdvantage
[Tue Jul 29 15:51:55.381730 2025] (eval): This route has the following captures:
[Tue Jul 29 15:51:55.381910 2025] (eval): action => login
[Tue Jul 29 15:51:55.381991 2025] (eval): controller => LTIAdvantage
[Tue Jul 29 15:51:55.382162 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.382223 2025] (eval): Now we want to look at the parameters we got.
[Tue Jul 29 15:51:55.382379 2025] (eval): The raw params:
[Tue Jul 29 15:51:55.382545 2025] (eval): lti_message_hint => "{"launchid":"ltilaunch_ContentItemSelectionRequest919966836"}"
[Tue Jul 29 15:51:55.382775 2025] (eval): target_link_uri => "https://webwork2.kpu.ca/webwork2/ltiadvantage/content_selection"
[Tue Jul 29 15:51:55.382849 2025] (eval): lti_deployment_id => "10"
[Tue Jul 29 15:51:55.383017 2025] (eval): iss => "https://sandbox.kpu.ca"
[Tue Jul 29 15:51:55.383083 2025] (eval): login_hint => "2780"
[Tue Jul 29 15:51:55.383248 2025] (eval): client_id => "0Zkywptk292RPvD"
[Tue Jul 29 15:51:55.383309 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.410488 2025] (eval): We need to get a course environment (with or without a courseID!)
[Tue Jul 29 15:51:55.415488 2025] (eval): Here's the course environment: WeBWorK::CourseEnvironment=HASH(0x561a6c0f1728)
[Tue Jul 29 15:51:55.452010 2025] (eval): Using authentication module WeBWorK::Authen::LTIAdvantage: WeBWorK::Authen::LTIAdvantage=HASH(0x561a6c08a580)
[Tue Jul 29 15:51:55.452151 2025] (eval): We got a courseID from the route, now we can do some stuff:
[Tue Jul 29 15:51:55.452224 2025] (eval): ...we can create a database object...
[Tue Jul 29 15:51:55.481482 2025] (eval): (here's the DB handle: WeBWorK::DB=HASH(0x561a6c1e9860))
[Tue Jul 29 15:51:55.481773 2025] WeBWorK::Authen::LTIAdvantage::verify: The LTI Advantage login route was accessed with the appropriate parameters.
[Tue Jul 29 15:51:55.694901 2025] (eval):
===> Begin WeBWorK::dispatch() <===
[Tue Jul 29 15:51:55.695291 2025] (eval): Hi, I'm the new dispatcher!
[Tue Jul 29 15:51:55.695549 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.695769 2025] (eval): Okay, I got some basic information:
[Tue Jul 29 15:51:55.695939 2025] (eval): The site location is /webwork2
[Tue Jul 29 15:51:55.696097 2025] (eval): The request method is POST
[Tue Jul 29 15:51:55.696458 2025] (eval): The URI is /webwork2/ltiadvantage/launch
[Tue Jul 29 15:51:55.696778 2025] (eval): The argument string is id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6ImNiMmE0OTU1ODUxM2I0ZWMwNWRhIn0.e>
[Tue Jul 29 15:51:55.697115 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.697419 2025] (eval): The path is /ltiadvantage/launch/
[Tue Jul 29 15:51:55.697762 2025] (eval): The current route is ltiadvantage_launch
[Tue Jul 29 15:51:55.697940 2025] (eval): Here is some information about this route:
[Tue Jul 29 15:51:55.698130 2025] (eval): The display module for this route is WeBWorK::ContentGenerator::LTIAdvantage
[Tue Jul 29 15:51:55.698178 2025] (eval): This route has the following captures:
[Tue Jul 29 15:51:55.698225 2025] (eval): action => launch
[Tue Jul 29 15:51:55.698269 2025] (eval): controller => LTIAdvantage
[Tue Jul 29 15:51:55.698316 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.698360 2025] (eval): Now we want to look at the parameters we got.
[Tue Jul 29 15:51:55.698404 2025] (eval): The raw params:
[Tue Jul 29 15:51:55.698508 2025] (eval): id_token => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6ImNiMmE0OTU1ODUxM2I0ZWMwNWRhIn0.eyJub25jZSI6Ij>
[Tue Jul 29 15:51:55.698602 2025] (eval): state => "ab246cc3e221e1346b3a6b742cb9f203f084947f3f82cd7bebccccad88dd4993"
[Tue Jul 29 15:51:55.698659 2025] (eval): --------------------------------------------------------------------------------
[Tue Jul 29 15:51:55.990545 2025] (eval): We need to get a course environment (with or without a courseID!)
[Tue Jul 29 15:51:55.995745 2025] (eval): Here's the course environment: WeBWorK::CourseEnvironment=HASH(0x561a6c45eff0)
[Tue Jul 29 15:51:55.996156 2025] (eval): Using authentication module WeBWorK::Authen::LTIAdvantage: WeBWorK::Authen::LTIAdvantage=HASH(0x561a6c57a788)