Hoffnungslos, einloggen ueber HTTPS Seite aber wie?

  • Antworten:43
Lucius
  • Forum-Beiträge: 32

22.09.2011, 20:35:50 via Website

Hallo Leute,

Ich benutze Eclipse Indigo IDE und moechte das Projekt ab Android 2.3.3 laufen lassen.
Das Ziel ist es um mich bei einer Seite einzuloggen um danach ein Teil der zweiten Seite in meine App anzeigen zu lassen.
Diese Seite benuetzt aber HTTPS , die method=post.

Ich bin schon Tage lang auf der Suche nach einer Loesung aber irgendwie steck Ich fest.
Ich moecht erstmal wissen ob das einloggen geklappt hat, der Wert wird ueber
1result.setText(str);
ausgegeben.

Koennte mir bitte mal jemand unter die Arme greifen und zeigen wie Ich weiter komme?
Folgende Code habe Ich schonmal:

1public void postLoginData() {
2 // Create a new HttpClient and Post Header
3 HttpClient httpclient = new DefaultHttpClient();
4
5 HttpPost httppost = new HttpPost("http://www.kpn.com/prive/mijnkpn/inloggen.htmt");
6
7 try {
8 // Add user name and password
9 EditText uname = (EditText)findViewById(R.id.txt_username);
10 String username = uname.getText().toString();
11
12 EditText pword = (EditText)findViewById(R.id.txt_password);
13 String password = pword.getText().toString();
14
15 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
16 nameValuePairs.add(new BasicNameValuePair("bla", username));
17 nameValuePairs.add(new BasicNameValuePair("BlaBla", password));
18 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
19
20 // Execute HTTP Post Request
21 Log.w("SENCIDE", "Execute HTTP Post Request");
22 HttpResponse response = httpclient.execute(httppost);
23
24 String str = inputStreamToString(response.getEntity().getContent()).toString();
25 Log.w("SENCIDE", str);
26
27 result.setText(str);
28
29 } catch (ClientProtocolException e) {
30 e.printStackTrace();
31 } catch (IOException e) {
32 e.printStackTrace();
33 }
34 }
35
36 private StringBuilder inputStreamToString(InputStream is) {
37 String line = "";
38 StringBuilder total = new StringBuilder();
39 // Wrap a BufferedReader around the InputStream
40 BufferedReader rd = new BufferedReader(new InputStreamReader(is));
41 // Read response until the end
42 try {
43 while ((line = rd.readLine()) != null) {
44 total.append(line);
45 }
46 } catch (IOException e) {
47 e.printStackTrace();
48 }
49 // Return full string
50 return total;
51 }
52
53 @Override
54 public void onClick(View view) {
55 if(view == ok){
56 postLoginData();
57 }
58 }
59
60}

Danke euch im voarus.
Lucius.

— geändert am 26.09.2011, 15:52:37

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 08:47:58 via Website

Naja entweder schaust du dir das an, was der Server zurückschickt (sucht nach Vorkommen einer bestimmten Meldung).
Oder Du guckst dir an welche Cookies nach dem POST im CookieStore des HTTPClient liegen.
Normalerweise sollten das hinreichende Kriterien sein, einen erfolgreichen Login festzustellen.

Hier findest Du auch einige Snippets zum Thema:
http://weblogs.java.net/blog/joshy/archive/2006/11/a_quick_intro_t.html

— geändert am 23.09.2011, 08:49:38

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 15:17:48 via Website

Hi Rafael,

Erstmal vielen Dank fuer deine Antwort.
Ich habe mal verscuht die Cookies von einer Seite zurueck zu bekommen aber sobald Ich auf den Button drueke, sehe Ich nichts.
Es kommt aber auch kein Fehler.
Kannst du dir das mal bitte angucken und eventuel korrigieren?

Danke im voraus.

