Backend-Authentifizierung über HTTP POST Request

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
jeadorf
Beiträge: 2
Registriert: Do 19. Dez 2013, 14:51
Kontaktdaten:

Backend-Authentifizierung über HTTP POST Request

Beitrag von jeadorf »

Hallo,

Ich suche nach einer einfachen Möglichkeit mich via HTTP Post Request (beispielsweise mit Python) in ein Contenido Backend einzuloggen. Sprich, man schickt Benutzername und Passwort als Parameter einer POST-Anfrage mit und erhält dann in der Antwort des Servers ein Token. Mit letzterem kann man dann weitere Anfragen senden. Der Hintergrund ist, dass sich so eine Möglichkeit ergibt, das Backend von anderen Programmen aus anzusprechen. Als ersten Ansatz habe ich mir den Quelltext des Login-Formulars angesehen und die POST-Anfrage im Browser inspiziert (also eine Art von "Reverse Engineering"), aber auf die Schnelle ist mir das leider nicht gelungen, da mir der Login via POST trotz korrekten Benutzernamens, Passworts, und Zeitstempel aus irgendeinem Grunde nicht gelingt.
  • * username
    * password
    * vaction
    * formtimestamp
Mit etwas mehr Aufwand und Inspektion (z.B. Contenido-Quelltext) gelingt mir das sicherlich früher oder später. Ist der Authentifizierungsprozess irgendwo dokumentiert? Oder gibt es gar schon eine Schnittstelle (z.B. RESTful API)?

Julius
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Backend-Authentifizierung über HTTP POST Request

Beitrag von xmurrix »

Hallo jeadorf,

willkommen im CONTENIDO Forum.

Die Authentifizierung außerhalb des regulären Backend ist in CONTENIDO eigentlich nicht vorgesehen.

Dennoch kannst du mit ein paar kleineren Änderungen eine Authentifizierung hinbekommen.

Bei einer erfolgreichen Authentifizierung gibt es kein Token als Serverantwort aber du bekommst ein Cookie zurück und kannst diesen für jede weitere Anfrage verwenden, sofern dein Client mit Cookies umgehen kann.

Habe das bisher nicht gemacht, denke aber dass es folgendermaßen möglich sein sollte:

Zuerst solltest du den Backend-Authentication Handler aus dem Trunk verwenden, also die Datei class.auth.handler.backend.php von http://svn.dev.contenido.org/trunk/cont ... ackend.php holen und bei dir in contenido/classes/auth/ ablegen. Da gab es kürzlich eine Änderung, die dafür sorgt, dass fehlgeschlagene Login Requests über AJAX nicht das Loginformular ausgeben, sondern ein JSON String mit der entsprechenden Fehlermeldung.

Schicke ein POST-Request an das Script contenido/ajaxmain.php, der POST sollte die entsprechenden Werte haben, wie du schon beschrieben hast. Zusätzlich sollte der Request noch einen Parameter "ajax=1" enthalten.

Eine RESTful API gibt es nicht aber ich kann mich erinnern, dass es vor ein paar Jahren mal einen Artikel darüber gab, wie man in CONTENIDO einen auf SOAP basierenden Webservice implementiert.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
jeadorf
Beiträge: 2
Registriert: Do 19. Dez 2013, 14:51
Kontaktdaten:

Re: Backend-Authentifizierung über HTTP POST Request

Beitrag von jeadorf »

Hallo xmurrix,

Der Client ist mit Python Requests (http://docs.python-requests.org/en/latest/) geschrieben, laut Doku wird der Umgang mit Cookies unterstützt. Vielen Dank für die Skizze, wie ein Anmeldevorgang aussehen müsste. Warum ein ähnliche Versuch bei mir bis dato nicht funktioniert hatte (statt einer JSON habe ich probehalber das HTML nach der Fehlermeldung durchsucht und auf diese Art und Weise Feedback erhalten), ist mir noch nicht ganz klar. Vermutlich habe ich irgendwas falsch gemacht, aber ich gehe der Sache erstmal nicht weiter nach, da ich auf eine Alternativlösung gestoßen bin.

Als Quick&Dirty-Lösung habe ich das Einloggen mit Benutzername und Passwort im Python-Klienten durch die Eingabe der aus dem Browser kopierten Session-ID ersetzt. Wenn man sich erst im Browser einloggt, und die Session ID bei einem POST-Request vom Python-Klienten aus mitschickt (für das Hochladen eines Bildes vom Python-Klienten aus), dann komme ich auch zum Ziel. Wenn auch nicht besonders hübsch, so ist diese Lösung ist mir insofern recht, da sie billig und relativ robust gegenüber potenziellen Änderungen im Contenido-Backend ist. Damit gebe ich mich erstmal zufrieden.

Julius
Antworten