LTI Provider
This Django app implements the server (provider) side of the 1EdTech LTI
1.1 specification, allowing external tools and platforms to launch content
inside the Open edX LMS using OAuth 1.0-signed requests. LTI 1.2 and 1.3
are not supported by this app.
Security Requirements
Shared Cache Backend (Required for Multi-Node Deployments)
The LTI provider protects against OAuth replay attacks by storing each
oauth_nonce in Django’s cache after it is first seen and rejecting any
subsequent request that presents the same nonce within the validity window
(±5 minutes around the oauth_timestamp).
This protection only works correctly when all LMS nodes share the same cache
backend. If you run more than one LMS process or server, you must configure
Django’s default cache to use a shared backend such as Redis or Memcached.
A per-process backend (e.g. Django’s built-in LocMemCache) keeps a
separate in-memory store per process, so a replayed request arriving on a
different node will not be detected.
Tutor-based deployments use Redis by default and satisfy this requirement
automatically. For bare-metal or custom deployments, verify that
CACHES['default'] is pointed at a shared Redis or Memcached instance.