1public void postLoginData() {
2 // Create a new HttpClient and Post Header
3 HttpClient httpclient = new DefaultHttpClient();
4
5 /* login.php returns true if username and password is equal to saranga */
6 HttpPost httppost = new HttpPost("https://accounts.google.com/ServiceLoginAutht");
7
8 try {
9 // Add user name and password
10 EditText uname = (EditText)findViewById(R.id.txt_username);
11 String username = uname.getText().toString();
12
13 EditText pword = (EditText)findViewById(R.id.txt_password);
14 String password = pword.getText().toString();
15
16 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
17 nameValuePairs.add(new BasicNameValuePair("usr_username", username));
18 nameValuePairs.add(new BasicNameValuePair("usr_password", password));
19 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
20
21 // Execute HTTP Post Request
22 // Log.w("SENCIDE", "Execute HTTP Post Request");
23 HttpGet httpget = new HttpGet("https://accounts.google.com/ServiceLoginAutht");
24 HttpResponse response = httpclient.execute(httpget);
25 HttpEntity entity = response.getEntity();
26
27 // String str = inputStreamToString(response.getEntity().getContent()).toString();
28 // Log.w("SENCIDE", str);
29
30 System.out.println("Initial set of cookies:");
31 List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
32 if (cookies.isEmpty()) {
33 System.out.println("None");
34 } else {
35 for (int i = 0; i < cookies.size(); i++) {
36 System.out.println("- " + cookies.get(i).toString());
37 }
38 }
39
40 //result.setText(str);
41
42 } catch (ClientProtocolException e) {
43 e.printStackTrace();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 15:54:52 via Website

Hi Rafael,

Ja im LogCat steht folgendes:
109-23 13:49:41.531: INFO/System.out(333): Initial set of cookies:
209-23 13:49:41.541: INFO/System.out(333): - [version: 0][name: GAPS][value: 1:jHH1pmE0huoapnypE4axT9t9Uc-4Rw:JzRlOlAyoz_78uLa][domain: accounts.google.com][path: /][expiry: Sun Sep 22 13:49:36 GMT+00:00 2013]
Cookies bekomme Ich schon aber zurueck oder?
Aber wie jetzt weiter?
Sorry das Ich dich nerve aber Ich probiere mein bestes.

Danke dir.
Gruss,
Lucius

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 16:02:54 via Website

Sieht aus wie ein Session Cookie, also OK.

Jetzt kommentier noch Zeile 27 ein, dort wird der Inhalt der Ergebnisseite ausgegeben.
Schau dir an was dort drin steht. Dort wirst du eine Meldung finden, ob der Login geklappt hat.
Genauer: Du siehst die Seite, die du bei einem Login im Browser auch sehen würdest.

— geändert am 23.09.2011, 16:04:12

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 16:19:12 via Website

Ok habe Ich folgendes kommt raus:

109-23 14:14:03.021: INFO/System.out(337): <html><head><title>Google Accounts</title><style type="text/css"> body {font-family: arial,sans-serif;} .body {margin: 0 15px; } div.errorbox-good {} div.errorbox-bad {} div.errormsg { color: red; font-size: smaller; font-family: arial,sans-serif;} font.errormsg { color: red; font-size: smaller; font-family: arial,sans-serif;} </style></head><body dir="ltr" bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000"><style type="text/css"> .aligns { text-align: right; } .margins { margin-left: 13px; } .floats-normal { float: left; } .floats-reverse { float: right; margin-top: 17px; }</style><div class="topbar aligns" style="font-size:smaller; margin-bottom:0 15px 1px 15px; white-space:nowrap;"><a href="http://www.google.com">Google Home</a>|<a href="https://accounts.google.com/Login">Sign in</a></div><div class="header margins" style="height: 40px; margin: 13px 15px 9px 15px;"><a href="https://accounts.google.com/"><img src="/googleaccountslogo/en.gif" border="0" class="floats-normal" alt="Google"></a></div><div style="clear:both;"></div><div class="body"><p>The page you requested is invalid.</p></div><div class="footer" style="color: #666; font-size: smaller; margin: 50px 15px 0 15px; text-align: center;">&copy;2011 Google-<a href="http://www.google.com">Google Home</a>-<a href="https://www.google.com/accounts/TOS?hl=en">Terms of Service</a>-<a href="http://www.google.com/intl/en/privacy.html">Privacy Policy</a>-<a href="http://www.google.com/support/accounts?hl=en">Help</a></div></body></html>

Ich sehe: The page you requested is invalid.
Hmm hat also nicht geklappt, ist ja auch eine https Seite seheh Ich gerade.
In meinen anderen Beitrag https://www.nextpit.de/de/android/forum/thread/437829/Loesung-zu-HTTPS habe Ich einen Code gefunden wobei du dich auch auf eine https Seite einloggen kannst.
Ich weiss diesen aber nicht einzusetzen, sprich meine Parameter (link, user, pass etc) zu uebergeben.

Gruss,
Lucius

— geändert am 23.09.2011, 16:24:31

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 16:36:21 via Website

Also Ich habe die Adresse aus dem sourcecode der Webseite van GMail.
Ich habe die von den Type "action=" genommen, Ich dachte die muss man nehmen um den Login vorzutaueshen.
1<form id="gaia_loginform" action="https://accounts.google.com/ServiceLoginAuth" method="post">
2<input type="hidden"

Wenn Ich die Adresse der Homepage von GMail nehme ist das diese hier:
1https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&ltmplcache=2&from=login

— geändert am 23.09.2011, 16:36:40

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 17:08:31 via Website

So habe jetzt nochmal alles doppeltgecheckt.
Der richtige Trigger ist:
1https://accounts.google.com/ServiceLoginAuth

Ich bekomme aber wieder als html die erst Seite zurueck, also war der Login nicht korrekt.
Hat das nichts mit dem https zu tun?
Hast du ein Vorschlag wie Ich die https umgehen kann?

Danke dir.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 17:13:37 via Website

Ich guck mir das Formular mal an wenn ich zu Hause bin.
Was auch noch helfen kann: Die Seite auf der das Formular ist einmal vorher mit demselben httpclient laden, weil die manchmal auch cookies setzt, die der login abfragt.
Ansonsten können auch die hidden Felder wichtig sein und man muss die mit übermitteln.

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 17:23:03 via Website

Ok, schonmal vielen Dank.

Ich werde mal weiterprobieren, vielleicht komm Ich ja auch schon etwas weiter.
PS: die GMail Seite war eigentlich nur um zu testen weil die auch HTTPS hat, die Seite worum es wirklich geht ist diese hier
1https://removed.xxxx.com
.
Ich glaube Ich starre mich zu sehr blind auf das "https" Verfahren.
Bis spaeter.

Gruss,
Lucius

— geändert am 26.09.2011, 15:53:42

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 17:58:13 via Website

Ok, dann bin Ich mal gespannt.
War schon dabei mit den decoder base64 an die Sache ran zu gehen aber das lass Ich dan mal lieber.

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 20:00:43 via Website

Hi Rafael,

Gibst du mir ein Zeigen du wider da bist.
Danke dir.

Gr,
Lucius

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 21:19:44 via Website

Hi Rafael,

Endlich Wochende?
Aber gut, es geht irgendwie immer noch nocht obwohl Ich den Post ausfuehre.
PS: user_username und usr_password sind die name values des Sourcecodes die von der Webseite angegeben sind.
Vielleicht uebergebe Ich die Parameter falsch?
Unter dem Code mal ein Ausschnitt aus den Source der Webside, vielleicht siehst du ja etwas was Ich nicht sehe.

1public void postLoginData() {
2
3 // Create a new HttpClient and Post Header
4 DefaultHttpClient httpclient = new DefaultHttpClient();
5
6 // Execute HTTP Post Request
7 HttpPost httppost = new HttpPost("https://xxxxx.removed.com");
8
9 try {
10 // Add user name and password
11 EditText uname = (EditText)findViewById(R.id.txt_username); // user input through EditText
12 String username = uname.getText().toString();
13
14 EditText pword = (EditText)findViewById(R.id.txt_password); // password input through EditText
15 String password = pword.getText().toString();
16
17 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
18 nameValuePairs.add(new BasicNameValuePair("usr_name",username));
19 nameValuePairs.add(new BasicNameValuePair("usr_password",password));
20 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
21 HttpResponse response = httpclient.execute(httppost);
22
23 // Execute HTTP Get Request
24 HttpGet httpget = new HttpGet("https://xxxxx.removed.com");
25 HttpResponse response1 = httpclient.execute(httpget);
26 HttpEntity entity = response1.getEntity();
27
28 // Retrieve Cookies
29 System.out.println("Initial set of cookies:");
30 List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
31 if (cookies.isEmpty()) {
32 System.out.println("None");
33 } else {
34 for (int i = 0; i < cookies.size(); i++) {
35 System.out.println("- " + cookies.get(i).toString());
36 }
37 }
38
39 String str = inputStreamToString(response1.getEntity().getContent()).toString();
40 System.out.println(str);
41
42 } catch (ClientProtocolException e) {
43 e.printStackTrace();
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }

Source Webseite:
1<div id="loginExtButton">
2<a class="button_grey" onclick="showHideElement('loginExtForm', 'show'); showHideElement('loginExtButton', 'hide'); return false;">inloggen</a>
3</div>
4<div id="loginExtForm" style="display:none;"><p><strong>Log in</strong></p>
5
6 <div id="showhideloginformext">
7 <form id="loginExt" action="https://xxxxx.removed.com" method="post">
8 <fieldset>
9 <input name="LOCALE" value="en_US" type="hidden">
10 <input name="AUTHMETHOD" value="UserPassword" type="hidden">
11 <input name="HiddenURI" value="https://xxxxx.removed.com?form=1801594&amp;formelement=1801351" type="hidden">
12 <input name="RedirectOnFailure" value="https://www.xxxxxxx/formhandler?form=1801594&amp;formelement=loginfailed&amp;pageid=2001200" type="hidden">
13 <input name="showloginform" id="showloginform" value="false" type="hidden">
14 <input name="formpartcode" value="showloginform" type="hidden">
15
16 <input name="onErrorMessage" value="Uw gebruikersnaam en/of wachtwoord is niet bekend. Probeer het nogmaals." type="hidden">
17 <label for="usr_name1" class="DisplayNone">Gebruikersnaam</label>
18 <input name="usr_name1" id="usr_name1" value="Gebruikersnaam" type="text">
19 <input name="usr_name" id="usr_name" value="" type="hidden">
20 <label for="usr_password" class="DisplayNone">Wachtwoord</label>
21 <input name="usr_password" id="usr_password" value="Wachtwoord" type="password">
22 <label for="loginSubmit" class="DisplayNone">Vertsuur</label>
23 <input id="loginSubmit" class="submit" src="/v2/static/xxxx/images/submit_on_green.gif" type="image">

— geändert am 26.09.2011, 15:56:17

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 21:49:37 via Website

Du musst halt so gut wie möglich das nachstellen was passiert, wenn du mit einem Brauser auf die Seite gehst.

Wie gesagt: Der GET muss zuerst ausgeführt werden. Der muss evtl. erst Cookies ziehen, die beim POST geprüft werden.
Dann solltest du alle <input type="hidden"> ebenfalls als Post Parameter übergeben.
Das macht der Brauser ja auch.

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 22:13:02 via Website

Ok, Ich habe den Get vor den Post.
Bevor Ich mich einlogge an der Webseite gibt es noch ein "hidden" Feld mit dem value "fb8d7a3e9885cd0a6510ec43c9aabc5d9f58a35ccdf38fc0cf3ffc2b744fc04579f1928ed776f3a0cf382cd23ac20b634962469b11a293e0a09d55de75bdf19f04b74091927e5cbea2f64c0d0a9f7c15ee3c795e5b1a31d6e27f27e9ce648b0e530e92a436efb364388ec70a4cd96c712ccf9f741e648f2dd4bb1d2758d86df06fb10c5b115fb362"
Das habe Ich im Post mit einbezogen aber wenn Ich mich einmal eingelogt habe an der Webseite gibt es noch ein "hidden" mit dem value "UserPassword".
1<input name="AUTHMETHOD" value="UserPassword" type="hidden">

Kannst du bitte mal gucken im Code unren was da fehlt?
Diese Seite ist wirklich ne harte Nuss.

Danke dir.
1public void postLoginData() {
2
3 // Create a new HttpClient and Post Header
4 DefaultHttpClient httpclient = new DefaultHttpClient();
5
6 // Execute HTTP Post Request
7 HttpPost httppost = new HttpPost("https://xxxxx.removed.com");
8
9 try {
10 // Add user name and password
11 EditText uname = (EditText)findViewById(R.id.txt_username); // user input through EditText
12 String username = uname.getText().toString();
13
14 EditText pword = (EditText)findViewById(R.id.txt_password); // password input through EditText
15 String password = pword.getText().toString();
16
17 // Execute HTTP Get Request
18 HttpGet httpget = new HttpGet("https://xxxxx.removed.com");
19 HttpResponse response1 = httpclient.execute(httpget);
20 HttpEntity entity = response1.getEntity();
21
22 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
23 nameValuePairs.add(new BasicNameValuePair("swfrmsig","fb8d7a3e9885cd0a6510ec43c9aabc5d9f58a35ccdf38fc0cf3ffc2b744fc04579f1928ed776f3a0cf382cd23ac20b634962469b11a293e0a09d55de75bdf19f04b74091927e5cbea2f64c0d0a9f7c15ee3c795e5b1a31d6e27f27e9ce648b0e530e92a436efb364388ec70a4cd96c712ccf9f741e648f2dd4bb1d2758d86df06fb10c5b115fb362"));
24 nameValuePairs.add(new BasicNameValuePair("usr_name",username));
25 nameValuePairs.add(new BasicNameValuePair("usr_password",password));
26 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
27 HttpResponse response = httpclient.execute(httppost);
28
29
30 // Retrieve Cookies
31 System.out.println("Initial set of cookies:");
32 List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
33 if (cookies.isEmpty()) {
34 System.out.println("None");
35 } else {
36 for (int i = 0; i < cookies.size(); i++) {
37 System.out.println("- " + cookies.get(i).toString());
38 }
39 }
40
41 String str = inputStreamToString(response1.getEntity().getContent()).toString();
42 System.out.println(str);
43
44 } catch (ClientProtocolException e) {
45 e.printStackTrace();
46 } catch (IOException e) {
47 e.printStackTrace();
48 }
49 }

— geändert am 26.09.2011, 15:57:04

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.09.2011, 22:29:03 via Website

Also ich seh da noch mehr hidden Felder im Formular ;)
1<input name="LOCALE" value="en_US" type="hidden">
2<input name="AUTHMETHOD" value="UserPassword" type="hidden">
3<input name="HiddenURI" value="https://www.kpn.com/kpn/restricted/formhandler?form=1801594&amp;formelement=1801351" type="hidden">
4<input name="RedirectOnFailure" value="https://www.kpn.com/kpn/formhandler?form=1801594&amp;formelement=loginfailed&amp;pageid=2001200" type="hidden">
5<input name="showloginform" id="showloginform" value="false" type="hidden">
6<input name="formpartcode" value="showloginform" type="hidden">
7<input name="onErrorMessage" value="Uw gebruikersnaam en/of wachtwoord is niet bekend. Probeer het nogmaals." type="hidden">
8<input name="usr_name" id="usr_name" value="" type="hidden">

Bevor wir hier jetzt weiter Rätsel raten:
- installier dir Firebug für Firefox
- Öffne die Firebug Konsole
- Gehe in den Reiter Netzwerk
- Logg dich ein

Dann siehst du genau was der Browser da an Daten schickt, welche URLs aufgerufen werden, welche Formularfelder da hin und her gehen usw.

Antworten
Lucius
  • Forum-Beiträge: 32

23.09.2011, 22:49:10 via Website

Ok Ich habe mir Firebug installiert und ausgefuehrt.
Soll Ich den Log hier posten?

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 02:07:32 via Website

Hallo Rafael,

Ich bekomme folgenden log im Firebug:
109-23 23:59:53.246: INFO/System.out(350): Login form get: HTTP/1.1 200 OK
209-23 23:59:54.325: INFO/System.out(350): Post logon cookies:
309-23 23:59:54.325: INFO/System.out(350): - [version: 0][name: JSESSIONID][value: C3E7CDE3836C8FDB430BEB15F4D1C77B.cal_worker2][domain: access.kpn.com][path: /][expiry: null]

Ich denke mal dies sieht gut aus, aber wie weiss Ich jetzt ob Ich gut eingeloggt habe auf der Webseite?
Das was Ich brauche steht auf folgende Seite https://xxxxx.removed.com, die Ich parsen muss.
Kannst du bitte nochmal kurz schauen?

Danke im voraus.

1// Create a new HttpClient and Post Header
2 DefaultHttpClient httpclient = new DefaultHttpClient();
3
4
5 try {
6 // Execute HTTP Get Request
7 HttpGet httpget = new HttpGet("https://xxxxx.removed.com");
8 HttpResponse response = httpclient.execute(httpget);
9 HttpEntity entity = response.getEntity();
10
11 System.out.println("Login form get: " + response.getStatusLine());
12 if (entity != null) {
13 entity.consumeContent();
14 }
15 System.out.println("Initial set of cookies:");
16 List<Cookie> cookies = httpclient.getCookieStore().getCookies();
17 if (cookies.isEmpty()) {
18 System.out.println("None");
19 } else {
20 for (int i = 0; i < cookies.size(); i++) {
21 System.out.println("- " + cookies.get(i).toString());
22 }
23 }
24
25
26 // Execute HTTP Post Request
27 HttpPost httppost = new HttpPost("https://xxxxx.removed.com");
28 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
29 nameValuePairs.add(new BasicNameValuePair("usr_name",username));
30 nameValuePairs.add(new BasicNameValuePair("usr_password",password));
31
32 //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
33 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
34
35 response = httpclient.execute(httppost);
36 entity = response.getEntity();
37
38 System.out.println("Login form get: " + response.getStatusLine());
39 if (entity != null) {
40 entity.consumeContent();
41 }
42
43 System.out.println("Post logon cookies:");
44 cookies = httpclient.getCookieStore().getCookies();
45 if (cookies.isEmpty()) {
46 System.out.println("None");
47 } else {
48 for (int i = 0; i < cookies.size(); i++) {
49 System.out.println("- " + cookies.get(i).toString());
50 }
51 }
52
53 String str = inputStreamToString(response.getEntity().getContent()).toString();
54 System.out.println(str);
55
56 } catch (ClientProtocolException e) {
57 e.printStackTrace();
58 } catch (IOException e) {
59 e.printStackTrace();
60
61 httpclient.getConnectionManager().shutdown(); // Disconnect
62 }

— geändert am 26.09.2011, 15:58:42

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.09.2011, 08:55:39 via Website

Ich finde bei Dir nirgendwo die Abfrage des Status:

1if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

Damit würdest Du schon mal über alle normalen Fehler stolpern.

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 10:18:21 via Website

Hallo Harald,

Ja stimmt, habe das jetzt mal so gemacht wie du empholen hast und kommt sowie beim Get als Post komt
109-24 08:13:13.367: INFO/System.out(333): HTTP/1.1 200 OK
zurueck.
Wenn Ich jetzt mal ein falsches Paswort eingeben kommt aber dieselbe Meldung "HTTP/1.1 200 OK" zurueck.

1DefaultHttpClient httpclient = new DefaultHttpClient();
2
3 try {
4 // Execute HTTP Get Request
5 String responseString = null;
6 HttpGet httpget = new HttpGet("https://xxxxx.removed.com");
7 HttpResponse response = httpclient.execute(httpget);
8 HttpEntity entity = response.getEntity();
9 StatusLine statusLine = response.getStatusLine();
10
11 if(statusLine.getStatusCode() == HttpStatus.SC_OK){
12 System.out.println("HTTP Get: " + response.getStatusLine());
13 ByteArrayOutputStream out = new ByteArrayOutputStream();
14 response.getEntity().writeTo(out);
15 out.close();
16 responseString = out.toString();
17 } else{
18 //Closes the connection.
19 response.getEntity().getContent().close();
20 throw new IOException(statusLine.getReasonPhrase());
21 }
22
23 // Execute HTTP Post Request
24 HttpPost httppost = new HttpPost("https://xxxxx.removed.com");
25 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
26 nameValuePairs.add(new BasicNameValuePair("usr_name",username));
27 nameValuePairs.add(new BasicNameValuePair("usr_password",password));
28
29 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
30
31 response = httpclient.execute(httppost);
32 entity = response.getEntity();
33
34 StatusLine statusLine1 = response.getStatusLine();
35
36 if(statusLine1.getStatusCode() == HttpStatus.SC_OK){
37 System.out.println("Login form get: " + response.getStatusLine());
38 if (entity != null) {
39 entity.consumeContent();
40 }
41 }
42 else{
43 //Closes the connection.
44 response.getEntity().getContent().close();
45 throw new IOException(statusLine.getReasonPhrase());
46 }
47
48 String str = inputStreamToString(response.getEntity().getContent()).toString();
49 System.out.println(str);
50
51 } catch (ClientProtocolException e) {
52 e.printStackTrace();
53 } catch (IOException e) {
54 e.printStackTrace();
55
56 httpclient.getConnectionManager().shutdown(); // Disconnect
57 }
58
59 }

— geändert am 26.09.2011, 15:59:23

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

24.09.2011, 10:30:55 via Website

Nein nein nein, das ist der LogCat was du da postest.
Mit dem StatusCode fängt man auch nur echte Fehler beim Laden der Seite ab, ein Fehlerhafter Login liefert auch 200 OK, weil die Fehlermeldung erfolgreich geladen wird.

Firebug sagt mir dieses hier:


Es werden also 3 Parameter übermittelt.

Interessant ist aber, dass die Seite die als Antwort kommt ein weiteres Formular enthält, das per JavaScript automatisch ebenfalls gePOSTed wird.

Siehe:



Wie gesagt: Guck dir im Firebug an, was beim Einloggen genau passiert und bau das 1zu1 mit dem HttpClient nach,
dann wird es auch gehen.

— geändert am 24.09.2011, 10:34:07

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 11:10:17 via Website

Guten Morgen Rafael,

Ok habe verstanden, es fehlte also noch der Parameter "swfrmsig", scheint eine art Hashcode zu sein der sich aendert.
Ich muss den ja irgendwie ueber den Get ermitteln, oder? Denn fuer jeden Gebraucher der sich auf der Webseite korrekt einlogt ist dieser Code anders denke Ich.
Er aendert sich nicht beim korrekten Einloggen auf der Seite, wohl beim falsch einloggen.
Waerst du vielleicht so nett und koenntest mir ein Beispielcode nenne wie Ich das anpacken soll?
Ich denk dass Ich langsam den Ueberblick verliere.

Danke dir.

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 12:02:17 via Website

Kann mir bitte irgend jemand weiterhelfen?
Bin schon ein paar Tage damit beschaeftigt um einen korrekten Login hinzukriegen und verzweifele langsam.:(

Danke euch.
Lucius

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.09.2011, 12:44:03 via Website

Da kann man nicht pauschal helfen. Es kommt immer auf die Seite an.

In einer meiner Anwendungen (GaCoMo) nutze ich einen API Kanal zu Garmin Connect. Dort muss ich z.B. einen drei-stufigen Login durchführen:

* Einen GET Zugriff auf die https Seite. Diese liefert unter anderem eine Session-ID

* Mit dieser Session-ID wird ein POST abgeschickt der einige Parameter enthält.

* Mit dem dann folgenden Ergebnis kann ich erst die API Calls wiederum per GET abrufen:

Im Prinzip muss man, wie hier oft geschildert, die Kommunikation exakt analysieren (Firebug, ich nehme Chrome, etc..) um diese 1:1 abbilden zu können. Manchmal sind auch Nickeligkeiten wie Parameter-Reihenfolge oder eine fortlaufende Nummerierung der Requests eingebaut. Den Möglichkeiten sind hier keine Grenzen gesetzt.

Es gibt Projekte da habe ich Tage benötigt (und war schon kurz vor der Aufgabe) bevor es dann doch funktionierte.

Was ich damit sagen will? Das dauert oftmals seine Zeit bis man das 1:1 abgebildet hat. Diese Zeit müsste aber auch jemand investieren der Dir helfen will ...

Gruß
Harald

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

24.09.2011, 12:48:50 via Website

Ich hab grad mehr als genug mit meiner eigenen App zu tun, daher kann ich dir nur ein wenig den Weg zur Lösung weisen ;)

Also noch ein Tipp, wie man den Fake eines Login im Browser testen kann.

Guck dir mal das zweite Formular in meinem Screenshot an. Dort werden nur 2 Parameter übermittelt.
Ob du nun per POST oder GET einen Login machst, ist dem Server völlig egal, daher kannst du auch einfach mal

https://www.kpn.com/web/restricted/form/formelement=512663?usr_name=BENUTZERNAME&usr_password=PASSWORT

Im Browser aufrufen und mal richtige Benutzerdaten einsetzen und gucken was passiert.
Ich denke das zweite Formular ist für den Login entscheidend.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.09.2011, 12:52:10 via Website

Nachtrag:

Ist das diese Seite? http://www.kpn.com/inloggen.htm

<form name="login" action="https://access.kpn.com/CAUT/AuthenticationServlet" method="POST">

<input type="text" id="f_username" name="usr_name" class="c" autocomplete="off" value="" maxlength="32" style="width:145;" onKeyPress="return checkLoginForm(event);return false;"/>

<input type="password" id="text1" name="usr_password" autocomplete="off" value="" maxlength="32" onKeyPress="return checkLoginForm(event);return false;"/>

<input type="checkbox" name="saveusername" value="save" onKeyPress="return checkLoginForm(event);return false;" /> Bewaar gebruikersnaam voor een volgende keer

<input type="submit" class="kpn_bh_dynamicbutton" value="Inloggen" onclick="checkLoginForm('formSubmit');return false;" />

Du benötigst also vier Parameter: usr_name, usr_password, saveusername=save, submit=Inloggen

Probiers mal ;-)

