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 django.core.cache import cache
from pylti1p3.request import Request
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:
"""Handles OIDC login initiation"""
def __init__(self, request, tool_config, launch_data_storage=None):
self.request = request
self.lti_request = DjangoRequest(request)
self.tool_config = tool_config
self.launch_data_storage = launch_data_storage or DjangoSessionService(request)
@@ -23,7 +53,7 @@ class DjangoOIDCLogin:
"""Get the redirect object for OIDC login"""
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)
@@ -33,6 +63,7 @@ class DjangoMessageLaunch:
def __init__(self, request, tool_config, launch_data_storage=None):
self.request = request
self.lti_request = DjangoRequest(request)
self.tool_config = tool_config
self.launch_data_storage = launch_data_storage or DjangoSessionService(request)
@@ -40,7 +71,7 @@ class DjangoMessageLaunch:
"""Validate the LTI launch message"""
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

View File

@@ -30,7 +30,7 @@ from rest_framework.views import APIView
from files.models import Media
from rbac.models import RBACMembership
from .adapters import DjangoSessionService, DjangoToolConfig
from .adapters import DjangoRequest, DjangoSessionService, DjangoToolConfig
from .handlers import (
apply_lti_roles,
create_lti_session,
@@ -85,10 +85,13 @@ class OIDCLoginView(View):
# Create tool config for this 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
session_service = DjangoSessionService(request)
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_obj = oidc_login.enable_check_cookies().redirect(target_link_uri)
@@ -138,10 +141,13 @@ class LaunchView(View):
# Create tool config
tool_config = DjangoToolConfig.from_platform(platform)
# Wrap Django request for PyLTI1p3
lti_request = DjangoRequest(request)
# Validate JWT and get launch data
session_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
launch_data = message_launch.get_launch_data()