Skip to content

LTI 1.3 Platform Request Flow

In the context of LTI 1.3, SkillsTown acts as the Tool, and the customer acts as the Platform. This page outlines the request flow.

This flow should be followed if SkillsTown's courses will be implemented in your platform.

Login Tool

As step one, the Platform will call the login URL: https://account.onlineacademy.nl/api/ltiTool/OnGetOrPost.

Through this request we expect to receive the following parameters: iss and / or client_id, login_hint, target_link_uri, lti_message_hint

Example values

ParameterValue
client_id71bafed5-5db8-483a-bc91-0531e651e57d
isshttps://issuer.example.com/
login_hint12345
target_link_urihttps://account.onlineacademy.nl/api/ltiTool/ToolLaunch
lti_message_hint{ "course_version_id": xxxxx, "deployment_id": "efbd32f9-2461-4be8-9ca4-d9cbf2367cca", "test": false, "messageType": "LtiResourceLinkRequest", "company_name": "Example Company", "content_version": 9, "course_type": "6", "culture": "en-GB" }

GET or POST

If you call this endpoint using a GET method, these parameters should be included as query parameters. If you use a POST method, these values should be in the request body.

Authorization Platform

Using the values received through our Authorization endpoint, we will send a request to the provided authorization URL with the following query parameters:

ParameterValue
client_id71bafed5-5db8-483a-bc91-0531e651e57d
isshttps://account.onlineacademy.nl
response_typeid_token
scopeopenid profile email
redirect_urihttps://account.onlineacademy.nl/api/ltiTool/ToolLaunch
stateb4523079761ad690228256c7909f0d140d89b8aedbb04c8685254
nonce1ae28c4dff14531eaf5a82db859e526ead88a83db05deb9c7ff43f81
login_hint[User id]
promptnone
response_modeform_post
lti_message_hint{ "course_version_id": xxxxx, "deployment_id": "efbd32f9-2461-4be8-9ca4-d9cbf2367cca", "test": false, "messageType": "LtiResourceLinkRequest", "company_name": "Example Company", "content_version": 9, "course_type": "6", "culture": "en-GB" }

ToolLaunch

The Platform can now construct the JWT token and redirect to https://account.onlineacademy.nl/api/ltiTool/ToolLaunch, adding the JWT token in the payload.

Through the provided Keyset URL we will validate the token.

Example JWT Payload

The following is an example object with mandatory items, which needs to be included as JWT in the payload:

json
{
  "nbf": 1719477033,
  "exp": 1719477333,
  "iss": "https://issuer.example.com",
  "name": "John Doe",
  "given_name": "John",
  "family_name": "Doe",
  "email": "user@example.com",
  "aud": "Example Company",
  "nonce": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "iat": 1719477033,
  "sid": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "sub": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "auth_time": 1719402633,
  "idp": "local",
  "https://purl.imsglobal.org/spec/lti-ags/claim/endpoint": {
    "scope": [
      "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem",
      "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly",
      "https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly",
      "https://purl.imsglobal.org/spec/lti-ags/scope/score"
    ],
    "lineitems": "https://example.com/scores",
    "lineitem": "https://example.com/scores"
  },
  "https://purl.imsglobal.org/spec/lti/claim/deployment_id": "XXXX-Course-Identifier_XXXX",
  "https://purl.imsglobal.org/spec/lti/claim/custom": {
    "course_identifier": "XXXX-Course-Identifier_XXXX"
  }
}

course_identifier

We expect to receive a course_identifier parameter as a custom claim to link the correct course.

The course should now be visible in the platform.

Progress

Whenever the user leaves the active window, our Tool will send out a POST request to the lineitem URL provided to us in the ToolLaunch JWT token. If the lineitem isn't available, it will use the lineitems value.

Object example unfinished course:

json
{
  "activityProgress": "InProgress",
  "gradingProgress": "Pending",
  "scoreGiven": 0.2,
  "scoreMaximum": 1,
  "timestamp": "YYYY-MM-DDTHH:MM:SS.MS\u002B00:00",
  "userId": "12345"
}

Object example finished course:

json
{
  "activityProgress": "Completed",
  "gradingProgress": "FullyGraded",
  "scoreGiven": 1,
  "scoreMaximum": 1,
  "timestamp": "YYYY-MM-DDTHH:MM:SS.MS\u002B00:00",
  "userId": "12345"
}