HttpGet funktioniert nicht

thisisme

thisisme

Erfahrenes Mitglied
49
Hallo,

Ich habe vor in meine App einen Login einzubauen, dabei wird ein Hash vom Passwort generiert,
welcher dann zusammen mit dem Benutzernamen per HttpGet and meinen Webserver gesendet werden soll, welcher daraufhin mit "true" oder "false" antworten soll.
Jedenfalls funktioniert das nicht so, wie ich will, denn in "result" steht einfach gar nichts, ich habe es dann mal mit dem "normalen" eclipse getestet -
und siehe da ich bekomme true/false zurück, so wie es soll - warum geht das in Android denn nicht?
(Testgerät ist ein HTC One M8 mit Android 4.4.4)

hier der code:
MainActivity.java:
Code:
<---package--->

<---imports--->

public class MainActivity extends ActionBarActivity {
	private EditText pass;
	private Button einloggen;
	private EditText user;
	private TextView debuggingOutput;
	String username, passwort, hash, result;
	HttpConnect http;
	
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Variablenzuweisung des Layouts
        pass = (EditText) findViewById(R.id.passwort);
        einloggen = (Button) findViewById(R.id.bt_einloggen);
        user = (EditText) findViewById(R.id.username);
        
        // Debug
        debuggingOutput = (TextView) findViewById(R.id.debuggingOutput);
      
        einloggen.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
            	hole_daten();
            	if (!passwort.contentEquals("") & !username.contentEquals("")) {
            		
            		try { hash = generiereHash(passwort); }          			
            		// Fehler bei der Hash Generierung abfangen	:
            		catch (NoSuchAlgorithmException e) {e.printStackTrace();}						
					catch (UnsupportedEncodingException e) {e.printStackTrace();}
					
    				http = new HttpConnect("http://my-server-url/http_get.php?user="+username+"&hash="+hash);
    				try {http.sendGet();} 
    				catch (Exception e) {e.printStackTrace();}
    				result = http.getResult();
    				
    				
    				
    				dbg("RESULT:"+result);
    				
    				
            		
        			if(result.equals("false")) Toast.makeText(getApplicationContext(), R.string.wrongPassword, Toast.LENGTH_LONG).show();    			
        			else {
        				Toast.makeText(getApplicationContext(), "PW korrekt", Toast.LENGTH_LONG).show();
        				//TODO: OPEN NEW ACTIVITY!
        			}
        			
              	}
            	// Leere Eingaben abfangen
            	else if(passwort.contentEquals("") & username.contentEquals("")) Toast.makeText(getApplicationContext(), R.string.invalidInput, Toast.LENGTH_LONG).show();
            	else if(passwort.contentEquals("") & !username.contentEquals("")) Toast.makeText(getApplicationContext(), R.string.invalidInputNoPassword, Toast.LENGTH_LONG).show();
            	else if(!passwort.contentEquals("") & username.contentEquals("")) Toast.makeText(getApplicationContext(), R.string.invalidInputNoUsername, Toast.LENGTH_LONG).show();
            	}
          });
    }
    public String generiereHash(String passwort) throws NoSuchAlgorithmException, UnsupportedEncodingException{
        
          <.....>
       
     }
     
     private static String convertToHex(byte[] data)
     {
           <.....>
     }

    public void hole_daten(){
        username = user.getText().toString();
        passwort = pass.getText().toString();
      }    

    public void dbg(String s){
    	debuggingOutput.setText(debuggingOutput.getText().toString() + "\n" + s);
    }
    
    public void dbg(String s, boolean clear){
    	debuggingOutput.setText("DEBUG OUT: \n" + s);
    }  
    
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
<.....>
 }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
<.....>
    }
}
(hab ein paar unwichtige Methoden gekürzt, damit der Thread nicht unnötig lang wird)

HttpConnect.java:
Code:
<-- package -->

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpConnect {
	
	private final String USER_AGENT = "Mozilla/5.0";
	public String url;
	public String result;
	
	public HttpConnect(String Url){
		url = Url;
		result = "";
	}
	
	public String getResult(){
		return result;
	}
	 
	// HTTP GET request
	public void sendGet() throws Exception {				 
		URL obj = new URL(url);
		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
 
		con.setRequestMethod("GET");
 
		con.setRequestProperty("User-Agent", USER_AGENT);
 
		BufferedReader in = new BufferedReader(
		        new InputStreamReader(con.getInputStream()));
		String inputLine;
		StringBuffer response = new StringBuffer();
 
		while ((inputLine = in.readLine()) != null) {
			response.append(inputLine);
		}
		in.close();
 
		result = response.toString(); 
	}	
}

und hier ist noch die http_get.php:
PHP:
<?php			 
$db = mysqli_connect("**","**","**","**");
if(!$db){
	exit("Verbindungsfehler: ".mysqli_connect_error());
}

$user     = urldecode($_GET['user']);
$hash    = urldecode($_GET['hash']);

$query = "SELECT * FROM test WHERE user='".$user."'";

$get = mysqli_query($db, $query);

while($row = mysqli_fetch_object($get))
{
	$validHash = $row->password;
}

if($hash == $validHash) $valid="true";
else $valid="false";

print $valid; 
 
?>

Danke für Vorschläge!

thisisme
 
Ohne erst mal zu schauen ob der Code an sich richtig ist...

ein Hinweis -> Fehlermeldung im Log prüfen

Du versuchst Netzwerkcode im MainThread deiner App auszuführen,
das ist seit Android 3.x nicht mehr möglich und wird mit einem

android.os.NetworkOnMainThreadException

belohnt. Zeitintensive Tasks müssen in einen Thread ausgelagert werden.
(Thread, AsyncTask ect pp).

Hinweis zur Sicherheit -> einfach nur true oder false zurückzugeben ist etwas wenig bzw kann sehr leicht manipuliert werden.
 
  • Danke
Reaktionen: thisisme
das hättest du auch mit 1 min suchen hier im forum herausfinden können. Bei mir wird immer noch auf Seite 1 der Thread login laeuft nicht von
DevelopingPhil angezeigt. Er benutzt zwar Post und nicht get, aber hat dabei genau den gleichen Fehler wie du gemacht.
 
  • Danke
Reaktionen: thisisme
Richtig ..und in Zukunft logcat mit anhängen
 
  • Danke
Reaktionen: thisisme
Es war, wie killphil75 sagte, diese Exception bekam ich ausgegeben.
Ich habe es mit einem AsyncTask nun geschafft.
Danke für die Hilfen!

@killphil75: Wegen der Sicherheit, wie würdest du es denn ergänzen, damit es sicherer wird?
 
Zuletzt bearbeitet:
Also erstmal du nutzt kein https mit Zertifikat pinning. D.h. jeder im Netzwerk kann das Passwort (der hash ist sinnlos) mitschneiden und somit den Account übernehmen.

Nutze https mit einem selbst erstellten Zertifikat welches du in deiner App mit reinpackst. Und lege die Nutzung zwangsweise auf dieses Zertifikat fest.

Und wie gesagt, daß Passwort hashen ist hier Blödsinn.

Und bei erfolgreichen Login gibt der Server ein Token (zufälliges sehr langes Passwort) zurück welches der Client bei jeder Anfrage mitliefern muss.

cu
 

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
957
swa00
swa00
O
Antworten
15
Aufrufe
2.970
ORHUX
O
K
Antworten
3
Aufrufe
1.168
Kapikalaani
K
Zurück
Oben Unten