Hallo,
ich versuche für eine Smartphone-App ein Skript zu schreiben, das auf Seiten eines geschützten Bereichs (Vertretungsplan einer Schule) zugreifen soll (bzw. gibt es die schon und sie muss aktualisiert werden).
Gerade verzweifle ich an der Authentifizierung.
Ich hole mir die Login-Seite mit dem Formular per HTTP GET REQUEST, setze alle Felder auf die entsprechenden Werte, sende sie per POST-Request und … bekomme wieder die alte Seite.
Außer username und password habe ich autologin, FORM_SUBMIT und REQUEST_TOKEN bei den POST-Daten mitgesendet.
Im Header des Request habe ich zudem den Referer gesetzt und darauf geachtet, dass sonst alle Header die gleichen sind wie bei der ersten Anfrage (Contao könnte ja misstrauisch sein, diese überprüfen und zu dem Schluss kommen, dass es zwei verschiedene Geräte sind). Außerdem habe ich alle Cookies mitgesendet (z.B. PHPSESSID).
Es macht keinen Unterschied, ob ich:
- ein falsches Passwort sende, oder nicht
- einen falschen Benutzer sende, oder nicht
- den Referer sende, oder nicht
- das REQUEST_TOKEN sende, oder nicht
Auch in der error.log finden sich keine Fehler.
Ein Herumprobieren mit browsertypischen Headern (User-Agent, Accept usw.) hat auch nichts gebracht.
Hab ich etwas Entscheidendes vergessen?
Die alte Smartphone App lief mit Contao 3.3 wunderbar. Mittlerweile läuft die Seite aber mit Contao 4.4 und es geht leider nicht mehr.
Ich habe leider nicht nachvollziehen können, wie die Authentifizierung intern läuft, sprich, was alles überprüft wird.
Vielleicht kann mir ja jemand behilflich sein.
Für den Fall, dass jemand mit meinem Python-Skript etwas anfangen kann:
Code:
#!/usr/bin/env python3
import requests
from lxml import html
url = "http://fsg.local/vertretungsplan.html" # meine lokale Entwicklungsumgebung
# Mein Versuch mit browsertypischen Headern – brachte nichts
defaultHeaders = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "de,en-US;q=0.7,en;q=0.3",
"Connection": "keep-alive",
"DNT": "1",
"Host": "fsg.local",
"Upgrade-Insecure-Requests": "1",
}
loginPage = requests.get(url, headers=defaultHeaders)
print(loginPage.text)
PHPSESSID = loginPage.cookies.get("PHPSESSID")
doc = html.fromstring(loginPage.text)
doc.make_links_absolute(url)
loginForm = doc.xpath('//form[@id="tl_login_12"]')[0]
FORM_SUBMIT = loginForm.xpath('//input[@name="FORM_SUBMIT"]')[0].value
REQUEST_TOKEN = loginForm.xpath('//input[@name="REQUEST_TOKEN"]')[0].value
target = loginForm.action
# Hier stehen die Autentifizerungsdaten der App
username = "USER"
password = "PASSW"
autologin = "1" # Die App meldet sich normalerweise selbst automatisch an (außer beim ersten mal)
# Wir ergänzen ein paar Header
requestHeaders = defaultHeaders
requestHeaders["Content-Type"] = "application/x-www-form-urlencoded"
requestHeaders["Referer"] = url
answerPage = requests.get(target, data={"FORM_SUBMIT": FORM_SUBMIT, "REQUEST_TOKEN": REQUEST_TOKEN, "username": username, "password": password, "autologin": autologin}, cookies=loginPage.cookies, headers=requestHeaders);
print(answerPage.text)
# loginPage.text und answerPage.text sind vollkommen identisch, abgesehen von einem eingebundenen Zufallsbild
Lesezeichen