[Python-de] Authentifizierung bei https
"Martin v. Löwis"
martin at v.loewis.de
Sam Mar 12 14:41:35 CET 2005
Dinu Gherman wrote:
> Ich moechte gern "hoeherwertigen" Zugriff auf meine Bank- und Telefondaten
> online bekommen. An diese komme ich meist ueber https heran (in Python wohl
> ueber urllib2), aber ich habe mich noch nicht soweit darin vertieft, wie
> man da die Authentifizierung selbst vornimmt, ob man noch irgendein
> zusaetzliches SSL-Modul braucht, etc? Vielleicht hat jemand ja schon eigene
> Erfahrung in diesem Bereich gesammelt?
Das hängt ganz vom Service ab. Wenn man auf diesen Service mit
Nutzername und Passwort zugreift, muss man das verwenden; wenn
er X.509-Zertifikate verwendet, muss man die benutzen. Wenn es
Passwörter sind, braucht man vielleicht Basic Authentification,
vielleicht gibt es aber auch ein Login-Formular, woraufhin man
dann ein Cookie erhält.
Für den Fall von Zertifikaten funktioniert folgender Code
import httplib
h = httplib.HTTPSConnection("localhost",
key_file="key.pem",
cert_file="cert.pem")
h.connect()
h.putrequest("GET", "/cgi-bin/env")
h.endheaders()
r = h.getresponse()
print r.read()
Ob Du da mit urllib draufzugreifen kannst, hängt ebenfalls vom Dienst
ab; im Zweifelsfall würde ich immer httplib direkt verwenden.
Ein konkretes Beispiel:
https://ww2.homebanking-berlin.de/cgi/anfang.cgi/Berliner_Sparkasse
bringt ein Formular hoch, was man mit Kontonummer und PIN ausfüllen
muss. Aus dem Quelltext der Seite geht hervor, dass man das ganze
an
https://ww2.homebanking-berlin.de/cgi/login.cgi/Berliner_Sparkasse
per HTTP-POST senden soll. Die Konto-Nummer muss man dabei im
Feld KtoNr und die PIN im Feld PIN absenden.
Dieses Scenario ist von urllib unterstützt; man schreibt dazu
x=urllib.urlopen("https://ww2.homebanking-berlin.de/cgi/login.cgi/Berliner_Sparkasse",
urllib.urlencode({'KtoNr':'12345','PIN':'4567'}))
Ich kann leider nicht ausprobieren, was da normalerweise zurückkommt;
diese Anfrage produziert natürlich eine Fehlerseite.
Vermutlich sollte x.headers["Set-Cookie"] vorhanden sein, welches
man dann im weiteren immer wieder mitsenden muss. Dazu kann man in
2.4 cookielib benutzen; alternativ unterstützt
urllib2.HTTPCookieProcessor Cookies transparent. Den eigentlichen
Inhalt der Seite bekommt man mit x.read().
Ciao,
Martin