How to Build a Rich / Non-Trivial IMS LTI 1.1 Provider

PHP IMS LTI 1.1 Providers

I have a “hello world” provider in PHP here:

https://source.sakaiproject.org/svn//basiclti/trunk/basiclti-docs/resources/docs/sakai-api-test/tool.php

It is nice as it does all of LTI 1.1 as well as Sakai’s extensions documented here:

https://source.sakaiproject.org/svn//basiclti/trunk/basiclti-docs/resources/docs/sakai_basiclti_api.doc

I have built a few other PHP providers that do a little more and use a database with some Authz and different implementation approaches. I used these as examples for various advanced LTI workshops I have given:

http://ims-dev.googlecode.com/svn/trunk/basiclti/php-simple/adlist/

http://ims-dev.googlecode.com/svn/trunk/lti/lms/

The best example is the Moodle LTI 1.1 Provider written by Juan Levya. The Moodle provider is more rich and powerful than the Sakai provider (below). The Moodle provider does grade send-back as well launch and provisioning at either a course or a tool level. I would love to get Sakai’s provider to feature parity with Moodle’s provider.

http://docs.moodle.org/22/en/LTI_Provider

https://moodle.org/plugins/view.php?plugin=local_ltiprovider

https://github.com/jleyva/moodle-local_ltiprovider

Java IMS LTI 1.1. Providers

There are three samples of Java LTI code here:

http://ims-dev.googlecode.com/svn/trunk/basiclti/

They were the initial sample code that was developed as proof-of concept. The Sakai LTI 1.1. providers started with this:

http://ims-dev.googlecode.com/svn/trunk/basiclti/java-servlet/

And went quite a ways beyond it. So I would ignore the above and start with:

https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-portlet/src/java/org/sakaiproject/blti/ProviderServlet.java

https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-docs/resources/docs/sakai_basiclti_provider.doc

You will note that the code here:

https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-util/src/java/

Is not even copyright Sakai – it is generic utility code copyright IMS and others – and it is more well-tested than the code in http://ims-dev.googlecode.com/svn/trunk/basiclti/java-servlet/ – so I would start with this as your utility code.

The connection between that generic Util code and Sakai APIs happens here:

https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-common/src/java/org/sakaiproject/basiclti/util/SakaiBLTIUtil.java

I made sure that I kept the generic bits and non-generic bits 100% separate.

5 Comments

  1. Matt McLean says:

    Hello Dr. Chuck-
    I hope that you can help me. I’m a teacher in NYC. I have limited program skills. I’m running my own install of Canvas. I have a number of lessons built with Adobe Captivate. I’m trying to build an LTI provider that will pass the grade information from my Captivate lessons into the Canvas gradebook. I’ve spent the last month scouring the IMS-LTI resources and the Canvas developer resources as well. A developer from the Canvas forum suggested that if I could get a tool working that passes a grade back to the grade book I could call a javascript function from within the
    Captivate content by putting javascript into the html page generated by Captivate, and then have it kick off an LTI
    outcomes event.

    I’ve installed TSUGI and have tried the grade pass back tool but I keep getting an error (failure to store grade).

    Two things:
    1. Would continuing to delve into TSUGI help me reach my goal above and

    2. I would love some kind of step by step tutorial for building an LTI tool provider. I’ve found that there are plenty of code examples but I can’t find something that puts it all together. I’ve explored using Ruby on Rails and PHP.

    Thank you so much for your time and expertise!
    Matt

  2. Matt – I built Tsugi in an attempt to make it simpler. The problem is that LTI 1.0 was so easy but as soon as folks started using it – they wanted more features. So we have LTI 1.1, LTI 2.0, LTI Content Item and a whole bunch of new LTI 2.0 services in the pipeline. An average developer will never be able to keep up. SO I recommend using Tsugi – whatever complexity it adds – is probably a lot simpler than reading all the specs. The reason that there is no “Easy Guide to all of LTI” – is that it is not easy. In terms of your question of sending a grade to Canvas through JavaScript – I have no idea. LTI would not allow you to do this because the secret is generally not handed to JavaScript – otherwise all security would fail. Canvas might have some OAuth 2.0 extension that lets certain things happen – but I don’t know about that. In the LTI approach the JavaScript in the browser would need to talk to a server that then sends the grade back to the LMS server – to server. This of course is exactly what Tsugi does. It logs the user in and lets you put up content form the Tsugi server – you can then send Tsugi a new grade via JavaScript and then Tsugi sends it to the LMS. My Python autograder written in Tsugi follows this exact pattern.

  3. Richard Valdivieso says:

    Hello Dr. Chuck

    I have a quick question. So far I have found providers example which content is text. What can I do if the content is video?

    Thank you in advance for your answer.

    Richard

  4. There are lots of LTI providers that do video – they just put up HTML in an iframe and play video in that markup.

  5. ranu says:

    i want to create m own LTI provider for providing feedback tool to students how can i do that pls suggest asap.

Leave a Reply

*