Aller au contenu

Page de connexion et Session


Android-User

Recommended Posts

Bonjour,

Je suis en train de coder une page de connexion pour accéder à mon application

J'utilise également mon serveur (internet) avec du PHP pour gérer les authentications et les $_SESSION.

En résumé, je vérifie si les données sont justes, pour cela, j'utilise la méthode POST via mon java, puis je redirige l'utilisateur sur une autre activité.

Mon problème est que si les logins sont correctes, la $_SESSION n'est pas active sur mon application, hors sur internet, cela fonctionne bien... Serais-ce à cause de la non gestion des cookies de mon activité ?

Petite précision : j'ai utilisé une webview, mais cela ne change rien, toujours le même problème... (inutile).

package com.antho.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.Toast;

public class Login extends Activity implements OnClickListener {

/** Called when the activity is first created. */
WebView myWebView;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.login);

	View continueButton = findViewById(R.id.connexion);
	continueButton.setOnClickListener(this);

       myWebView = (WebView) findViewById(R.id.mywebview);
       myWebView.getSettings().setJavaScriptEnabled(true); 
       myWebView.setWebViewClient(new HelloWebViewClient());   	    
}

@Override
public void onClick(View v) {
	//Intent i;

	switch (v.getId()) {
	case R.id.connexion:

		EditText email = (EditText) findViewById(R.id.email);
		String emailStr = email.getText().toString();
		EditText password = (EditText) findViewById(R.id.password);
		String passwordStr = password.getText().toString();

           //String   mUsername = username.getText().toString();
           //String  mPassword = password.getText().toString();

        if (checkInternetConnection() == false) { // Vérifier la connexion.
	        return;
        }

        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(emailStr); // Compare avec pattern

        if (m.matches() == false) {

        	Toast.makeText(Login.this, emailStr + " n'est pas une adresse email.",Toast.LENGTH_SHORT).show();
	        return;
        }

           // Si les champs sont vides
        if (passwordStr.equals("")) {

        	Toast.makeText(Login.this, "Ajouter votre mot de passe.",Toast.LENGTH_SHORT).show();
        	return;
        }
           tryLogin(emailStr, passwordStr); // On vérifie les données

        if (m.matches() == true & !passwordStr.equals("")) {
	        //Uri link = Uri.parse("http://www.monsite.org/login?email=" + emailStr + "&password=" + passwordStr);
	        //Intent intent = new Intent(Intent.ACTION_VIEW, link);
	        //startActivity(intent);

			Intent i = new Intent(Login.this, Main.class);
			i.putExtra("email", emailStr);
			i.putExtra("password", passwordStr);
			startActivity(i);
			break;
        }
	}
}

private boolean checkInternetConnection() {
	 ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);  
	 if ( conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED
		        ||  conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED  ) {

		      Log.v("Congr","Connection Present");
		      return true;
		    }
	 else {
		 Log.v("conMgr"," No Connection");
	     Toast.makeText(Login.this, "You are not connected.",Toast.LENGTH_LONG).show();
		 return false;
	 }
}

public void tryLogin(String email, String password) {

	HttpURLConnection connection;
    OutputStreamWriter request = null;
    URL url = null;   
    String response = null;         
    String parameters = "mail="+email+"&password="+password; 
       try
       {
           myWebView.loadUrl("http://monsite.org/webapp/");
           url = new URL("http://monsite.org/webapp/");
           connection = (HttpURLConnection) url.openConnection();
           connection.setDoOutput(true);
           connection.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
           connection.setRequestMethod("POST");    

           request = new OutputStreamWriter(connection.getOutputStream());
           request.write(parameters);
           request.flush();
           request.close();            
           String line = "";               
           InputStreamReader isr = new InputStreamReader(connection.getInputStream());
           BufferedReader reader = new BufferedReader(isr);
           StringBuilder sb = new StringBuilder();

           while ((line = reader.readLine()) != null)
           {
               sb.append(line + "\n");
           }

               response = sb.toString();

               String[] response_splitted = TextUtils.split(response, "<!DOCTYPE");


               //Toast.makeText(this,"Message from Server: \n"+ response, 0).show();
               Toast.makeText(this, response_splitted[0],Toast.LENGTH_LONG).show();

               if(response_splitted[0].equals("ok")) {
               	String validation = "ok"; 
               }
               else {
               	String validation = "no";
               	return;
               }
               isr.close();
               reader.close();
               return;
           }
           catch(IOException e)
           {
               // Error
           	return;
           }

   }
private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
    	myWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

}

Merci d'avance ! :D

Lien vers le commentaire
Partager sur d’autres sites

Il faut effectivement que tu récupères le/les cookies positionnés par ton serveur lors de l'authentification, pour pouvoir les passer ensuite aux requêtes suivantes, afin que ton serveur retrouve ses petits. Tu n'es pas obligé de les gérer à la main, utilise pour cela CookieManager

Lien vers le commentaire
Partager sur d’autres sites

Rebonjour,

Merci de m'avoir répondu, je ne vois pas du tout comment faire mon (web) service pour gérer les cookies de mon application...

L'idée étant d'enregistrer les cookies de Login.java et de les exploiter dans Web.java afin de conserver ma session PHP.

