This commit is contained in:
Markos Gogoulos
2026-01-29 15:18:15 +02:00
parent 095e4d2cb4
commit cc0f4d4645
2 changed files with 11 additions and 53 deletions

View File

@@ -82,7 +82,6 @@ class OIDCLoginView(View):
client_id = request.GET.get('client_id') or request.POST.get('client_id') client_id = request.GET.get('client_id') or request.POST.get('client_id')
login_hint = request.GET.get('login_hint') or request.POST.get('login_hint') login_hint = request.GET.get('login_hint') or request.POST.get('login_hint')
lti_message_hint = request.GET.get('lti_message_hint') or request.POST.get('lti_message_hint') lti_message_hint = request.GET.get('lti_message_hint') or request.POST.get('lti_message_hint')
media_friendly_token = request.GET.get('media_friendly_token') or request.POST.get('media_friendly_token')
cmid = request.GET.get('cmid') or request.POST.get('cmid') cmid = request.GET.get('cmid') or request.POST.get('cmid')
if not all([target_link_uri, iss, client_id]): if not all([target_link_uri, iss, client_id]):
@@ -110,10 +109,8 @@ class OIDCLoginView(View):
nonce = str(uuid.uuid4()) nonce = str(uuid.uuid4())
launch_data = {'target_link_uri': target_link_uri, 'nonce': nonce} launch_data = {'target_link_uri': target_link_uri, 'nonce': nonce}
# Store media token and cmid if provided (for filter-based launches) # Store cmid if provided (including 0 for filter-based launches)
if media_friendly_token: if cmid is not None:
launch_data['media_friendly_token'] = media_friendly_token
if cmid:
launch_data['cmid'] = cmid launch_data['cmid'] = cmid
session_service.save_launch_data(f'state-{state}', launch_data) session_service.save_launch_data(f'state-{state}', launch_data)
@@ -138,7 +135,6 @@ class OIDCLoginView(View):
# Debug logging for filter launches # Debug logging for filter launches
logger.error(f"[OIDC LOGIN DEBUG] Redirecting to: {redirect_url}") logger.error(f"[OIDC LOGIN DEBUG] Redirecting to: {redirect_url}")
logger.error(f"[OIDC LOGIN DEBUG] Has lti_message_hint: {bool(lti_message_hint)}") logger.error(f"[OIDC LOGIN DEBUG] Has lti_message_hint: {bool(lti_message_hint)}")
logger.error(f"[OIDC LOGIN DEBUG] Has media_friendly_token: {bool(media_friendly_token)}")
logger.error(f"[OIDC LOGIN DEBUG] cmid: {cmid}") logger.error(f"[OIDC LOGIN DEBUG] cmid: {cmid}")
return HttpResponseRedirect(redirect_url) return HttpResponseRedirect(redirect_url)
@@ -235,32 +231,11 @@ class LaunchView(View):
create_lti_session(request, user, message_launch, platform) create_lti_session(request, user, message_launch, platform)
# Check for media_friendly_token in custom claims # Check for media_friendly_token in custom claims (for both deep linking and filter launches)
media_token = custom_claims.get('media_friendly_token') media_token = custom_claims.get('media_friendly_token')
logger.error(f"[LTI LAUNCH DEBUG] media_token from custom_claims: {media_token}")
if media_token: if media_token:
logger.error(f"[LTI LAUNCH DEBUG] Found media_friendly_token in custom claims: {media_token}") logger.error(f"[LTI LAUNCH DEBUG] Found media_friendly_token in custom claims: {media_token}")
# Check if media token was passed via target_link_uri query parameter (from filter launch)
logger.error(f"[LTI LAUNCH DEBUG] About to check target_link_uri, media_token is: {media_token}")
if not media_token:
target_link_uri = launch_data.get('https://purl.imsglobal.org/spec/lti/claim/target_link_uri', '')
logger.error(f"[LTI LAUNCH DEBUG] target_link_uri: {target_link_uri}")
if '?media_token=' in target_link_uri or '&media_token=' in target_link_uri:
from urllib.parse import parse_qs, urlparse
parsed = urlparse(target_link_uri)
params = parse_qs(parsed.query)
media_token = params.get('media_token', [None])[0]
if media_token:
logger.error(f"[LTI LAUNCH DEBUG] Found media_token in target_link_uri: {media_token}")
# Store media_token in session for determine_redirect to use
if media_token:
request.session['filter_media_token'] = media_token
request.session.modified = True
logger.error(f"[LTI LAUNCH DEBUG] Stored media_token in session: {media_token}")
LTILaunchLog.objects.create(platform=platform, user=user, resource_link=resource_link_obj, launch_type='resource_link', success=True, claims=claims) LTILaunchLog.objects.create(platform=platform, user=user, resource_link=resource_link_obj, launch_type='resource_link', success=True, claims=claims)
redirect_url = self.determine_redirect(launch_data, resource_link_obj) redirect_url = self.determine_redirect(launch_data, resource_link_obj)
@@ -295,12 +270,9 @@ class LaunchView(View):
custom_path = '/' + custom_path custom_path = '/' + custom_path
return custom_path return custom_path
# Check custom claims for media token (from both deep linking and filter launches)
media_id = custom.get('media_id') or custom.get('media_friendly_token') media_id = custom.get('media_id') or custom.get('media_friendly_token')
# Also check session for media token (from filter-based launches)
if not media_id and hasattr(self, 'request'):
media_id = self.request.session.get('filter_media_token')
if media_id: if media_id:
try: try:
media = Media.objects.get(friendly_token=media_id) media = Media.objects.get(friendly_token=media_id)

