From 7c7fe6dfcb1efcd68f2152261b572fbf3c6a95f2 Mon Sep 17 00:00:00 2001 From: Sebastian Hedtrich Date: Sun, 16 Aug 2026 02:09:07 +0200 Subject: [PATCH] =?UTF-8?q?KI-Backend:=20Authorization-Header-Fix=20+=20TO?= =?UTF-8?q?DO-Erg=C3=A4nzungen=20(4.5.11-4.5.14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Login funktionierte, aber jede authentifizierte Folgeanfrage (Guthaben, KI-Anfrage) meldete fälschlich eine abgelaufene Anmeldung — viele Apache/PHP-FPM-Hosting-Setups reichen den Authorization-Header standardmäßig nicht an PHP durch. .htaccess erzwingt jetzt die Weiterleitung, db.php liest zusätzlich REDIRECT_HTTP_AUTHORIZATION/ getallheaders() als Fallback. AiBackendUrl auf die echte deployte Domain gesetzt. TODO.md: KI-Unterstützung auch für Stundenplanung (4.5.11), Frage zu einem console.claude.ai-Agent für Standardkontext vs. app-internem Standard-Prompt (4.5.12/4.5.13), sowie ein Planungsdiff für KI-Vorschläge auf Feldebene statt grober Neu/Geändert-Markierung (4.5.14). --- LehrerApp.Desktop/AppBootstrapper.cs | 2 +- TODO.md | 22 ++++++++++++++++++++-- ai-backend/.htaccess | 8 ++++++++ ai-backend/README.md | 16 ++++++++++++++++ ai-backend/db.php | 27 ++++++++++++++++++++++++++- 5 files changed, 71 insertions(+), 4 deletions(-) diff --git a/LehrerApp.Desktop/AppBootstrapper.cs b/LehrerApp.Desktop/AppBootstrapper.cs index 66dc4e0..d2de507 100644 --- a/LehrerApp.Desktop/AppBootstrapper.cs +++ b/LehrerApp.Desktop/AppBootstrapper.cs @@ -32,7 +32,7 @@ public static class AppBootstrapper /// editierbar, siehe Planungsdokument. Vor dem ersten produktiven Einsatz durch die tatsächlich /// deployte Domain ersetzen. /// - public const string AiBackendUrl = "https://REPLACE_ME.example.com/"; + public const string AiBackendUrl = "https://backapi.science-teaching.de/"; /// /// Vor gesetzt, wenn die Datenbank passwortgeschützt ist diff --git a/TODO.md b/TODO.md index 41f4b50..d4834d9 100644 --- a/TODO.md +++ b/TODO.md @@ -698,8 +698,26 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`: nicht-Desktop-Client (siehe `PlainEventStore`, `MapPlainSyncEndpoints`) — ein "Umplanung nötig"-Flag käme darüber rein und würde nach dem Sync als Hinweis/Badge an der betroffenen Stunde bzw. im Dashboard erscheinen, bis es am Desktop bearbeitet oder bewusst abgehakt wird. - ---- +- [ ] **4.5.11** KI-Unterstützung (4.5.9) auch für die Stundenplanung (Kapitel 4.3, `TimetableSlot`) + anbieten, nicht nur für Einheiten/Stunden im Verlaufsplan — z.B. Vorschläge beim Aufbau eines + neuen Stundenplans oder beim Ausgleich nach Änderungen. Gleiches Backend/gleiche Abrechnung + wie 4.5.9, aber eigenes Export/Import-Schema für die Stundenplan-Daten. +- [ ] **4.5.12** Offene Frage: Kann ein Agent/Project bei console.claude.ai eingerichtet werden, + um Standardinformationen (JSON-Schema, grundlegender Auftragskontext) dort dauerhaft zu + hinterlegen, statt sie bei jeder Anfrage über das eigene PHP-Backend mitschicken zu müssen? + Würde die Nutzer-Anweisung auf das eigentlich Fachliche reduzieren. +- [ ] **4.5.13** Alternative zu 4.5.12: statt eines extern gepflegten Agents ein app-interner + Standard-Prompt neben dem freien Nutzer-Prompt, der den grundlegenden Kontext (Schema, + Auftragsbeschreibung) automatisch mitliefert — der Nutzer muss ihn dann nicht jedes Mal + selbst formulieren. Ansatzweise bereits vorhanden (`ai-backend/plan.php`, `$systemPrompt`), + hier ginge es um eine bewusstere/erweiterte Ausgestaltung statt der aktuell schlanken Variante. +- [ ] **4.5.14** Planungsdiff: KI-Vorschläge (4.5.9) mit dem bereits Geplanten auf Feldebene + vergleichbar machen, nicht nur pauschal als "Neu"/"Geändert" markieren wie aktuell im + `AiAssistDialog`. Bei geänderten Stunden sollte sichtbar sein, was sich konkret unterscheidet + (Thema, einzelne Verlaufsplan-Phasen, Hausaufgabe, ...), und die Übernahme sollte sich sinnvoll + zusammenführen lassen — z.B. nur einzelne Phasen einer Stunde übernehmen statt zwingend die + ganze Stunde, oder eigene zwischenzeitliche Änderungen nicht versehentlich überschreiben, + falls sich die Einheit seit dem Absenden der Anfrage schon geändert hat. ## 5. Schülerdokumentation diff --git a/ai-backend/.htaccess b/ai-backend/.htaccess index 42bfd7a..a08ad61 100644 --- a/ai-backend/.htaccess +++ b/ai-backend/.htaccess @@ -17,3 +17,11 @@ RewriteEngine On RewriteRule ^providers/ - [F,L] RewriteRule ^scripts/ - [F,L] + +# Viele Apache/PHP-FPM-Setups reichen den Authorization-Header standardmäßig NICHT an PHP durch +# (login.php funktioniert dann, aber jede Anfrage mit Bearer-Token danach schlägt fehl, weil der +# Header bei PHP leer ankommt). Diese Zeile erzwingt die Weiterleitung — zusammen mit dem +# Mehrquellen-Fallback in db.php (ai_backend_authorization_header) deckt das die gängigen +# Hosting-Varianten ab. +RewriteCond %{HTTP:Authorization} ^(.+)$ +RewriteRule .* - [E=HTTP_AUTHORIZATION:%1] diff --git a/ai-backend/README.md b/ai-backend/README.md index 5d81960..ee5d9ae 100644 --- a/ai-backend/README.md +++ b/ai-backend/README.md @@ -78,6 +78,22 @@ curl http://localhost:8000/status.php -H "Authorization: Bearer $value) { + if (strcasecmp($name, 'Authorization') === 0) { + return $value; + } + } + } + return ''; +} + /** * Bearer-Token aus dem Authorization-Header lesen, gegen tokens.token_hash prüfen * (SHA-256, der Klartext wird nie gespeichert) und den zugehörigen aktiven User zurückgeben. @@ -20,7 +45,7 @@ function ai_backend_db(array $config): PDO */ function ai_backend_authenticate(PDO $pdo): array { - $header = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; + $header = ai_backend_authorization_header(); if (!preg_match('/^Bearer\s+(.+)$/i', $header, $m)) { ai_backend_fail(401, 'Kein gültiges Token übermittelt.'); }