The integration of OctoProctor's proctoring system with Open edX is carried out using IMS LTI technology.
A valid SSL certificate must be installed on the web server for Open edX pages to open over HTTPS. This is a requirement of the browser security policy, which does not allow access to the camera and microphone over an unsecured HTTP protocol.
A free Let's Encrypt SSL certificate can be issued. You can check the validity of the certificate on the server using SSLChecker.com.
The assessment page opens in the proctoring system's IFRAME after a proctoring session is started. In order for the page to open correctly in IFRAME on the Open edX web server, the Content-Security-Policy and X-Frame-Options headers on the assessment pages must be properly configured (or not passed at all). Chrome 80+ also made changes to the Set-Cookie policy, which for cross-domain cookies requires the addition of two parameters "SameSite=None" and "Secure".
In this tutorial, the browser's cross-domain security policy restriction is bypassed by placing the SDK code on the Open edX course page. It is therefore not necessary to change the web server settings.
Before using the LTI proctoring tool in a course, the LTI tools must be enabled in Open edX Studio. A full description of LTI settings can be found in the edX documentation.
To enable LTI tools in Studio, you need to do the following:
In the main menu open "Settings" → "Advanced Settings"
.
In the field "Advanced Module List" add an element "lti_consumer", if you have multiple elements please separate them using comma symbols.
Save your settings using the button "Save Changes".
Proctoring requires the transmission of authentication data (client key and secret key). These data are issued for each proctoring server where LTI integration is used and must be specified in the Studio settings.
The authentication parameters of the external LTI tool are specified as follows:
["your_lti_id:client_key:client_secret"]
, where:your_lti_id
— passport identifier (for example, "proctordu_lti", which is required to be specified when you add an LTI instrument to a course);client_key
— customer key (this is issued for a proctoring server separately);client_secret
— customer secret (this is issued for each proctoring server separately).Example: ["octoproctor_lti:demo:secret"]
Save your settings using the button "Save Changes".
The proctoring system opens course pages in IFRAME after running a proctoring session. To get around the browser security policy restrictions (cross-domain policy) associated with opening Open edX pages in IFRAME within proctoring, you need to run proctoring and Open edX on the same domain. To do this, you need to place the proctoring startup code (SDK) on one of the course pages. This can be done as follows:
From the main menu, go to "Content" → "Pages & Resources"
.
On the "Pages & Resources" view, press the "Custom pages" button to add a new page.
Open the page editor with the "EDIT" button.
Go to the editor settings with the "SETTINGS" button and specify the following values:
Save the settings with the "Save" button.
NOTE: You need to replace "demo.proctoring.app" with the domain of your proctoring server.
Save the direct link to the page you have created, you will need it when setting up the LTI tool. To do this, switch to "View Live" mode (Staff role), open the "Proctoring" page and copy the link from the address bar of your browser.
Convert this link to URL Encoding, you can do this online here. The result should be a string like this:
Original link: https://your-edx-server/courses/course-v1:edX+DemoX+Demo_Course/f282cfc230d04a14b31ac42df22daa1b/
Encoded link: https%3A%2F%2Fyour-edx-server%2Fcourses%2Fcourse-v1%3AedX%2BDemoX%2BDemo_Course%2Ff282cfc230d04a14b31ac42df22daa1b%2F
Select "Advanced" from the options in the new component selection menu.
Select "LTI Consumer" from the options provided.
Press "EDIT" on the settings panel of the LTI Consumer unit.
Next, in the component editor, fill in the fields as described:
https://demo.proctoring.app/api/auth/edx?redirect=``*<sdk-url>*
where "demo.proctoring.app"
— your proctoring server domain name, "<sdk-url>"
— the encoded link to the SDK code page that was previously created.It is usually necessary to limit the availability of the assessment item until the proctoring session is started. So that the participant cannot open the contents of the assessment item before the start of the proctoring session.
To do this, the following settings must be made in Studio (see documentation for a full description of the settings):
Settings → Advanced Settings
.Go to the proctoring element settings (LTI tool).
Enable the option "Make this subsection available as a prerequisite for other content" in the "Advanced" tab.
Go to the "Advanced" tab in the assessment item settings.
Specify the following parameters:
On the page of the proctoring item (LTI tool), users will see a button which, when clicked, will open the proctoring system page in the adjacent tab.
Users with the test-taker role will enter the proctoring session, where the assessment item page that was specified in the LTI tool settings in the user parameter "url" (or specified in the session template through the proctoring admin) will open in IFRAME.
Users with the role of instructor or administrator will enter the proctor's interface, where they can observe sessions of a given assessment and view protocols.
To connect the integration API with Open edX, you need to load the following config with integration parameters under the proctoring system manager:
JSON
{
"id": "<Host_ID>",
"key": "<License_Key>",
"params": {
"webhooks": {
"edx": {
"authorizer": "lti",
"integrator": "lti",
"consumerKey": "demo",
"consumerSecret": "secret",
"callbackURL": "query.redirect",
"profile": {
"username": "payload.user_id",
"role": "payload.roles.find(v=>/Instructor/.test(v))?'proctor':'student'",
"nickname": "payload.lis_person_name_full",
"lang": "(payload.launch_presentation_locale||'').slice(0,2)",
"group": "['G',payload.context_id,payload.resource_link_id].join('-')",
"referrer": "payload.launch_presentation_return_url",
"labels": "payload.lis_person_contact_email_primary"
},
"register": {
"identifier": "[payload.user_id,payload.context_id,payload.resource_link_id].join('-').replace(/[^A-Za-z0-9_-]+/g,'_')",
"template": "payload.custom_template||'default'",
"subject": "payload.resource_link_title",
"members": "payload.custom_members==='@'?user.group:payload.custom_members",
"url": "payload.custom_url||payload.launch_presentation_return_url",
"tags": "payload.lis_person_contact_email_primary"
},
"start": {
"score": "1"
},
"stop": {
"score": "0"
},
"pause": {
"score": "0"
},
"submit": {
"score": "room.conclusion?(room.conclusion==='positive'?0.999:0):Math.min((room.score||0)/100, 0.999)"
}
}
}
}
}
NOTE: the fields "consumerKey" and "consumerSecret" need to be replaced with a randomly generated sequence of characters (Latin letters of different case and numbers, the recommended length is 24 characters); "id" is the ID of the host (if you do not specify it, a new host will be created); "key" is the license key of this host.