LTI 1.3 Dynamic Registration Process


In my last blog, I talked about LTI standards. LTI 1.3 has greatly advanced the integration of edtech applications. It offers improvements in security with the use of OIDC, Oauth2, and JWT tokens, and flexibility with the use of the LTI Advantages Services such as Deep Linking, Grades and Assignments, and Membership. However, these improvements requires a complicated exchange of configuration information between the Platform and the Tool. Manual processes involve copying and pasting of a significant amount of data on both sides, the platform, and the tool to exchange the long list of identifiers and URLs required to properly configure the integration.
The LTI Dynamic Registration specifications define a way to automate the exchange of registration information between LTI Platforms and Tools
Dynamic Registration Flow
In LTI Dynamic Registration, LMS administrators can use a single URL to initiate a registration. The LTI key is registered with a single URL endpoint. Dynamic Registration uses existing LTI1.3 specifications. The following diagram shows the Dynamic Registration flow.
LTI Dynamic Registration flow
Dynamic Registration Steps Overview:
Enter Dynamic Registration URL in LMS. This URL needs to be a GET Request. LMS opens an iFrame and loads the response of the Dynamic Registration request on the iFrame.
LMS calls the registration URL with 2 additional parameters added as a query string
openid_configuration
andregistration_token
Tool (Dynamic Registration URL) makes a Get call to
openid_configuration
retrieve the platform configuration data. We need to use this data in the Dynamic Registration request.Optional UI to show/edit key registration data: For creating the LTI 1.3 key, we need to provide different tool configurations like (login URL, Target URL, JWK URL etc). We also need to provide the name, and description of the key so that it can be identified on LMS. The tool can either use pre-defined values like “Tool Name LTI Key” or can allow users to view and edit these pre-populate values. From UI users can submit Dynamic Registration requests. If we want to just submit pre-defined values we can skip the UI step.
The next step is to submit a registration request to the registration endpoint. Registration endpoint will vary from each LMS. We will get
registration_endpoint
from platform configuration data in step 3 above. You will also need theregistration_token
received in step 2 above. If the registration request is successful, Moodle returns the actual client registration, including both the client_id and the lti_deployment_id, Other LMSs like Canvas and Blackboard only create a key. We need to deploy the tool manually.On Successful registration, the platform shows
client_id
andregistration_client_uri
in the iframe.
Canvas: Dynamic Registration Steps
- Enter Dynamic Registration URL in Canvas. Login with Admin credentials. Go to Admin → Accounts ->Developer Keys.
It opens an iframe where we can provide a dynamic registration endpoint as https://{tool-base-url}/lti1.3/register
. Please make sure this URL is accessible from the internet without any authentication.
LMS calls Dynamic Registration endpoint with URL query string parameters
openid_configuration
andregistration_token
ashttps://{tool-base-url}/lti1.3/register
?openid_configuration=https://{canvas-base-url}/api/lti/security/openid-configuration?registration_token={registration_token}
We need to useopenid_configuration
andregistration_token
for generating dynamic registration requests.{canvas-base-url}
is the tool provider’s canvas instance URL.Dynamic Registration API needs to make a call to get
openid_configuration
for Canvas using the URL we got in step 2 above.https://{canvas-base-url}
/api/lti/security/openid-configuration?registration_token={registration_token}
.
From the response of this API, we need to use the following fields.
issuer
: the issuer domain must match the openid-configuration URL domain; a tool should not proceed if there is a mismatch.
token_endpoint
: URL to get an access token
jwks_uri
: the endpoint to get the public keys of this canvas site
authorization_endpoint
: the URL to send the OpenId authentication requestregistration_endpoint
: the URL to send the tool registration requestOptional UI: For registering a key we need to provide a few values like
client_name, contacts, description,
etc. If you want you can provide a UI to the user to enter these fields. If you don’t want users to provide these fields, you can give fixed or retrieve these values from some settings.Post Registration Request: The next step is to post a dynamic registration request to
registration_endpoint
received in step 3 above. You will also need to provideregistration_token
received in step 2 above.
POST <registration_endpoint>
Authorization: Bearer <registration_token>
Content-Type: application/json
{
"application_type": "web",
"response_types": ["id_token"],
"initiate_login_uri": "{tool-base-url}/lti1.3/login_init",
"redirect_uris": [
"{tool-base-url}/lti1.3/launch"
],
"grant_types": ["implicit", "client_credentials"],
"client_name": "Dynamic Registration Tool Provider",
"contacts": ["rahulkhedekar@myemail.com"],
"owner": {
"name": "User Name",
"email": "xyz@example.com"
},
"public_jwk": {},
"jwks_uri": "{tool-base-url}/lti1.3/jwk",
"token_endpoint_auth_method": "private_key_jwt",
"https://purl.imsglobal.org/spec/lti-tool-configuration": {
"domain": "archimedes_base_url_domain",
"privacy_level": "public",
"target_link_uri": "{tool-base-url}/lti1.3/target",
"claims": ["iss", "sub", "name", "given_name", "family_name"],
"messages": [
{
"type": "LtiDeepLinkingRequest",
"target_link_uri": "{tool-base-url}/lti1.3/target",
"placements": ["https://{canvas-base-url}/lti/link_selection"]
},
{
"type": "LtiResourceLinkRequest",
"placements": ["https://{canvas-base-url}/lti/account_navigation"],
"target_link_uri": "{tool-base-url}/lti1.3/target"
},
{
"type": "LtiResourceLinkRequest",
"placements": ["https://{canvas-base-url}/lti/course_navigation"],
"target_link_uri": "{tool-base-url}/lti1.3/target"
}
],
"description": "Dynaic registration key for Tool Provider"
},
"scope": "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly https://purl.imsglobal.org/spec/lti-ags/scope/score https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly"
}
6. Dynamic registration success response
{
"client_id": "xxxxxxxx",
"application_type": "web",
"grant_types": ["client_credentials", "implicit"],
"initiate_login_uri": "https://{tool-base-url}/lti1.3/login_init",
"redirect_uris": [
"https://{tool-base-url}/lti1.3/launch"
],
"response_types": ["id_token"],
"client_name": "Dynamic Registration Tool Provider",
"jwks_uri": "https://{tool-base-url}/lti1.3/jwk",
"logo_uri": null,
"token_endpoint_auth_method": "private_key_jwt",
"scope": "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly https://purl.imsglobal.org/spec/lti-ags/scope/score https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly",
"https://purl.imsglobal.org/spec/lti-tool-configuration": {
"domain": "{tool-base-url}",
"messages": [
{
"type": "LtiDeepLinkingRequest",
"target_link_uri": "https://{tool-base-url}/lti1.3/target",
"placements": ["https://{canvas-base-url}/lti/link_selection"]
},
{
"type": "LtiResourceLinkRequest",
"target_link_uri": "https://{tool-base-url}/lti1.3/target",
"placements": ["https://{canvas-base-url}/lti/account_navigation"]
},
{
"type": "LtiResourceLinkRequest",
"target_link_uri": "https://{tool-base-url}/lti1.3/target",
"placements": ["https://{canvas-base-url}/lti/course_navigation"]
}
],
"claims": ["iss", "sub", "name", "given_name", "family_name"],
"target_link_uri": "https://{tool-base-url}/lti1.3/target",
"description": "Dynaic registration key for Tool Provider",
"https://{canvas-base-url}/lti/registration_config_url": "https://{canvas-base-url}/api/lti/registrations/24490000000000016/view"
}
}
In Canvas, we can not see/edit different tool configurations like (login URL, Target URL, JWK URL etc) from UI. For manually registered keys we can view and edit these values by editing a key from the developer key’s section. For a key created using Dynamic registration edit UI looks like this. We can only edit placements and a few permissions but can not view/edit tool URLs.
Dynamic registration steps for Blackboard
Go to Blackboard Developer site. https://developer.blackboard.com/portal/applications . Click the plus sign → Select Dynamic Registration
Blackboard opens an iframe where we can provide a dynamic registration endpoint as https://{tool-base-url}/lti1.3/register
The rest of the process is pretty much the same as the one explained for Canvas above. The only change we need to make is the message block in the above request where we had provided Canvas specific message. This message section can change from LMS to LMS. Here is a sample message for Blackboard
"messages": [
{
"type": "LtiDeepLinkingRequest",
"target_link_uri": "https://{tool-base-url}/lti1.3/target",
"message_type": "LtiDeepLinkingRequest"
}
Blackboard allows you to view and edit keys created using Dynamic Registration in the same way as the manual key. You will have to deploy the tool manually. One limitation of Blackboard is it doesn’t allow more than one tool from the same domain. This limitation is for manual as well as Dynamic Registration of the key.
Dynamic registration steps for Moodle
Login with Admin user to your Moodle account. Click on the Site Administration tab at the top.
Click on the Plugins tab under Site administration section.
In the Activity Modules section look for External tool. Click on the Manage Tools link
Moodle will open the “Add Tool” window.
Provide dynamic registration endpoint as https://{tool-base-url}/lti1.3/register
and click the “Add LTI Advantage” button.
The rest of the process is pretty much the same as the one explained for Canvas above. The only change we need to make is the message block in the above request where we had provided Canvas specific message. This message section can change from LMS to LMS. Here is a sample message for Moodle
"messages": [
{
"type": "LtiDeepLinkingRequest",
"target_link_uri": "https://{tool-base-url}/lti1.3/target"
}
Moodle allows you to view and edit keys created using Dynamic Registration in the same way as the manual key. The key created is not Active by default. You will have to activate the key manually. If Moodle finds a key from the same domain it asks the user if you want to update the existing key or create a new key for the same domain.
Conclusion :
Dynamic registration not only simplifies key registration but also reduces the chances of human errors that can occur while copying multiple URLs and settings. As this is standard provided by IMS Global, the Same key registration API works for all LMS systems that support Dynamic registration. There is a small message section that we can change for specific LMS.
Subscribe to my newsletter
Read articles from NonStop io Technologies directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

NonStop io Technologies
NonStop io Technologies
Product Development as an Expertise Since 2015 Founded in August 2015, we are a USA-based Bespoke Engineering Studio providing Product Development as an Expertise. With 80+ satisfied clients worldwide, we serve startups and enterprises across San Francisco, Seattle, New York, London, Pune, Bangalore, Tokyo and other prominent technology hubs.