Guide: SALTIRE 1.3 integration
saLTIre is a free, open-source LTI test tool that can act as either an LTI Tool or Platform to help us validate LTI 1.3 launches and Advantage services.
1. Test integration via LTI 1.3
Visit https://saltire.lti.app/ .
Select
Test Tooloption.Go to “Options” > “Sign in”. Sign in with google.
You’ll see a form on the “Security model” page.
Select “Signature method” as “LTI 1.3 > RS256”.
In “Tool details” section, check the box in “Public Keyset URL”. Leave the rest of tool details as is.
For “Platform details” section, create an
LTI Consumerxblock in Open edX, select “LTI version” as 1.3 and click “Save”. After saving, it’ll show a bunch of information.Copy paste information from xblock to “Platform details” section in saLTIre, as seen in the image below. Leave “Authorization server ID”, “Public Key” and “Public Key ID” blank.
Click “Save”. A pop will appear showing list of registered platforms.
Turn ON the “Public?” toggle. This step is required for integration to work.
Rename the platform you just saved if needed and close the pop up. Your platform configurations are now saved in saLTIre.
Click “Save” on top right of the page to save platform and tool configurations.
Now edit the Xblock again and copy paste the information from the “Tool details” section above, into the Xblock parameters, as shown in the table below (click to expand). Click “Save”.
Publish the Xblock.
View the Xblock from LMS with any Open edX role. The tool should load as seen in the image below.
2. Test Advantage services
Open edX supports 3 advantage services:
Deep Linking
Assignment and Grade Services (AGS)
Names and Roles Provisioning Service (NPRS)
2.1 Test Deep Linking (without AGS & NPRS)
Edit xblock. Set “Deep linking” to True and add URL for “Deep Linking Launch URL” from saltire. Click “Save”.
Publish the unit.
Click “Deep Linking Launch - Configure tool” hyperlink at the end of published xblock.
It should open saltire in new window. Message “Type” should be
LtiDeepLinkingRequest.Click on “Sample Content” in the header. Check ONLY the first option, scroll to the bottom and click “Return selection”.
You should see a message saying “The LTI Deep Linking content was successfully saved in the LMS.”
Reload the unit page in Studio. The xblock should say “Deep Linking is configured on this tool.”
Now launch the unit in LMS using any role. The tool should load with message type
LtiResourceLinkRequestand verificationPassed.assed
2.2 Assignment & Grade Service (AGS)
Configure the xblock so that it advertises AGS endpoints at launch.
In Open edX Studio, edit the xblock. Set “LTI Assignment and Grades Service” to
Allow tools to manage and submit grade (programmatic).Save and publish the unit.
Fetch the Oauth2 token using these steps, if not already fetched.
Launch the unit in LMS using any role.
From header, select “Services” > “Assignment And Grade Services”.
You’ll see 3 services in AGS. We’ll go through each of these below.
2.2.1 Line Item Service
This service will allows us to test if Open edX platform:
Advertises AGS endpoints/scopes correctly in the launch JWT.
Authorizes line item operations based on scopes (especially
scope/lineitem).Correctly implement CRUD for gradebook columns (create/list/read/update/delete).
Correctly handle metadata like
resourceId,resourceLinkId,tag,scoreMaximum.
Here are the steps that i took to use this service:
Open “Line item service”.
Add any values for
Label,Possible points,TagandResource ID. LeaveResource Link IDandRelease gradesunchanged.Click “Create”. This should create an AGS line item in Open edX.
To see the line item that has been created:
See the “Lti ags line items” section in djagno admin panel.
Select radio button in “Line item”, edit the URL with the number of line item you want to see (5 in this case) and click “Read”.
Update the line item using the same process as read.
Delete is rejected by the LMS with a message “You do not have permission to perform this action.” Even with an admin LMS account.
2.2.2 Score publish service
This service will allows us to test if Open edX platform:
Accepts incoming score submissions and validate required fields?
Does it correctly associate scores to a user + line item and update grade state?
Here are the steps that i took to use this service:
Score publish service shows an endpoint that is not editable. You can edit this field by editing the “Line item” field in Line item service.
Once you’ve selected the end point, add all the other data including comment and click Create/update.
You can see the score you just published in section named “Lti ags scores” in django admin panel.
2.2.3 Results Service
This service will allows us to test if Open edX platform:
Does the platform store and expose outcomes back to tools after scores are submitted?
Does it enforce read permissions via
scope/result.readonly?Does it return results in the expected shape and support filtering/pagination.
I’m unable to get results service to work. I get an error when trying to read the results: “The data (null) must match the type: array”.
The problem i think is that Open edX redirects /results → /results/ (301) but saLTIre expects JSON array immediately and doesn’t follow the redirect, so it tries to validate HTML/empty as an array and fails.
So i called the API using my local machine (after configuring token) and it returned the scores.
2.3 Names and Roles Provisioning Service (NPRS)
Configure the xblock so that it advertises NPRS endpoint at launch.
In Open edX Studio, edit the xblock. Set “Enable NPRS” to
True.Save and publish the unit.
Launch saltire by navigating to the unit in LMS using any role.
Fetch the Oauth2 token using these steps, if not already fetched.
From header, select “Services” > “Names and Role Provisioning Service”.
“Endpoint” should be selected by default.
Select a filter if you need to.
Click “Read”.
A modal titled “Service Response” should show up with count of members returned in the API call.
View request message > “Formatted Response Body” to verify users and their roles.
2.4. Fetch Oauth2 token
This step is needed to test AGS and NPRS.
Navigate to “Oauth2 Access Token” in “Services” menu in saltire header.
Leave the Endpoint at default value.
Check the following scopes:
https://purl.imsglobal.org/spec/lti-ags/scope/lineitem (for AGS).
https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly (for AGS).
https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly (for AGS).
https://purl.imsglobal.org/spec/lti-ags/scope/score (for AGS).
https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly (for NPRS).
Click “Request new token”.
You should see the “Access token” field populate with the new token.
Other Findings
I am launching saltire as a Student and Open edX is still advertising AGS manage scopes to that launch.