View File

@@ -67,30 +67,16 @@ $instance->instructorchoicesendname = 1;
$instance->instructorchoicesendemailaddr = 1; $instance->instructorchoicesendemailaddr = 1;
$instance->launchcontainer = LTI_LAUNCH_CONTAINER_EMBED_NO_BLOCKS; $instance->launchcontainer = LTI_LAUNCH_CONTAINER_EMBED_NO_BLOCKS;
// Get type config // Set custom parameters to pass media token (like deep linking does)
// This will be included in the LTI custom claims JWT
$instance->instructorcustomparameters = "media_friendly_token=" . $mediatoken;
// Get type config (standard tool URL, no modifications needed)
$typeconfig = lti_get_type_type_config($ltitoolid); $typeconfig = lti_get_type_type_config($ltitoolid);
// Override the tool URL to include media token as query parameter
// This way MediaCMS receives it in the target_link_uri
if (is_array($typeconfig)) {
$baseurl = $typeconfig['toolurl'] ?? $mediacmsurl . '/lti/launch/';
$typeconfig['toolurl'] = $baseurl . '?media_token=' . urlencode($mediatoken);
if (isset($typeconfig['toolurl_secure'])) {
$baseurl_secure = $typeconfig['toolurl_secure'];
$typeconfig['toolurl_secure'] = $baseurl_secure . '?media_token=' . urlencode($mediatoken);
}
} else {
$baseurl = $typeconfig->toolurl ?? $mediacmsurl . '/lti/launch/';
$typeconfig->toolurl = $baseurl . '?media_token=' . urlencode($mediatoken);
if (isset($typeconfig->toolurl_secure)) {
$baseurl_secure = $typeconfig->toolurl_secure;
$typeconfig->toolurl_secure = $baseurl_secure . '?media_token=' . urlencode($mediatoken);
}
}
// Use Moodle's LTI launch function to initiate OIDC properly // Use Moodle's LTI launch function to initiate OIDC properly
// Pass null for cmid since we don't have a real course module // Pass 0 as dummy cmid since we don't have a real course module
$content = lti_initiate_login($course->id, null, $instance, $typeconfig, null, 'MediaCMS video resource'); $content = lti_initiate_login($course->id, 0, $instance, $typeconfig, null, 'MediaCMS video resource');
echo $OUTPUT->header(); echo $OUTPUT->header();
echo $content; echo $content;