Gruß
Harald

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 13:17:24 via Website

Hallo Rafael/Harald,

@Harald,

Ja das ist die Seite.
Ich bin immer von dem Post action=https://access.kpn.com/CAUT/AuthenticationServlet ausgegangen und nicht http://www.kpn.com/inloggen.htm
Wenn Ich das gute sehe verweist dieser auch nach dem action url link.
Da sind, wie Rafael schon bemerkte 3 Parameter benoetigt, "swfrmsig", "usr_name" und "usr_password".

@Rafael,
Natuerlich Ich verstehe vollkommen dass deine eigene App Vorrang hat.
Ich habe mal dein Tip versucht und es stellt sich heraus dass Ich mit folgenden Link korrekt einloggen: https://www.kpn.com/web/restricted/form/formelement=512663?usr_name=MeinUser&usr_password=MeinPass&swfrmsig=846fhgtrunshnb32hfgtryhd
Es werden also 3 Parameter benoetigt wie du schon sagtest, meine Sorge ist der Parameter "swfrmsig" der codiert zu sein scheint.
Wie weiss Ich dass Ich den korrekten habe?
Es ist ja so, wenn Ich ein falsches Paswort eingebe dass "swfrmsig" sich andert nach dem Wert "45ghihjhnf7ghf5td", hiermit kann Ich ja kontrollieren ob mein User und Pass korrekt sind.

