Hoffnungslos, einloggen ueber HTTPS Seite aber wie?

  • Antworten:43
  • OffenNicht stickyNicht beantwortet
  • 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
  • Forum-Beiträge: 2.243

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
  • 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
  • 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
  • Forum-Beiträge: 2.243

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
  • 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 http://www.androidpit.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
  • 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
  • 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
  • Forum-Beiträge: 2.243

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
  • 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
  • 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
  • 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
  • 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
  • Forum-Beiträge: 2.243

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
  • 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

Empfohlene Artikel