1 of 29

LTI 1.3 Advantage primer

claude.vervoort@(cengage|gmail).com

2 of 29

LTI Advantage = LTI 1.3 + 3 services

3 of 29

lti13 uses asymetric keys

public key (jwks_uri)

4 of 29

lti13 messages are OpenId idtoken

JWS

signed JWT

idtoken

signed JWT with openid claims

LTI message

openid token with LTI claims

5 of 29

lti13 launches are OpenId authentication

  1. LMS -> Tool: “hello, I’m LMS x, someone wants to access your tool
  2. Tool -> LMS: “Ok, tell me who is knocking
  3. LMS: Ok this is a registered app, and a registered auth redirect: I know you, so i’ll tell you
  4. LMS->Tool: sends the id_token (LTI message) to the tool’s endpoint: this is Jane, a student in course
  5. Tool: is this coming from the LMS x? Verify signature (and state) using the LMS x Keyset: ok I trust that statement
  6. Tool: proceed to actual Tool UI (show resource/deep link/…) so I show the page Jane’s is expecting

6 of 29

openId + LTI

{

"iss": "https://platform.example.org",

"sub": "a6d5c443-1f51-4783-ba1a-7686ffe3b54a",

"aud": ["962fa4d8-bcbf-49a0-94b2-2de05ad274af"],

"exp": 1510185728,

"iat": 1510185228,

"azp": "962fa4d8-bcbf-49a0-94b2-2de05ad274af",

"nonce": "fc5fdc6d-5dd6-47f4-b2c9-5d1216e9b771",

"name": "Ms Jane Marie Doe",

"given_name": "Jane",

"family_name": "Doe",

"middle_name": "Marie",

"picture": "http://example.org/jane.jpg",

"email": "jane@example.org",

"locale": "en-US",

"https://purl.imsglobal.org/spec/lti/claim/deployment_id":

"07940580-b309-415e-a37c-914d387c1150",

"https://purl.imsglobal.org/spec/lti/claim/message_type":

"LtiResourceLinkRequest",

"https://purl.imsglobal.org/spec/lti/claim/version": "1.3.0",

"https://purl.imsglobal.org/spec/lti/claim/roles": [

"http://purl.imsglobal.org/vocab/lis/v2/institution/person#Student",

"http://purl.imsglobal.org/vocab/lis/v2/membership#Learner"

],

"https://purl.imsglobal.org/spec/lti/claim/target_link_uri": "https://mytool.io/quiz1",

"https://purl.imsglobal.org/spec/lti/claim/resource_link": {

"id": "200d101f-2c14-434a-a0f3-57c2a42369fd",

"description": "Assignment to introduce who you are",

"title": "Introduction Assignment"

},

"https://purl.imsglobal.org/spec/lti/claim/context": {

"id": "c1d887f0-a1a3-4bca-ae25-c375edcc131a",

"label": "ECON 1010",

"title": "Economics as a Social Science",

"type": ["CourseOffering"]

},

"https://purl.imsglobal.org/spec/lti/claim/tool_platform": {

"contact_email": "support@example.org",

"product_family_code": "example.org",

"version": "1.0"

},

"https://purl.imsglobal.org/spec/lti/claim/launch_presentation": {

"document_target": "iframe",

"height": 320,

"width": 240,

"return_url": "http://example.org/return"

},

"https://purl.imsglobal.org/spec/lti/claim/custom": {

"myCustomValue": "123"

},

"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/result.readonly",

"https://purl.imsglobal.org/spec/lti-ags/scope/score"],

"lineitems": "https://mylms/lti/courses/3606276/lineitems",

"lineitem": "https://mylms/lti/courses/3606276/lineitems/321",

},

}

OpenId = Who

Which Course

Which role

Which link

Which action

AGS support & endpoints

7 of 29

lti13 services uses Oauth2 client credentials

get access token

8 of 29

lti13 services define scopes

access tokens must always be scoped

9 of 29

lti13 is multi-tenant

registered

CapricaU

CapricaU account

deployed (deployment_id)

platform

10 of 29

(Iss, 19109, LTI DeploymentId) -> Tool Account

(Iss, 333993, 3378) -> Tool Account

Moodle -> Scope of Deployment is the Site

Brightspace -> Scope of Deployment is the Org

Org: site,dept, class

11 of 29

A tool should favor a 1-many relationship between lti deployments and an account.

(iss, client_id, lti-deployment_id) -> account

issuer: myunilms.edu (iss)

registration : cengage (client_id A)

registration : turn it in (client_id B)

deployment : Dept Math (lti_deployment 1)

deployment : English Dept (lti_deployment 1)