Ne serais-ce pas plus facile et optimiser d'éviter un service avec librairie ?

Voici comment je me suis pris pour les cookies de mon activité Login.


	    HttpClient httpclient = new DefaultHttpClient();
	    HttpPost httppost = new HttpPost("http://www.monsite.com/index.php");

	    try {

            BasicCookieStore cookieStore = new BasicCookieStore();
            HttpContext localContext = new BasicHttpContext();
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

	        // Data
	        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
	        nameValuePairs.add(new BasicNameValuePair("mail", email));
	        nameValuePairs.add(new BasicNameValuePair("password", password));
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

	        // Post Request
	        HttpResponse response = httpclient.execute(httppost);
	        HttpEntity entity = response.getEntity(); // new

            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();

            String result = sb.toString();

            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
                Toast.makeText(this, "Response content length: " + entity.getContentLength(),Toast.LENGTH_LONG).show();
            }
            List<Cookie> cookies = cookieStore.getCookies();
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("Local cookie: " + cookies.get(i));
                Toast.makeText(this, "Local cookie: " + cookies.get(i),Toast.LENGTH_LONG).show();
            }

	    }catch (ClientProtocolException e) {
	        // TODO Auto-generated catch block
	    } catch (IOException e) {
	        // TODO Auto-generated catch block
	    }
	    finally {
	    httpclient.getConnectionManager().shutdown();
	    }
		return false;

Est-ce que tu pourrais me donner quelques astuces, je ne sais pas c'est suffisant pour cette classe :S

Et qu'en est-il donc pour mon Web activity, quelque chose comme ceci ?

   		DefaultHttpClient mClient = new DefaultHttpClient();
   		CookieSyncManager.createInstance(this);
   		CookieSyncManager.getInstance().startSync();

   		Cookie sessionInfo;
   		List cookies = mClient.getCookieStore().getCookies(); 

Un grand merci d'avance ! Et bon weekend :D

Lien vers le commentaire
Partager sur d’autres sites

Il faut effectivement que tu récupères le/les cookies positionnés par ton serveur lors de l'authentification, pour pouvoir les passer ensuite aux requêtes suivantes, afin que ton serveur retrouve ses petits. Tu n'es pas obligé de les gérer à la main, utilise pour cela CookieManager

Rebonjour, j'ai essayé avec ce bout de code dans le même code (login.java) pour stocker les cookies (j'ai utilisé HttpClient et la méthode POST)

            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
   		CookieSyncManager.createInstance(this);
   		CookieSyncManager.getInstance().startSync();

Ensuite, je dois pouvoir les réutiliser dans une autre activité nommée (webview.class) pour récupérer le cookie concernant la Session PHP.

Et là je suis bloqué...

Merci d'avance !

Lien vers le commentaire
Partager sur d’autres sites

Tu peux implémenter un Service (cf doc, "Service local") qui regroupera tous les traitements liés à la communication réseau, et que tes Activities appelleront en fonction de leurs besoins

Lien vers le commentaire
Partager sur d’autres sites

Rebonjour,

Merci de m'avoir répondu ! Je ne vois pas du tout comment faire un (web service) pour gérer les cookies...

Mon idée étant de stocker les cookies de Login.java et de les conserver et réutiliser dans ma classe Web.java pour exploiter ma Session PHP !

J'ai essayé de cette manière pour enregistrer les cookies de Login.java.

	    HttpClient httpclient = new DefaultHttpClient();
	    HttpPost httppost = new HttpPost("http://www.monsite.com/index.php");

	    try {

            BasicCookieStore cookieStore = new BasicCookieStore();
            HttpContext localContext = new BasicHttpContext();
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

	        // Data
	        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
	        nameValuePairs.add(new BasicNameValuePair("mail", email));
	        nameValuePairs.add(new BasicNameValuePair("password", password));
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

	        // Post Request
	        HttpResponse response = httpclient.execute(httppost);
	        HttpEntity entity = response.getEntity(); // new

            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();

            String result = sb.toString();
            String[] result_splitted = TextUtils.split(result, "<!DOCTYPE");

            Toast.makeText(this, result_splitted[0],Toast.LENGTH_LONG).show();

            System.out.println(response.getStatusLine());
            if (entity != null) {
                Toast.makeText(this, "Response content length: " + entity.getContentLength(),Toast.LENGTH_LONG).show();
            }
            List<Cookie> cookies = cookieStore.getCookies();
            for (int i = 0; i < cookies.size(); i++) {
                Toast.makeText(this, "Local cookie: " + cookies.get(i),Toast.LENGTH_LONG).show();
            }

	    }catch (ClientProtocolException e) {
	        // TODO Auto-generated catch block
	    } catch (IOException e) {
	        // TODO Auto-generated catch block
	    }
	    finally {
	    httpclient.getConnectionManager().shutdown();
	    }
		return false;

Je ne sais pas si c'est suffisant ?

Et concernant mon activité Web :

   		DefaultHttpClient mClient = new DefaultHttpClient();
   		CookieSyncManager.createInstance(this);
   		CookieSyncManager.getInstance().startSync();

   		Cookie sessionInfo;
   		List cookies = mClient.getCookieStore().getCookies(); 

Je suis assez perdu...

Un grand merci d'avance ! Et bon weekend ! :D

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...