Hintergrundlogin HTTPs Webform

Negord

Mitglied
Guten Tag,

ich bin langsam mit meinem Java am Ende :(
Ich versuche für eine Androidapp mich mit den gegebenen Logininformationen anzumelden (userID und userPW). Nach der Anmeldung soll (alles im Hintergrund natürlich) man auf die Webseite mit den Klausurergebnissen weitergeleitet und der Code geladen werden.

An sich funktioniert alles, nur das einloggen/eingeloggt bleiben (weiß nicht, was er nicht schafft) nicht.
Als Vorlage habe ich das hier genommen und quasi 1:1 an meine Bedürfnisse angepasst.

Code ist:
Java:
/**
 * Created by p.m on 06.07.2014.
 */
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HttpUrlConnectionExample {
    private List<String> cookies;
    private HttpsURLConnection conn;

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        String url = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1";
        String gmail = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1";

        HttpUrlConnectionExample http = new HttpUrlConnectionExample();

        // make sure cookies is turn on
        CookieHandler.setDefault(new CookieManager());

        // 1. Send a "GET" request, so that you can extract the form's data.
        String page = http.GetPageContent(url);
        String postParams = http.getFormParams(page, "HIERUSERID", "HIERUSERPW");
        //USERID und USERPW werden später durch Variablen ersetzt.

        // 2. Construct above post's content and then send a POST request for
        // authentication
        http.sendPost(url, postParams);

        // 3. success then go to gmail.
        String result = http.GetPageContent(gmail);
        System.out.println(result);
    }

    private void sendPost(String url, String postParams) throws Exception {

        URL obj = new URL(url);
        conn = (HttpsURLConnection) obj.openConnection();

        // Acts like a browser
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
        conn.setRequestProperty("Accept-Language", "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
        conn.setRequestProperty("Cache-Control", "max-age=0");
        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Content-Length", Integer.toString(postParams.length()));
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        for (String cookie : this.cookies) {
            conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
        }
        conn.setRequestProperty("Host", "cis.nordakademie.de");
        conn.setRequestProperty("Origin", "https://cis.nordakademie.de");
        conn.setRequestProperty("Referer", "https://cis.nordakademie.de/");
        conn.setRequestProperty("User-Agent", USER_AGENT);

        conn.setDoOutput(true);
        conn.setDoInput(true);

        // Send post request
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(postParams);
        wr.flush();
        wr.close();

        int responseCode = conn.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + postParams);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in =
                new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        // System.out.println(response.toString());

    }

    private String GetPageContent(String url) throws Exception {

        URL obj = new URL(url);
        conn = (HttpsURLConnection) obj.openConnection();

        // default is GET
        conn.setRequestMethod("GET");

        conn.setUseCaches(false);

        // act like a browser

        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language","de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
        if (cookies != null) {
            for (String cookie : this.cookies) {
                conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
            }
        }
        int responseCode = conn.getResponseCode();

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in =
                new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // Get the response cookies
        setCookies(conn.getHeaderFields().get("Set-Cookie"));

        return response.toString();

    }

    public String getFormParams(String html, String username, String password)
            throws UnsupportedEncodingException {

        System.out.println("Extracting form's data...");

        Document doc = Jsoup.parse(html);

        // LoginDIV form id
        Element loginform = doc.getElementById("c217");

        //NEU
        Elements inputElements = loginform.getElementsByTag("input");
        //
        List<String> paramList = new ArrayList<String>();
        for (Element inputElement : inputElements) {
            String key = inputElement.attr("name");
            String value = inputElement.attr("pass");

            if (key.equals("user"))
                value = username;
            else if (key.equals("pass"))
                value = password;
            //Testweise
            else if(key.equals("submit"))
                value = "Anmelden";
            else if(key.equals("logintype"))
                value = "login";
            else if(key.equals("pid"))
                value = "2";
            else if(key.equals("redirect_url"))
                value = "";

            paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8"));
        }

        // build parameters list
        StringBuilder result = new StringBuilder();
        for (String param : paramList) {
            if (result.length() == 0) {
                result.append(param);
            } else {
                result.append("&" + param);
            }
        }
        return result.toString();
    }

    public List<String> getCookies() {
        return cookies;
    }

    public void setCookies(List<String> cookies) {
        this.cookies = cookies;
    }


}
(Natürlich werden noch Variablen geändert/entfernt/einiges Umgebaut, ich will es erstmal am laufen haben)
Die beiden links oben (url & gmail) sind die gleichen, da man bei der immer auf die Startseite kommt, außer man ist angemeldet.
Im Anhang ein Bild des Anmeldeverkehrs (jedoch fehlt bei Cookies ein PHPSessionID-kram).
Beim Debuggen fehlt mir aber der auf dem Bild abgebildete lmdata ... Cookie.

