Swift 3 auf einer Website einloggen

TheWalkingJoke

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
414
Hallo zusammen,
wie kann ich mich über Swift 3 auf einer Website anmelden, damit ich den HTML Code von der Nachfolgenden Seite kopieren kann? Dass mit dem kopieren habe ich schon, allerdings weiß ich nicht wie ich das mit dem Login machen kann.
 
Naja, über Post-Request wahrscheinlich indem du entsprechende Variablen übergibst. Kann von Webseite zu Webseite unterschiedlich sein.
 
Bitte schreib das relevante POST Formular hier rein.
 
Code:
        var request = URLRequest(url: URL(string: urlString)!)
        request.httpMethod = "POST"
        let postString = "Benutzername=bName&Passwort=pw"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) {data, response, error in
            guard let data = data, error == nil else{
                print("error=\(response)")
                return
            }
        
            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200{
                print("statuscode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }
            
            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(responseString)")
        }
        task.resume()


Ich kriege dann folgende Fehlermeldung:

Code:
statuscode should be 200, but is 401
response = Optional(<NSHTTPURLResponse: 0x17022b1e0> { URL: http://www.hag-lengerich.de/VPlan/subst_001.htm } { status code: 401, headers {
    Connection = "Keep-Alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 347;
    "Content-Type" = "text/html; charset=iso-8859-1";
    Date = "Sat, 25 Feb 2017 11:48:02 GMT";
    "Keep-Alive" = "timeout=5, max=19999";
    Server = "Apache/2.2.22 (Ubuntu)";
    Vary = "Accept-Encoding";
    "Www-Authenticate" = "Basic realm=\"Restricted Area\"";
} })
responseString = Optional("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>401 Authorization Required</title>\n</head><body>\n<h1>Authorization Required</h1>\n<p>This server could not verify that you\nare authorized to access the document\nrequested.  Either you supplied the wrong\ncredentials (e.g., bad password), or your\nbrowser doesn\'t understand how to supply\nthe credentials required.</p>\n<hr>\n<address>Apache/2.2.22 (Ubuntu) Server at www.hag-lengerich.de Port 80</address>\n</body></html>\n")
 
bei dem ordner in der fehlermeldung handelt es sich um ein mit basic auth geschuetztes verzeichnis. das hat erst mal nicht viel mit formularen/post requests zu tun. dazu schau dir bitte das hier an.
 
bog schrieb:
bei dem ordner in der fehlermeldung handelt es sich um ein mit basic auth geschuetztes verzeichnis. das hat erst mal nicht viel mit formularen/post requests zu tun. dazu schau dir bitte das hier an.

Habe ich auch ausprobiert. Wenn der nachher den HTML Code ausgeben soll kriege ich wieder den von der Authorization Required Seite
 
wuerde an der stelle mit wireshark je einen request im browser und einen ueber dein programm durchfuehren und schauen, inwieweit die sich unterscheiden.
 
Wenn ich das Programm wie bei dir Starte, und dann den Button drücke(für Login und Code Filtern), dann öffnet sich am Mac auch ein Debug Fenster. Hat das was zu bedeuten?
 
kA von macs. eigentlich reicht es, auf dem netzwerkadapter einen kompletten mitschnitt zu starten und dann im filterfeld oben "ip.addr == 89.191.78.110" einzugeben. dann solltest du in der liste eine info-spalte mit "GET / HTTP1.1" stehen haben, rechtsklick ->folgen -> HTTP stream. was du dann in einem neuen fenster angezeigt bekommst sind die request-header (rot), response-header und der response body (blau).

das machste einmal fuer den programmatischen aufruf und einmal fuer den aus dem browser und vergleichst dann die request-header. insbesondere das verhalten des Authorization-headers wird interessant sein.
 
bog schrieb:
kA von macs. eigentlich reicht es, auf dem netzwerkadapter einen kompletten mitschnitt zu starten und dann im filterfeld oben "ip.addr == 89.191.78.110" einzugeben. dann solltest du in der liste eine info-spalte mit "GET / HTTP1.1" stehen haben, rechtsklick ->folgen -> HTTP stream. was du dann in einem neuen fenster angezeigt bekommst sind die request-header (rot), response-header und der response body (blau).

das machste einmal fuer den programmatischen aufruf und einmal fuer den aus dem browser und vergleichst dann die request-header. insbesondere das verhalten des Authorization-headers wird interessant sein.

Verstehe aber nicht ganz was das bringt. Ich kenne ich mit Swift nicht so gut aus. Gibt es nicht eine einfache Möglichkeit, dass ich mich auf der Website einlogge?

Du kannst dir ja mal die Einlogierte angucken: Link
 
ich kenne mich mit swift gar nicht aus. aber das ist auch nebensaechlich, da dein problem eher bei webbasierter loginabfrage liegt, mit der ich mich wiederum ein wenig auskenne. der link den du gepastet hast verlangt credentials im format der HTTP Basic Auth.

da du dich vmtl. mit dem browser problemlos einloggen kannst, kannst du dir auf http-ebene (mit wireshark) anschauen, was der browser richtig macht. wenn du diesen mitschnitt dann mit deinem programm vergleichst, wo du eigentlich alles korrekt angegeben hast, das aber nicht funktioniert, kannst du herausfinden, woran das liegt.

als beispiel dafuer gilt z.b. direkt der header, der gesetzt wird, wenn dein browser die o.g. http basic auth credentials an den server sendet. da hast du dann naemlich eine zeile, die in etwa so (vgl. wiki-link) aussieht:
Code:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
"QWxhZGRpbjpPcGVuU2VzYW1l" ist dabei der base64-encodierte string "<username>:<password>". diese rueckkonvertierung kannst du z.b. auf https://www.base64decode.org/ vornehmen, und der dekodierte string lautet "Aladdin:OpenSesame".

auf demselben weg solltest du dir jetzt anschauen, was fuer einen header dein programm an den server schickt, und wenn dieser (oder andere, dann relevante) header sich unterscheiden kannst du herausfinden, was genau schief laeuft.

was mir beim zuvor von SO verlinkten link z.b. einfaellt, ist dass meiner erinnerung nach die username/password parameter urlencodiert werden, wobei z.b. in emailadressen das "@" zu einem "%40" wird, was offensichtlich in unterschiedlichen base64-encodierten authorization headern resultieren wuerde.

aber stell doch erst mal fest, dass die dumps von browser/programm tatsaechlich unterschiedliche ergebnisse liefern.
 
Zurück
Oben