Skip to content
Snippets Groups Projects
  1. Nov 18, 2022
    • michaelroytman's avatar
      feat: add course flag to send external_user_id as user_id in LTI 1.1 XBlock launches · cff7744e
      michaelroytman authored
      This commit introduces a new CourseWaffleFlag lti_consumer.enable_external_user_id_1p1_launches. When this flag is enabled for a course, LTI 1.1 XBlock launches in that course will send the user's external_user_id as the user_id attribute of the launch. external_user_id is the user's external user ID as defined, created, and stored by the external_user_ids Djangoapp in the edx-platform. When this waffle is not enabled for a course - the default case - LTI 1.1 XBlock launches in that course will continue to send the user's anonymous_user_id as the user_id attribute of the launch, as before.
      
      This provides an opt-in opportunity for courses to send a consistent, static, and opaque user identifier in an LTI 1.1 XBlock launch. This may be necessary for integration with LTI tools that require such an identifier.
      
      Please be aware that toggling this flag in a running course carries the risk of breaking the LTI integrations in the course. This flag should also only be enabled for new courses in which no LTI attempts have been made.
      cff7744e
  2. Nov 16, 2022
  3. Nov 09, 2022
  4. Nov 07, 2022
    • Andy Shultz's avatar
      fix: remove general use of load_block_as_user · 5f964f1d
      Andy Shultz authored
      For the config model we do not need to go as far as binding the block
      to the user and already get enough data out of the modulestore to
      satisfy the storage on the xblock case. Add a new function to get that
      much xblock only.
      
      For the limited cases where we are using the block more directly as a
      block we maintain the old function.
      
      Also includes a fix to test_views that was closing the wrong level
      mock and leaving an open patch into other tests.
      5f964f1d
  5. Nov 04, 2022
  6. Nov 02, 2022
  7. Nov 01, 2022
  8. Oct 26, 2022
  9. Oct 25, 2022
  10. Oct 20, 2022
    • Andy Shultz's avatar
      test: mark most compat functions as nocover · a5c752f6
      Andy Shultz authored
      these functions require the LMS environment which is not available in test so
      they are generally mocked away. Mark them as such.
      a5c752f6
    • Andy Shultz's avatar
    • Andy Shultz's avatar
      feat: update lti API to pick config via launch data · a52eef76
      Andy Shultz authored
      Note that this uses config_id (the UUID) not config.id (the int)
      
      This required a way to get config_id if we only have the block.
      
      And it means that we are more likely to go through load_block_as_user
      because we have not created the config off the block even when calling
      from the block (since the block has to go through that config ID).
      
      A lot of tests had to be updated to have more complete configuration
      setup because config_id is now load bearing.
      a52eef76
    • Andy Shultz's avatar
      feat: only use anonymous user if there is no other choice · c14aa1c4
      Andy Shultz authored
      Sometimes we need to load the block. Current code always rebinds the
      block to the anonymous user because we might not have a user.
      
      But in many cases we do have a user and may have already loaded and
      bound the block in question. Check for user and request and if the
      block is already bound and just use that block if possible or at least
      load the block with the user you actually have.
      c14aa1c4
  11. Oct 19, 2022
  12. Oct 18, 2022
  13. Oct 17, 2022
    • michaelroytman's avatar
    • michaelroytman's avatar
      fix: LTI 1.3 launch URL should be redirect_uri provided by Tool in authentication request · 7fb30746
      michaelroytman authored
      This commit fixes a bug in the way we determine where to send the authentication response - the LTI 1.3 launch message - as part of an LTI 1.3 launch.
      
      According to the 1EdTech Security Framework 1.0, during an LTI 1.3 launch, "the authentication response is sent to the redirect_uri." The redirect_uri is a query or form parameter provided by the tool when it directs the browser to make a request to the Platform's authentication endpoint. However, we currently send the authentication response to the preregistered launch URL - lti_1p3_launch_url in the LtiConsumerXBlock or the LtiConfiguration model. The difference is subtle, but it is important, because the specification indicates the Platform should respect the redirect_uri provided by the Tool, assuming it is a valid redirect_uri.
      
      During the pregistration phase, "the Tool must provide one or multiple redirect URIs that are valid end points where the authorization response can be sent. The number of distinct redirect URIs to be supported by a platform is not specified." Currently, we do not support multiple redirect URIs, so the change is not immediately impactful. However, we should follow the specification and ensure that we return the authentication response to the correct URL.
      7fb30746
    • michaelroytman's avatar
      fix: X-Frame-Options DENY response header prevents LTI 1.3 launch · 0697923d
      michaelroytman authored
      This commit fixes a bug caused by the X-Frame-Options response header. The X-Frame-Options response header indicates to the browser whether a site's content can be loaded within certain tags, including the <iframe> tag. This is a form of clickjacking protection.
      
      In Django, this response header is set by the django.middleware.clickjacking.XFrameOptionsMiddleware middleware. In the edx-platform, by default, X-Frame-Options is set to DENY (see the X_FRAME_OPTIONS Django setting), which means that the response content returned by Django views cannot be loaded within certain tags. However, this behavior can be disabled by decorating views with the django.views.decorators.clickjacking.xframe_options_exempt view decorator.
      
      This creates a problem for LTI 1.3 lauches in the edx-platform. When an LTI component is loaded, the LtiConsumerXBlock is loaded via the lms.djangoapps.courseware.views.views.render_xblock_view view. This view is called an <iframe> tag, but the view is decorated by the xfame_options_exempt decorator, which disables clickjacking protection and communicates to the browser that the content can be loaded in the <iframe> tag.
      
      Once the third-party login request of the LTI 1.3 launch is completed, the LTI tool directs the browser to make a request to the launch_gate_endpoint. This endpoint returns a response, which is an auto-submitting form that makes a POST request - the LTI launch request - to the tool. This view has clickjacking enabled, so the browser blocks the requests, which prevents the launch from occurring.
      
      This commit adds the xframe_options_exempt view decorator to the launch_gate_endpoint view.
      
      Note that LTI 1.1 does not have this bug, because the LTI launch request is handled via the lti_launch_handler. The XBlock runtime handles requests to the LTI handlers via the openedx.core.djangoapps.xblock.rest_api.views.xblock_handler view, which is also decorated by the xframe_options_exempt view decorator.
      0697923d
  14. Oct 13, 2022
    • Michael Roytman's avatar
      Merge pull request #288 from openedx/mroytman/MST-1603-decouple-LTI-1.3-launch-from-XBlock · 52dfb3ea
      Michael Roytman authored
      feat: decouple LTI 1.3 launch from the XBlockLtiConsumer
      52dfb3ea
    • michaelroytman's avatar
      feat!: decouple LTI 1.3 launch from LtiConsumerXBlock · f7b9d401
      michaelroytman authored
      Purpose
      -------
      
      The purpose of these changes is to decouple the LTI 1.3 launch from the LtiConsumerXBlock. It is in accordance with the ADR "0007 Decouple LTI 1.3 Launch from XBlock and edX Platform", which is currently under review. The pull request for the ADR is here: https://github.com/openedx/xblock-lti-consumer/pull/281.
      
      The general premise of these changes is to shift the responsibility of defining key launch claims to users of the library. Such claims include user ID, user role, resource link ID, etc. Prior to this change, this context was defined directly in the launch view by referencing XBlock fields and functions, thereby tying the LTI 1.3 launch to the XBlock. By shifting the responsibility out of the view, we will be able to genericize the launch and make it functional in more contexts than just the XBlock and the XBlock runtime.
      
      In short, the key launch claims are encoded in an instance of a data class Lti1p3LaunchData. Users of the library will instantiate this class with necessary launch data to it and pass the instance to various methods of the Python API to communicate the data to the library. Please see the aforementioned ADR for more details about this decoupling strategy.
      
      Note that the majority of these changes affect only the basic LTI 1.3 launch. There have largely been no changes to LTI 1.3 Advantage Services. The one exception is the Deep Linking content launch endpoint. This is because this launch is implemented in the basic LTI 1.3 launch, and it was necessary to make the same changes to the deep linking content launch to ensure that it works properly. Otherwise, LTI 1.3 Advantage Services are out of scope of these changes.
      
      Change Summary for Developers
      -----------------------------
      
      Below is a summary of changes contained in this pull request.
      
      * added an Lti1p3LaunchData data class
      * added caching for Lti1p3LaunchData to limit data sent in request query or form parameters
      * BREAKING CHANGE: modified Python API methods to take Lti1p3LaunchData as a required argument
      ** get_lti_1p3_launch_info
      ** get_lti_1p3_launch_start_url
      ** get_lti_1p3_content_url
      * replaced references to LtiConsumerXBlock.location with Lti1p3LaunchData.config_id
      * removed definition of key LTI 1.3 claims from the launch_gate_endpoint and instantiated Lti1p3LaunchData from within the LtiConsumerXBlock instead
      * added a required launch_data_key request query parameter to the deep_linking_content_endpoint and refactored associated templates and template tags to pass this parameter in the request to the view
      
      Change Summary for Course Staff and Instructors
      -----------------------------------------------
      
      The only changes relevant for course staff and instructors is that the access token and keyset URLs displayed in Studio have changed in format.
      
      The old format was:
      
      Access Token URL: https://courses.edx.org/api/lti_consumer/v1/token/block-v1:edX+999+2022Q3+type@lti_consumer+block@714c10a5e4df452da9d058788acb56be
      Keyset URL: https://courses.edx.org/api/lti_consumer/v1/public_keysets/block-v1:edX+999+2022Q3+type@lti_consumer+block@714c10a5e4df452da9d058788acb56be
      
      The new format is:
      
      Access Token URL: https://courses.edx.org/api/lti_consumer/v1/token/c3f6af60-dbf2-4f85-8974-4ff870068d43
      Keyset URL: https://courses.edx.org/api/lti_consumer/v1/public_keysets/c3f6af60-dbf2-4f85-8974-4ff870068d43
      
      The difference is in the slug at the end of the URL. In the old format, the slug was the UsageKey of the XBlock associated with the LTI integration. In the new format, the slug is the config_id of the LtiConfiguration associated with the LTI integration. This is an iterative step toward decoupling the access_token_endpoint and the public_keyset_endpoint views from the XBlock location field. The XBlock location field appears as the usage_key parameter to both views. We cannot simply remove the usage_key parameter from the views, because existing LTI 1.3 integrations may have been created using the old format, and we need to maintain backwards compatibility. This change, however, prevents new integrations from being created that are coupled to the XBlock. In the future, we may address integrations that use the old format to fully decouple the XBlock from the views.
      
      Testing
      -------
      
      Unit tests were added for all changes.
      
      In addition, manual testing was performed using the instructions in the documents listed below.
      
      * https://github.com/openedx/xblock-lti-consumer#lti-13
      * https://openedx.atlassian.net/wiki/spaces/COMM/pages/1858601008/How+to+run+the+LTI+Validation+test
      
      Resources
      ---------
      JIRA: MST-1603: https://2u-internal.atlassian.net/browse/MST-1603
      
      BREAKING CHANGE
      f7b9d401
  15. Oct 03, 2022
  16. Sep 28, 2022
  17. Sep 20, 2022
  18. Sep 16, 2022
  19. Sep 14, 2022
  20. Sep 13, 2022
  21. Sep 02, 2022
Loading