flutter3d_education_lti
Outside the 1.0 semver promise. It carries the engine's number to say which engine it goes with, and a release of a package its signatures name may break it in a minor, labelled in its CHANGELOG (SUPPORT.md says which).
LTI 1.3 launch, grade passback and xAPI reporting for flutter3d's lessons and laboratories, in plain Dart. cloud/lti serves a lesson viewer over it once a launch verifies.
Until 1.0.0-rc.1, flutter3d_lti, and for a while the lti.dart library of flutter3d_education. It is a package of its own so that what reads an experiment (the editor, a lesson, the build tool) does not resolve pointycastle, dart_jsonwebtoken and http; it depends on flutter3d_education for the experiment a CheckReporter reports on.
LTI 1.3 launch and xAPI reporting, for the edu-03 line of doc/tooling-plan.md
(doc/edu-03-lti-plan.md has the full plan). It is plain Dart, without shelf,
jaspr or Flutter, so a service that only needs to verify a launch or file a
grade does not have to carry any of them.
What is here
-
LtiPlatformSettingsholds one LMS registration (issuer, client ID, deployment ID, JWKS URL, auth-login URL), read once from environment variables the same waycloud/lessons/cloud/serveralready read theirs. -
OidcLoginInitiationbuilds the redirect for LTI's OIDC third-party login initiation, with a freshstate/nonceper login. -
LtiLaunchValidatorverifies an incomingid_token's signature against the platform's JWKS (cached bykid), its issuer/audience/expiry, and thestate/noncefrom the login that started it, then parses the result intoLtiLaunchClaims. -
AgsClientgets a Bearer token from the platform through a client-credentials grant this tool signs itself (LtiToolCredentials), then posts anAgsScoreto a line item's/scoresendpoint. It caches the access token until the token is close to expiring. -
XapiClientPUTs anXapiStatement(actor/verb/object/result) to a Learning Record Store, keyed by the statement's own UUID so a retried submission cannot double a student's record. -
CheckReporteris the wire from a lesson'scheckquestions to both clients: each answer becomes an xAPI statement, and each question settled updates the score in the platform's gradebook.
What is not here yet
- Deep Linking (a teacher picking a lesson inside the LMS and placing it
in a course) and Names and Role Provisioning (reading a course's
roster) are not implemented. A launch of another message type is verified
all the same and arrives as
LtiMessageType.other, for the route to turn away; the type is open, so both arrive in a 1.x minor without a break. - SCORM and cmi5 are not LTI and will not be in this package. They
belong to a separate LMS extension package, and none is published yet.
An LMS with a Learning Record Store can take a lesson's results through
XapiClientin the meantime.
Tests
dart test
test/support/test_platform.dart generates a real RSA key pair per test run
and signs real id_tokens with it, so LtiLaunchValidator is tested against an
actual RS256 signature and an actual JWKS document rather than mocks.
Libraries
- flutter3d_education_lti
- LTI 1.3 launch and xAPI reporting, with no Flutter and no HTTP framework
of its own. See
doc/edu-03-lti-plan.mdfor what this package is for and what still lives elsewhere (cloud/lti's routes, the AGS and xAPI clients oflti-01/lti-02).