Skip to content

Add minimum viable platform-side LTI 1.3 resource link launch #27

Description

@ottenhoff

Summary

lti-tool is already useful for applications that need to act as an LTI 1.3 tool. CoursePorter has a second use case that needs the opposite side of the protocol: acting as an LTI platform/consumer for LTI links discovered inside imported IMS Common Cartridge / Canvas IMSCC packages.

CoursePorter imports and hosts course packages. IMSCC packages can include external tool / LTI resource links. Today those items are recognized but marked unsupported because launching them outside the original LMS requires platform-side LTI behavior.

This issue is a request to explore platform-side primitives in lti-tool so apps like CoursePorter can safely launch imported LTI resources instead of treating every cartridge LTI item as a manual replacement.

CoursePorter use case

A hosted course delivery platform imports an IMSCC package. During import it finds an item/resource that represents an LTI external tool, for example Canvas external_tool, Basic LTI, or an LTI 1.3 resource link. Later a learner launches the imported course from CoursePorter. CoursePorter needs to launch the third-party LTI tool from its own domain and state model.

In that flow CoursePorter is not the tool being launched by Canvas/Moodle/Sakai. CoursePorter is the platform initiating a launch into another tool.

Helpful platform-side capabilities

A useful platform-side package would provide typed primitives for:

  • Registering and storing external LTI tool definitions that CoursePorter is allowed to launch.
  • Representing platform-owned deployment/client/tool configuration for an external tool.
  • Building LTI 1.3 login/initiation and launch payloads from platform context.
  • Signing platform-originated ID tokens using WebCrypto-compatible keys.
  • Publishing platform JWKS for external tools to verify CoursePorter launches.
  • Mapping CoursePorter learner, course, assignment, attempt, and resource-link context into LTI claims.
  • Encoding resource link IDs, custom params, roles, context claims, and target link URIs.
  • Validating required tool configuration before launch and returning typed errors when configuration is missing.
  • Supporting nonce/state/correlation records for platform-originated launch attempts.
  • Keeping launch construction cookie-safe and iframe-safe for embedded course delivery.

LTI Advantage platform needs

For a complete CoursePorter integration, platform-side support would eventually need decisions or primitives for:

  • AGS: receiving score/line-item calls from launched tools and mapping them to CoursePorter attempts/gradebook rows.
  • NRPS: serving roster/membership responses for the CoursePorter assignment/course context.
  • Deep Linking: optionally allowing an external tool to return selected content into an import or authoring workflow.
  • Dynamic Registration: supporting external tools registering with CoursePorter as a platform, if that is in scope.

These do not all have to ship together, but the package boundary should make it clear which side of each service is implemented: tool-side client calls vs platform-side service endpoints.

IMS Common Cartridge specific needs

Imported cartridge LTI items often need normalization before launch. Helpful APIs would include:

  • A normalized LTI resource-link DTO that can be produced from IMSCC/Canvas cartridge data.
  • Detection helpers that distinguish Basic LTI links, LTI 1.3 links, and vendor-specific external tool descriptors where possible.
  • A way to associate imported cartridge resource IDs with platform resource link IDs.
  • Diagnostics for links that cannot be launched because the original LMS-held configuration is missing.

Desired design shape

This should probably be separate from the current tool-side API, for example:

  • @lti-tool/platform for platform/consumer launch construction and service endpoints.
  • Shared core schemas/constants where appropriate.
  • Storage interfaces separate from the current LTIStorage if the data model differs.
  • D1-compatible storage, but without requiring in-memory fallbacks for production.

The main thing CoursePorter needs is a loud, typed boundary: either we have enough platform/tool configuration to launch the imported LTI item correctly, or we produce an operator-facing diagnostic explaining what is missing.

Non-goals

  • Do not fake successful LTI launches when issuer/client/deployment/key metadata is missing.
  • Do not assume imported Canvas/Moodle/Sakai external tool links are launchable without explicit CoursePorter-side tool configuration.
  • Do not blur tool-side APIs with platform-side APIs; callers need to know which protocol role they are implementing.

Why this matters

Without platform-side support, CoursePorter can use lti-tool to be launched by an LMS, but it still cannot safely launch third-party LTI tools found inside imported Common Cartridge packages. Platform-side primitives would make lti-tool useful for both directions of LTI integration.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfutureFuture consideration

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions