This XBlock implements the consumer side of the LTI specification.
################### LTI Consumer XBlock ###################
| |status-badge| |license-badge| |ci-badge| |codecov-badge| |pypi-badge|
Purpose
This XBlock implements the consumer side of the LTI specification enabling integration of third-party LTI provider tools.
Getting Started
For details regarding how to deploy this or any other XBlock in the lms instance, see the installing-the-xblock
_ documentation.
.. _installing-the-xblock: https://edx.readthedocs.io/projects/xblock-tutorial/en/latest/edx_platform/devstack.html#installing-the-xblock
Assuming that your devstack
repo lives at ~/code/devstack
and that edx-platform
lives right alongside that directory, you'll want
to checkout xblock-lti-consumer
and have it live in ~/code/src/xblock-lti-consumer
.
This will make it so that you can access it inside an LMS container shell
and easily make modifications for local testing.
You will have to run the below instructions twice, once for the LMS and once for Studio. Otherwise you will be using different versions of the xblock in the two containers.
Run make dev.shell.lms
or make dev.shell.studio
from your devstack
directory to enter a running container.
Once in there, you can do the following to have your devstack pointing at a local development
version of xblock-lti-consumer
:
.. code:: bash
$ pushd /edx/src/xblock-lti-consumer
$ virtualenv venv/
$ source venv/bin/activate
$ make install
$ make test # optional, if you want to see that everything works
$ deactivate
$ pushd # should take you back to /edx/app/edxapp/edx-platform
$ pip uninstall -y lti_consumer_xblock
$ pip install -e /edx/src/xblock-lti-consumer
You can enable the LTI Consumer XBlock in Studio through the advanced settings.
Settings -> Advanced Settings
from the top menu.advanced_modules
policy key, and add
"lti_consumer"
to the policy value list... code:: bash
git clone git@github.com:openedx/xblock-lti-consumer.git cd xblock-lti-consumer
mkvirtualenv -p python3.8 xblock-lti-consumer
.. code:: bash
workon xblock-lti-consumer
git checkout master git pull
make install
make test
git checkout -b <your_github_username>/<short_description>
vim ...
make compile-sass
pytest ./path/to/new/tests
make quality
git commit ... git push
setup.py contains a list of package dependencies which are required for this XBlock package. This list is what is used to resolve dependencies when an upstream project is consuming this XBlock package. requirements.txt is used to install the same dependencies when running the tests for this package.
If you want to download translations from Transifex install
transifex client <https://docs.transifex.com/client/installing-the-client/>
_ and run this command while
inside project root directory:
.. code:: bash
$ tx pull -f --mode=reviewed
See the developer guide
_ for implementation details and other developer concerns.
.. _developer guide: ./docs/developing.rst
Testing
make test
python ./test.py -k=[name of test file without .py]
python ./test.py -k=test_permissions
python ./test.py -k=test_permissions.TestClass.test_function
http://lti.tools/saltire/ provides a "Test Tool Provider" service that allows you to see messages sent by an LTI consumer.
We have some useful documentation on how to set this up here: http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/latest/exercises_tools/lti_component.html#lti-authentication-information
LTI ID
: "test"
LTI URL
: "https://lti.tools/saltire/tp"ImportError: No module named lti_consumer
, you
should docker-compose restart lms
(since we previously uninstalled the lti_consumer to get the
tests for this repo running inside an LMS container). From here, you can see the contents of the
messages that we are sending as an LTI Consumer in the "Message Parameters" part of the "Message" tab.IMS Global provides a reference implementation of LTI 1.3 that can be used to test the XBlock.
On LTI 1.3 the authentication mechanism used is OAuth2 using the Client Credentials grant, this means that to configure the tool, the LMS needs to know the keyset URL or public key of the tool, and the tool needs to know the LMS's one.
Instructions:
#. Set up a local tunnel (using ngrok
or a similar tool) to get a URL accessible from the internet.
#. Add the following settings to edx-platform/lms/envs/private.py
and edx-platform/cms/envs/private.py
:
* LTI_BASE="http://localhost:18000"
* LTI_API_BASE="http://<your_ngrok>.ngrok.io"
#. Create a new course, and add the lti_consumer
block to the advanced modules list.
#. In the course, create a new unit and add the LTI block.
LTI Version
to LTI 1.3
.Tool Launch URL
to https://lti-ri.imsglobal.org/lti/tools/
#. In Studio, you'll see a few parameters being displayed in the preview:
.. code::
Client ID: f0532860-cb34-47a9-b16c-53deb077d4de
Deployment ID: 1
# Note that these are LMS URLS
Keyset URL: http://1234.ngrok.io/api/lti_consumer/v1/public_keysets/88e45ecbd-7cce-4fa0-9537-23e9f7288ad9
Access Token URL: http://1234.ngrok.io/api/lti_consumer/v1/token/8e45ecbd-7cce-4fa0-9537-23e9f7288ad9
OIDC Callback URL: http://localhost:18000/api/lti_consumer/v1/launch/
#. Set up a tool in the IMS Global reference implementation (https://lti-ri.imsglobal.org/lti/tools/).
Add tool
at the top of the page (https://lti-ri.imsglobal.org/lti/tools).#. Go back to Studio, and edit the block adding its settings (you'll find them by scrolling down https://lti-ri.imsglobal.org/lti/tools/ until you find the tool you just created):
.. code::
Tool Launch URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/launches
Tool Initiate Login URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/login_initiations
Tool Public key: Public key from key page.
#. Publish block, log into LMS and navigate to the LTI block page.
#. Click Send Request
and verify that the LTI launch was successful.
This XBlock supports LTI 1.3 and the following LTI Avantage services:
To enable LTI-AGS, you need to set LTI Assignment and Grades Service in Studio to allow tools to send back grades. There's two grade interaction models implemented:
To enable LTI-DL and its capabilities, you need to set these settings in the block:
To enable LTI-NRPS, you set Enable LTI NRPS to True in the block settings on Studio.
This XBlock supports LTI 1.1/1.2 Basic Outcomes Service 1.0 <http://www.imsglobal.org/spec/lti-bo/v1p1/>
. Please see these
LTI 1.1/1.2 Basic Outcomes Service 1.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/basic_outcomes_service.rst>
for testing the LTI 1.1/1.2 Basic Outcomes Service 1.1 implementation.
This XBlock supports LTI 2.0 Result Service 2.0 <https://www.imsglobal.org/lti/model/uml/purl.imsglobal.org/vocab/lis/v2/outcomes/Result/service.html>
.
Please see the LTI 2.0 Result Service 2.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/result_service.rst>
for testing the LTI 2.0 Result Service 2.0 implementation.
LTI Reusable configuration
The LTI Consumer XBlock supports configuration reusability via plugins. It is compatible with both LTI 1.1 and LTI 1.3. All values (including the access token and keyset URL for LTI 1.3) are shared across the XBlocks with the same external configuration ID. This eliminates the need to have a tool deployment for each XBlock.
openedx-ltistore
_ plugin on the LMS and Studio.openedx-ltistore
_ repository... _openedx-ltistore: https://github.com/open-craft/openedx-ltistore
Getting Help
If you're having trouble, we have discussion forums at https://discuss.openedx.org where you can connect with others in the community.
Our real-time conversations are on Slack. You can request a Slack invitation
, then join our community Slack workspace
.
For anything non-trivial, the best path is to open an issue in this repository with as many details about the issue you are facing as you can provide.
https://github.com/openedx/xblock-lti-consumer/issues
For more information about these options, see the Getting Help
_ page.
.. _Slack invitation: https://openedx.org/slack .. _community Slack workspace: https://openedx.slack.com/ .. _Getting Help: https://openedx.org/getting-help
License
The code in this repository is licensed under the AGPL v3 License unless otherwise noted.
Please see LICENSE.txt <LICENSE.txt>
_ for details.
Contributing
Contributions are very welcome.
Please read How To Contribute <https://openedx.org/r/how-to-contribute>
_ for details.
This project is currently accepting all types of contributions, bug fixes, security fixes, maintenance work, or new features. However, please make sure to have a discussion about your new feature idea with the maintainers prior to beginning development to maximize the chances of your change being accepted. You can start a conversation by creating a new issue on this repo summarizing your idea.
The Open edX Code of Conduct
All community members are expected to follow the Open edX Code of Conduct
_.
.. _Open edX Code of Conduct: https://openedx.org/code-of-conduct/
People
The assigned maintainers for this component and other project details may be
found in Backstage
_. Backstage pulls this data from the catalog-info.yaml
file in this repo.
.. _Backstage: https://backstage.openedx.org/catalog/default/component/xblock-lti-consumer
Reporting Security Issues
Please do not report security issues in public. Please email security@openedx.org.
.. |ci-badge| image:: https://github.com/openedx/xblock-lti-consumer/workflows/Python%20CI/badge.svg?branch=master :target: https://github.com/openedx/xblock-lti-consumer/actions?query=workflow%3A%22Python+CI%22 :alt: Test suite status
.. |codecov-badge| image:: https://codecov.io/github/openedx/xblock-lti-consumer/coverage.svg?branch=master :target: https://codecov.io/github/openedx/xblock-lti-consumer?branch=master :alt: Code coverage
.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen :alt: Maintained
.. |license-badge| image:: https://img.shields.io/github/license/openedx/xblock-lti-consumer.svg :target: https://github.com/openedx/edx-rest-api-client/blob/master/LICENSE :alt: License
.. |pypi-badge| image:: https://img.shields.io/pypi/v/lti-consumer-xblock.svg :target: https://pypi.python.org/pypi/lti-consumer-xblock/ :alt: PyPI