Nochmals danke dass Ihr probiert mich so gut wie moeglich zu helfen..

— geändert am 24.09.2011, 13:18:57

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

24.09.2011, 13:41:13 via Website

Auch diese ID muss ja irgendwo in den Quelltexten der Seiten stehen, oder in den Cookies.
Du musst dir einfach mal die passende Stelle suchen und eine RegularExpression entwerfen, mit der du diese ID direkt aus der Seite extrahieren kannst.
Dann setzt du die einfach dynamisch in den Request ein.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.09.2011, 13:44:15 via Website

Ah, den fünften Parameter habe ich übersehen. Du hast also einen zweistufigen Login-Prozess. Lag ich doch nicht so falsch mit meiner ersten Annahme.

1.) Schritt: Zunächst ein GET auf die Seite: http://www.kpn.com/inloggen.htm

Aus dieser Seite schneidest Du das value="" des swfrmsig input raus.

2.) Nun nimmst Du die vier festen von mir erwähnten Parameter (usr_name, usr_password, saveusername=save, submit=Inloggen) und fügst diesen den fünften hinzu. Der Wert ist der Parameter aus Schritt 1.). Dieser Zugriff ist ein POST.

Was mir nicht klar ist ob value encoded ist, aber ich würde es erstmal so versuchen. Und bevor Du fragst, nimm Pattern/Matcher für das rausschneiden.