Als Ausgabe bekomme ich übrigens:
Sending 'GET' request to URL : https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1
Response Code : 200
Extracting form's data...

Sending 'POST' request to URL : https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1
Post parameters : user=USERID&pass=USERPW&submit=Anmelden&logintype=login&pid=2&redirect_url=
Response Code : 200

Sending 'GET' request to URL : https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/?no_cache=1
Response Code : 200
<!DOCTYPE html ...und Restcode von der STARTSEITE ...>

Wenn ich nicht korrekte Daten bei UserID und UserPW eingebe, bekomme ich beim ausführen einen 401 Fehler (er muss also im Loginprozess drinne sein).

Über Vorschläge wäre ich dankbar :)

Grüße,

Negord
 

Anhänge

  • netzwerkprotokoll.PNG
    netzwerkprotokoll.PNG
    108 KB · Aufrufe: 44

Negord

Mitglied
Okay, ein Kollege konnte mir helfen.
Sieht so aus:
Java:
import java.io.IOException;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;


public class GetData {

	public String getData(String login, String pw) throws Exception {
		
		String username = login;
        String password = pw;
		String loginUrl = "https://cis.nordakademie.de/index.php";
		String pruefungsergebnisseUrl = "https://cis.nordakademie.de/pruefungsamt/pruefungsergebnisse/";
		
		Connection.Response htmlCisMainPageAfterLogin = Jsoup.connect(loginUrl)
			    .data("user", username, "pass", password, "logintype", "login", "pid", "2", "redirect_url", "", "submit", "Anmelden")
			    .method(Method.POST)
			    .execute();
		
			//debug
			//Document doc = htmlCisMainPageAfterLogin.parse();
			
			Map<String, String> cisCookies = htmlCisMainPageAfterLogin.cookies();

			//Warte 3 Sekunden, damit der Webserver nicht bemerkt, dass der Prozess automatisiert ist ;)
			//Thread.sleep(3000);
			
			Document htmlPruefungsergebnisse = Jsoup.connect(pruefungsergebnisseUrl)
				    .cookies(cisCookies)
				    .get();
			
			return htmlPruefungsergebnisse.html();
	}

}
(für alle die etwas in der Art suchen).

Mein jetziges Problem: (ich hab die 3 Sekunden schon rausgenommen)
Wenn man das gekapselt ausführt dauert es ca. 3 Sekunden bis man den Webseitenquelltext hat.
Wenn ich das in Android ausführe als einzelnen Thread, dauert es ca. 27 Sekunden lt. Onlinestoppuhr.

Zum Aufrufen sieht es aktuell so aus:
Java:
private String data = "";
    private void networkMethod()
    {
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    GetData gd = new GetData();
                    data = gd.getData(loginTxt,pwTxt);
                } catch (Exception e){
                    System.out.println(e);
                }
            }
        });

        thread.start();

        System.out.println(data);
    }

Jemand eine Idee?

Grüße,

Negord
 

Anti-Banane2

Gesperrter Benutzer
ich würde behaupten das entweder der server so lange braucht oder was mit der verbindung nicht hinhaut

wie bereits erwähnt : setze dich bitte mit dem zuständigen admin in verbindung ... wir KÖNNEN dir hier einfach nicht helfen weil wir keine login-daten haben um entsprechend selbst was zu testen bzw deinen code nachvollziehen zu können

oder einfacher : wir können dein problem auf grund nicht vorhandener login-daten nicht nachvollziehen
 

Negord

Mitglied
Mir ist klar das man die Funktion ohne Logindaten nicht testen kann, aber man kann doch wenigstens sagen ob der Grundaufbau stimmt, bspw. eben mit dem Thread.

Und ich schrieb ja schon: Wenn man die Loginmethode gekapselt, also einzeln ohne App&Co laufen lässt,
dann dauert das ganze 3 Sekunden. Anders 30 Sekunden, obwohl ich da nicht viel anders mach außer es eben im Thread laufen zu lassen.

Aber okay, trotzdem danke :)
 

Anti-Banane2

Gesperrter Benutzer
gib mir login-daten und ich kanns tracen ob halt die antwort vom server so lange dauert oder ob dein code schrott ist ... aber wenn ich nur n standard-response bekomme kann ichs nich prüfen
außerdem sollte man mal beim admin nachfragen was da im backend läuft
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
G localhost im Backend https vs. http Netzwerkprogrammierung 9
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
T Up- und Download mit https Netzwerkprogrammierung 14
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben