enhancement
major
minor
defect
critical
major
minor
major
#30125
Agent-Zugriff: /agent-api antwortet auf eine Anfrage ohne gültige Anmeldedaten mit einer Weiterleitung zur Anmeldeseite statt mit einem 401-Fehler.
Siehe auch: #30048 (Folgemaßnahmen zum Agentenzugriff).
Verhalten (8.0.0-alpha12)
Eine Anwendung, die auf tl-layout-view-agent basiert (hier E-Home, gestartet mit exec:java, Jetty 12.1). Eine Anfrage an den Agent-Endpunkt mit einem gefälschten, abgelaufenen oder fehlenden Bearer-Token:
curl -s -D - -o /dev/null -H "Authorization: Bearer tlagt_x_forged" http://localhost:8080/ehome/agent-api/windows HTTP/1.1 302 Found Location: /ehome/view/?sessionCheckInProgress=true
Das Gleiche ohne „Authorization“-Header liefert ebenfalls einen 302-Status. Ein gültiges Token liefert einen 200-Status mit {"windows": [...]}.
Erwartet
Im Artikel „view-layer/agent-access“ heißt es: „Die Anmeldedaten einer beendeten Sitzung gewähren niemandem Zugriff (401)“, und AgentServlet sendet SC_UNAUTHORIZED „Keine Sitzung.“ zurück, wenn es keine Sitzung findet. Die Antwort kommt nie an: Die Sitzungsprüfung von TopLogicServlet (SESSION_CHECK, sessionCheckInProgress) leitet zuerst weiter, da die Anfrage kein Sitzungs-Cookie enthält.
Ein Agent ist kein Browser: Er folgt der Weiterleitung, erhält den HTML-Code der Ansichtsseite mit dem Status 200 und muss anhand des Content-Types erraten, dass er nicht zugelassen wurde. Der Endpunkt sollte jede Anfrage, die er nicht zulässt, mit 401 (und einem JSON {"error": ...} wie bei seinen anderen Fehlern) ohne Weiterleitung beantworten, damit ein Client „Token nicht akzeptiert“ von einem Serverfehler unterscheiden kann.
Reproduktion
Beliebige Anwendung mit tl-layout-view-agent, ohne Anmeldung: curl -i <app>/agent-api/windows → 302 zu /view/?sessionCheckInProgress=true.
Die Ablehnung selbst ist unbedenklich (es werden keine Daten übermittelt); lediglich der Status ist falsch. Der Integrationstest von #30048 (6.) sollte dies abdecken.
Lösung
AgentServlet nutzt den vorhandenen Einstiegspunkt von TopLogicServlet (wie ReactServlet und AJAXServlet):
- isCookieCheckRequired() liefert „false“: Der Cookie-Test ist nur für die Navigation eines Browsers sinnvoll, ein Agent kann ihn nicht bestehen.
- handleNoSession() antwortet mit 401 und dem JSON-Fehlerobjekt {"error": ...} des Endpunkts, ohne Weiterleitung. Ohne diese Überschreibung endete eine Anfrage ohne Session nach dem Abschalten des Tests mit einer leeren Antwort 200.
Eine Anfrage mit Session-Cookie (Browser) ist davon nicht betroffen. Ein ServletUnit-Test prüft: kein Authorization-Header, gefälschtes Token und Token einer beendeten Sitzung werden jeweils mit 401, JSON-Rumpf und ohne Location beantwortet. Der Artikel view-layer/agent-access beschreibt die Antwort. Übrigens: Die JavaDoc von SignedInContentServlet behauptete, der Cookie-Test sei nicht deaktivierbar; sie nennt nun isCookieCheckRequired() und den eigentlichen Grund, ihn dort beizubehalten.