Gruß
Harald

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 15:37:41 via Website

Hallo Rafael/Harald,

Bin jetzt schon was weiter und kann mir den HTML code der Seite ausgeben lassen.
Dabei habe Ich auch Haralds Idee zum Pattern/Matcher implementiert aber Ich krieg einen forceclose sobald Ich den Button klicke und Ich weiss nicht wie Ich den Parameter pageHTML declarieren soll.

1public void postLoginData() {
2
3 // Add user name and password
4 EditText uname = (EditText)findViewById(R.id.txt_username); // user input through EditText
5 String username = uname.getText().toString();
6
7 EditText pword = (EditText)findViewById(R.id.txt_password); // password input through EditText
8 String password = pword.getText().toString();
9
10 // Create a new HttpClient and Post Header
11 DefaultHttpClient httpclient = new DefaultHttpClient();
12
13 HttpGet pageGet = new HttpGet("https://xxxxx.removed.com");
14
15 ResponseHandler<String> handler = new ResponseHandler<String>() {
16 public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
17 HttpEntity entity = response.getEntity();
18 String html;
19
20 if (entity != null) {
21 html = EntityUtils.toString(entity);
22 return html;
23 } else {
24 return null;
25 }
26 }
27 };
28
29 pageHTML = null; <<<<<< cannot be resolved to a variable??
30 try {
31 while (pageHTML==null){
32 pageHTML = httpclient.execute(pageGet, handler);
33 }
34 } catch (ClientProtocolException e) {
35 // TODO Auto-generated catch block
36 e.printStackTrace();
37 } catch (IOException e) {
38 // TODO Auto-generated catch block
39 e.printStackTrace();
40 }
41
42 Pattern pattern = Pattern.compile(".* (swfrmsig).*");
43 Matcher matcher = pattern.matcher("6dee04d98a75615228a10236e2786e52d67365eb18c2e74da174a7509c92adba79f1928ed776f3a0e46ee1b6e5f482814962469b11a293e0a09d55de");
44 String displayHTML = null;
45 while(matcher.find()){
46 displayHTML = matcher.group();
47 }
48
49 return displayHTML; <<<<<<<<<<< void methods canot return a value??
50 }