deployment : Course 1 (lti_deployment 2)

deployment : Course 2 (lti_deployment 3)

Registration (iss, client_id)

Institution (myunilms Math Dept)

Institution (myunilms English Dept)

12 of 29

the

lti advantage

services

13 of 29

Deep Linking, the LTI advantage flow

“The very first launch is always a deep linking request”

deepLinkingRequest

resourceLinkRequest

RESOURCE

LINK

14 of 29

Deep Linking, (pick, search, create) and add

15 of 29

"https://purl.imsglobal.org/spec/lti/claim/message_type":"LTIDeepLinkingRequest",

"https://purl.imsglobal.org/spec/lti-dl/claim/deep_linking_settings": {

"accept_types": ["link", "file", "html", "ltiLink", "image"],

"accept_media_types": "image/*,text/html",

"accept_presentation_document_targets": ["iframe", "window", "embed"],

"accept_multiple": true,

"auto_create": true,

"title": "This is the default title",

"text": "This is the default text",

"data": "Some random opaque data that MUST be sent back"

}

not just lti links...

Supported rendering options

one item at a time?

User prompted on return to validate?

Deep Linking, not just deep links...

16 of 29

Deep Linking, not just deep links...

"https://purl.imsglobal.org/spec/lti/claim/message_type": "LTIDeepLinkingResponse",

"https://purl.imsglobal.org/spec/lti-dl/claim/data": "Some random opaque data that MUST be sent back",

"https://purl.imsglobal.org/spec/lti-dl/claim/content_items": [{

"type": "ltiLink",

"title": "A title",

"text": "This is a link to an activity that will be graded",

"url": "https://lti.example.com/launchMe",

"lineItem": {

"scoreMaximum": 87,

"resourceId": "xyzpdq1234",

"tag": "originality"

},

"custom": {

"quiz_id": "az-123"

},

"submission": {

"endDateTime": "2018-03-06T20:05:02Z"

},

"window": {"targetName": "examplePublisherContent"},

"iframe": {"height": 890}

},

Declarative creation of line item (gradebook column)

17 of 29

Signed JWT with item selection (can be empty items)

Use tool’s jwks to validate payload

Use data to avoid Cross Site forgery attack

18 of 29

Assignment and

Grades

Services

19 of 29

AGS allows a sandboxed columns management

Tool

Quiz 1

20 points

Cyl Quiz

10 points

Essay on C..

24 points

Cyl Quiz

15 points

add

edit

delete

get and get all mines

20 of 29

AGS allows columns without links

(however it is usually preferred to create lineitems during the link import in Deep Linking)

decoupled

21 of 29

AGS allows to post and get scores

Tool

Quiz 1

20 points

Cyl Quiz

10 points

Essay on C..

24 points

post score

get current scores (results)

8.8 Good job!

! needs grading

9.2

22 of 29

AGS endpoints are in each LTI launch

{

"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/result.readonly",

"https://purl.imsglobal.org/spec/lti-ags/scope/score"

],

"lineitems": "https://www.myuniv.edu/2344/lineitems/",

"lineitem": "https://www.myuniv.edu/2344/lineitems/1234/lineitem"

}

}

23 of 29

Names and

Roles

Service

24 of 29

NRS means discover users before they launch

Tool

GET read-only

GET what changed

25 of 29

NRS endpoint is in each LTI launch

https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice”: {

"context_memberships_url": "https://www.myuniv.example.com/2344/memberships"

}

26 of 29

Learning Platform’s Tool registration data

Tool’s Learning platform registration data

Tool’s Domain (Tool’s URL)

Issuer: domain of the learning platform

Client Id: OAuth 2 Client Id

Tool’s Open Id init URL

Oauth Request URL

Redirect URIs (must support multiple)

Tool’s JWKS endpoint

Platform’s JWKS endpoint

Token Endpoint

Deep Linking Target Link URI (if DL supported by tool)

AGS enabled/NRPS enabled

Privacy options

27 of 29

Beyond lti advantage

submission review launch

dynamic registration

course groups

….

28 of 29

extensions can then become required

and included in the next bundle

LTI Advantage 202?

29 of 29

LTI 1.3 Advantage resources

https://www.imsglobal.org/activity/learning-tools-interoperability

Resources collection: https://github.com/1EdTech/ltibootcamp

Node LTI Test Tool from Blackboard: https://github.com/blackboard/BBDN-LTI-Tool-Provider-Node

Youtube serie on LTI Advantage: https://www.youtube.com/playlist?list=PLb5mG7w3UZkPKHODmz5YCkIqnWQEsjMkd