This commit is contained in:
Markos Gogoulos
2025-12-28 14:33:51 +02:00
parent 3a40fc6d88
commit ef4ff9cb1d
2 changed files with 42 additions and 5 deletions

View File

@@ -8,14 +8,44 @@ import json
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
from django.core.cache import cache from django.core.cache import cache
from pylti1p3.request import Request
from pylti1p3.tool_config import ToolConfAbstract from pylti1p3.tool_config import ToolConfAbstract
class DjangoRequest(Request):
"""Django request adapter for PyLTI1p3"""
def __init__(self, request):
self._request = request
self._cookies = request.COOKIES
self._session = request.session
def get_param(self, key):
"""Get parameter from GET or POST"""
if self._request.method == 'POST':
return self._request.POST.get(key)
return self._request.GET.get(key)
def get_cookie(self, key):
"""Get cookie value"""
return self._cookies.get(key)
def is_secure(self):
"""Check if request is secure (HTTPS)"""
return self._request.is_secure()
@property
def session(self):
"""Get session"""
return self._session
class DjangoOIDCLogin: class DjangoOIDCLogin:
"""Handles OIDC login initiation""" """Handles OIDC login initiation"""
def __init__(self, request, tool_config, launch_data_storage=None): def __init__(self, request, tool_config, launch_data_storage=None):
self.request = request self.request = request
self.lti_request = DjangoRequest(request)
self.tool_config = tool_config self.tool_config = tool_config
self.launch_data_storage = launch_data_storage or DjangoSessionService(request) self.launch_data_storage = launch_data_storage or DjangoSessionService(request)
@@ -23,7 +53,7 @@ class DjangoOIDCLogin:
"""Get the redirect object for OIDC login""" """Get the redirect object for OIDC login"""
from pylti1p3.oidc_login import OIDCLogin from pylti1p3.oidc_login import OIDCLogin
oidc_login = OIDCLogin(self.request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) oidc_login = OIDCLogin(self.lti_request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage)
return oidc_login.enable_check_cookies().redirect(redirect_url) return oidc_login.enable_check_cookies().redirect(redirect_url)
@@ -33,6 +63,7 @@ class DjangoMessageLaunch:
def __init__(self, request, tool_config, launch_data_storage=None): def __init__(self, request, tool_config, launch_data_storage=None):
self.request = request self.request = request
self.lti_request = DjangoRequest(request)
self.tool_config = tool_config self.tool_config = tool_config
self.launch_data_storage = launch_data_storage or DjangoSessionService(request) self.launch_data_storage = launch_data_storage or DjangoSessionService(request)
@@ -40,7 +71,7 @@ class DjangoMessageLaunch:
"""Validate the LTI launch message""" """Validate the LTI launch message"""
from pylti1p3.message_launch import MessageLaunch from pylti1p3.message_launch import MessageLaunch
message_launch = MessageLaunch(self.request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) message_launch = MessageLaunch(self.lti_request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage)
return message_launch return message_launch

View File

@@ -30,7 +30,7 @@ from rest_framework.views import APIView
from files.models import Media from files.models import Media
from rbac.models import RBACMembership from rbac.models import RBACMembership
from .adapters import DjangoSessionService, DjangoToolConfig from .adapters import DjangoRequest, DjangoSessionService, DjangoToolConfig
from .handlers import ( from .handlers import (
apply_lti_roles, apply_lti_roles,
create_lti_session, create_lti_session,
@@ -85,10 +85,13 @@ class OIDCLoginView(View):
# Create tool config for this platform # Create tool config for this platform
tool_config = DjangoToolConfig.from_platform(platform) tool_config = DjangoToolConfig.from_platform(platform)
# Wrap Django request for PyLTI1p3
lti_request = DjangoRequest(request)
# Create OIDC login handler with session and cookie services # Create OIDC login handler with session and cookie services
session_service = DjangoSessionService(request) session_service = DjangoSessionService(request)
cookie_service = DjangoSessionService(request) # Using same service for cookies cookie_service = DjangoSessionService(request) # Using same service for cookies
oidc_login = OIDCLogin(request, tool_config, session_service=session_service, cookie_service=cookie_service) oidc_login = OIDCLogin(lti_request, tool_config, session_service=session_service, cookie_service=cookie_service)
# Redirect to platform's authorization endpoint # Redirect to platform's authorization endpoint
redirect_obj = oidc_login.enable_check_cookies().redirect(target_link_uri) redirect_obj = oidc_login.enable_check_cookies().redirect(target_link_uri)
@@ -138,10 +141,13 @@ class LaunchView(View):
# Create tool config # Create tool config
tool_config = DjangoToolConfig.from_platform(platform) tool_config = DjangoToolConfig.from_platform(platform)
# Wrap Django request for PyLTI1p3
lti_request = DjangoRequest(request)
# Validate JWT and get launch data # Validate JWT and get launch data
session_service = DjangoSessionService(request) session_service = DjangoSessionService(request)
cookie_service = DjangoSessionService(request) cookie_service = DjangoSessionService(request)
message_launch = MessageLaunch(request, tool_config, session_service=session_service, cookie_service=cookie_service) message_launch = MessageLaunch(lti_request, tool_config, session_service=session_service, cookie_service=cookie_service)
# Get validated launch data # Get validated launch data
launch_data = message_launch.get_launch_data() launch_data = message_launch.get_launch_data()