— geändert am 26.09.2011, 16:00:24

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.09.2011, 16:38:29 via Website

Tut mir leid - aber ich habe keine Ahnung was Du das bastelst. So aus'm Kopf:

1private static final Pattern pattern = Pattern.compile("<input.+?type=\"hidden\".+?name=\"swfrmsig\".+?value=\"(.+?)\" />", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
2
3...
4
5String key = "";
6
7Matcher matcher = pattern.matcher(content);
8if (matcher.find()) {
9 key = matcher.group(1);
10}
11
12if (!StringUtils.isEmpty(key)) {
13 //
14}

— geändert am 24.09.2011, 16:39:26

Antworten
Lucius
  • Forum-Beiträge: 32

24.09.2011, 17:01:46 via Website

Harald,

Du hast recht, viel zu schwierig.
Der Parameter "swfrmsig" ist aber Einzigartig und braucht also nicht mit dem Get geholt zu werden.
Der Parameter steht in den Sourcecode der Homepage, Ich habe das mal nachgeguckt bevor Ich mich einlogge und nach dem erfolgreichen einloggen.
Er aendert nur wenn Ich ein falschen User oder Pass eingebe.
Ich muss nen Weg finden den abzugleichen.

Ich mach mal ne Pause, denn Ich sehe durch die Baueme den Walt nichtmehr :mad:
Heuteabend guck Ich nochmal rein.
Weitere Ideeen sind immer wilkommen :grin:

Gruss,
Lucius

— geändert am 24.09.2011, 17:02:17

Antworten
Lucius
  • Forum-Beiträge: 32

25.09.2011, 14:10:29 via Website

Hallo Rafael/Harald,

Bin schon ein Stueck weiter, Ich bekomme jetzt den Error im LogCat: LogCat: 09-25 13:53:49.090: WARN/System.err(3120): java.util.regex.PatternSyntaxException: Syntax error U_REGEX_MISMATCHED_PAREN near index 36: 09-25 13:57:35.091: WARN/System.err(3341): <input[^>]*?value\s*?=\s*?\"(.*?)\") beyueglic Pattern/Matcher.
Das kann nicht viel sein, koennt Ihr bitte mal ein Auge drauf werfen?

Danke euch.
1String stringToSearch = "swfrmsig";
2
3 Pattern pattern = Pattern.compile("<input[^>]*?value\\s*?=\\s*?\\\"(.*?)\\\")");
4 Matcher m = pattern.matcher(stringToSearch);
5
6 // if we find a match, get the group
7 if (m.find())
8 {
9 // get the matching group
10 String codeGroup = m.group(1);
11
12 // print the group
13 System.out.format("'%s'\n", codeGroup);
14 }

Antworten
Markus B.
  • Forum-Beiträge: 636

25.09.2011, 18:15:20 via App

Hi,
dann stoße ich mal die Hilfe zur Selbsthilfe an.
Lad dir mal ein Tool wie den regex coach herunter. Damit kannst du deinen Ausdruck testen und bekommst bessere Fehlermeldungen.
Unter folgender URL kannst du nachlesen was du so mit regex alles so machen kannst:
http://developer.android.com/reference/java/util/regex/Pattern.html

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

25.09.2011, 19:16:58 via Website

@Lucius:

... und warum nimmst Du nicht meinen Pattern? Diese Dinger laufen bei mir so lange ich denken kann mit irrwitziger Geschwindigkeit durch xxMB große HTML Dokumente um einen <input /> rauszuschneiden.

Du hast zum Beispiel Pattern.MULTILINE rausgelassen. Meiner Meinung nach war in dem Original Quelltext ein Zeilenumbruch in diesem <input />. Des weiteren machst Du ein paar Quotierungen zu viel. Außerdem, durch das rausnehmen des "static final" nimmst Du dem Pattern die Geschwindigkeit da eine große Zeit im compile verbraten wird - bei Dir passiert das jetzt bei jedem Durchlauf des Codes.

Nimm doch erstmal meinen Pattern und wenn der läuft dann kannste den ja immer noch "verbessern".

Das Whitespace am Ende (...value=\"(.+?)\" />) würde ich noch mit einem reluctant quantifiers (.+?) versehen - den hatte ich vergessen.

— geändert am 25.09.2011, 19:20:06

Antworten
Lucius
  • Forum-Beiträge: 32

26.09.2011, 18:55:00 via Website

Hallo Markus,Harald,

Ja Ich habe den Pattern/Matcher mal zur Seite gelegt da es mit Jsoup sofort geklappt hat, trotsdem danke fuer den Hinweiss :grin:
Ich kom aber trotsdem noch immer nicht auf der Seite.
Mir wurde empfholen erst einen HttpPost zu machen auf dem Server und dann einen Get.
Ich bekomme noch nicht einmal einen Response from Server.

1try {
2 // Setting up parameters
3 HttpParams params = new BasicHttpParams();
4 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
5 HttpProtocolParams.setContentCharset(params, "utf-8");
6 params.setBooleanParameter("http.protocol.expect-continue", true);
7
8 // Setting timeout
9 HttpConnectionParams.setConnectionTimeout(params, 10000);
10 HttpConnectionParams.setSoTimeout(params, 10000);
11
12 // Registering schemes for both HTTP and HTTPS
13 SchemeRegistry registry = new SchemeRegistry();
14 registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
15 final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
16 sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
17 registry.register(new Scheme("https", sslSocketFactory, 443));
18
19 // Do the HTTPS Post
20 HttpClient httpclient;
21 HttpPost httppost;
22
23 httpclient = new DefaultHttpClient();
24 httppost = new HttpPost("https://www.xxxx.com/web/restricted/form/formelement=512");
25 ArrayList<NameValuePair> postParameters;
26 postParameters = new ArrayList<NameValuePair>(3);
27 postParameters.add(new BasicNameValuePair("usr_name", username));
28 postParameters.add(new BasicNameValuePair("usr_password", password));
29 postParameters.add(new BasicNameValuePair("swfrmsig", buddyname)); // Obtained Token
30 client.execute(request);
31
32
33 System.out.println(postParameters);
34
35 HttpResponse response1 = httpclient.execute(httppost);
36 Log.w("Response ","Status line : "+ response1.toString());
37 // 200 if successfully logged in

und dann einen Get mit:

1HttpGet request = new HttpGet("https://www.xxxx.com/restricted/prive/mobiel.htm?lf=915");

Die Seite parsen bis Ich dass Ergebniss habe und dann ausloggen, fertig.

— geändert am 26.09.2011, 18:57:16

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

26.09.2011, 20:21:38 via Website

Was machst Du da? Das sind ja jetzt ganz andere Seiten als die die ich mal angeschaut habe.

Und was soll der unquoted '=' sein? Ist das der Bestandteil eines Parameters oder ein Bestandteil des URL? URL und Parameter haben unterschiedliche Encoding Regeln.

Ich klinke mich mal aus. TL;DR

Antworten
Lucius
  • Forum-Beiträge: 32

15.10.2011, 10:59:30 via Website

Hallo Harald,

Ich musste dies mal ein wenig ruhen lassen, Ich hatte die Seiten geandert weil Ich dachte KPN wuerde dies schaden.
Entschuldigung dafuer, Ich wuerde aber gerne auf deine Hilfe zurueck kommen, da Ich jetzt schon fast mehr als einen Monat probiere dies hinzubekommen.
Kannst du mich viellecith nochmal unter die Arme greifen?

Danke im voraus.
Gruss.

Antworten
Lucius
  • Forum-Beiträge: 32

16.10.2011, 10:56:25 via Website

Kan geschlossen werden!
App funktioniert wie es sein sollte.

Antworten