Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Système de Connexion

21 juillet 2015 à 18:22:14

Salut les Zér0s,

Je travaille sur un système d'inscription/connexion. J'arrive à me connecter sur mon server, à envoyer les données nécessaires pour me dire si la connexion s'effectue avec succès ou pas. Cependant, dans mon script PHP, j'utilise des variables de Session pour que mon utilisateur reste connecté. Et je me retrouve confronté à un problème puisqu'il n'existe pas de variables de session sur android... Alors comment puis-je faire en sorte que l'utilisateur reste connecté?

De plus, je ne souhaite pas stocker le userName et son password dans des SharedPreferences car un téléphone rooter peut accéder à ses données ce qui me semble très peu sécurisé... Donc comment procéder d'une autre manière si je ne peux pas véritablement stocker localement ses 2 données?

J'ai trouvé sur certains forums en anglais que certains sites utilisent des tickets à durée limitée, et dès que ceci sont épuisés l'utilisateur est déconnecté, cependant je n'ai pas très bien compris le fonctionnement donc si vous connaissez ce principe n'hésiter pas à me l'expliquer :p Surtout que l'intérêt de celui-ci est que l'on n'a pas besoin de retenir localement le password.

Merci d'avance de votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2015 à 22:33:31

Pourquoi ne pas juste stocké un boolean avec l'id (si tu dois refaire une requete externe ailleurs par exemple) dans les sharedPreferences ? Si les identifiants sont corrects tu fais un truc du style setSession(true, id);

La fonction setSession ressemblant à un truc du genre :

public void setSession(boolean is_logged, String user_id){
        editor.putBoolean(IS_LOGGED, is_logged);
        editor.putString(USER_ID, user_id);
        editor.commit();
    }

Et une fonction que tu appeleras quand tu voudras vérif que l'utilisateur est bien authentifié : 

public boolean isLogged(){
        return pref.getBoolean(IS_LOGGED, false);
    }




  • Partager sur Facebook
  • Partager sur Twitter
23 juillet 2015 à 0:02:48

Salut ipsaous_new,

Ton idée est en effet une bonne idée cependant je suis embêté dans le sens où la connexion doit fonctionner sur le site web et sur l'application donc avec ton système comment puis-je faire une requête PHP sécurisé? Parce que cela me semble peu sécurisé puisque dans un script PHP si par exemple je veux modifier mon mot de passe alors un hacker pourrait envoyer un post isLogged en true, et ensuite prendre le pseudo de n'importe quel utilisateur puis enfin envoyer le mot de passe qu'il souhaite, ainsi il me semble que la sécurité est compromise :/ Aurai-tu une autre idée ou me détailler encore plus celle-ci?

En tout cas merci d'avoir contribué à la réponse de mon questionnement.

Merci d'avance de votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
23 juillet 2015 à 12:44:50

La vérification tu l'as fait avant d'envoyer ta requête. 

Par exemple, dans ton code java, tu récupères la valeur de Islogged et tu autorises l'acces à certaines pages ( le compte par exemple ) que si elle est valable. Ou tu peux juste envoyer la requête seulement si l'user est connecté. Dans ta requête t'envoi les mêmes informations que dans ton script php. Dans ton cas j'imagine oldPassword, newPassword, et newPasswordRepeat. A partir de là, ta sécu elle se fait dans ton script php, car c'est là que tu vas vérifier les infos postées avant de faire ton insertion.

Après j'suis pas un expert, loin de là même, mais j'suis dans le même cas que toi, dans le sens ou j'suis entrain de faire l'application de mon site et j'ai le même cas de figure du coup. Donc j'suis intéressé si il y a de meilleures façons ;).

-
Edité par IpProg 23 juillet 2015 à 12:48:11

  • Partager sur Facebook
  • Partager sur Twitter
23 juillet 2015 à 14:31:57

Salut à toi,

Oui justement le problème de cette méthode c'est que cela n'est pas sécurisé puisque on peut très bien envoyer le isLogged en true avec le pseudo que l'on veut (dans le script PHP) donc la sécurité ne doit pas se faire avant (dans l'application) mais après (dans le script PHP).

En sachant que j'aimerai que l'utilisateur reste connecté pour toujours dès lors qu'il s'est connecté une fois, et qu'il puisse se connecté sur autant de téléphone ou site web qu'il le veut, donc le boolean isLogged est problématique.

Il me faudrait absolument une aide, merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 9:06:28

Pas sûr de comprendre ce que tu dis ;).

La sécurité tu l'as fait bien dans le script PHP. Le "isLogged" sert juste à savoir si l'utilisateur s'est déjà authentifié sur cet appareil. Tu t'en sers juste comme vérification avant de faire tes requêtes, qui elles, seront contrôlé par ton script PHP. 

J'vois pas trop ce qui te pose problème du coup.

  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 13:55:01

Ce que tu as du mal à comprendre c'est qu'envoyer des données sur une page web de n'importe quel site est très simple. Une personne mal intentionnée peu très bien envoyer sur la page PHP deux POST data: le userName qu'il souhaite "pirater" et ensuite il a juste à envoyer une variable POST isLogged = true pour effectuer le script PHP et ainsi pirater n'importe quelle compte qu'il souhaite.

Si tu ne comprends toujours pas, j'aurai du mal à mieux t'expliquer mais ce système n'est pas du tout sécurisé puisque la sécurité doit certes être faite avant dans le script JAVA mais doit surtout être faite dans le script PHP qui lui doit s’assurer que l'utilisateur est bien connecté avant d'effectuer une action dans le script.

Imaginons:

Jack s'inscrit sur mon site. Il est par la suite connecté (Le script JAVA envoie une requête et créer ensuite deux sharedPreferences: userName, isLogged). Maintenant dès que Jack veut effectuer une action sur le site web via l'application tout fonctionne, il est bien connecté.

Jusque là tout marche mais la sécurité est compromise.

Maintenant Joe veut pirater Jack. Quoi de plus simple: Joe envoie deux POST variables sur une page PHP quelconque: imaginons pour modifier le mot de passe. Joe envoie donc deux POST data: isLogged = true et ensuite il choisit n'importe quel utilisateur en l'occurence il envoie userName = Jack. Il peut désormais envoyer de nouveaux mot de passe pour le compte de Jack et a donc pirater Jack super simplement sans aucune difficulté, et peut ainsi changer les mots de passe d'absolument tout les utilisateurs. La sécurité est alors compromise.

Bref fin de l'histoire, tu comprends mieux le problème que ton système pose?

C'est pour cela que j'ai besoin d'aide, je ne comprend pas comment effectuer un système sécurisé sans sauvegarder le mot de passe sur l'appareil.

  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 15:37:45

Au fait, je me suis dit que ce que j'essaie de faire depuis le début, c'est apporter le système de session sur android pour mon application, je vais donc m'orienter sur le fonctionnement des sessions PHP et ainsi reproduire ce système sur android :)

Mais si vous pouviez m'aider je suis preneur!

Merci d'avance.

-
Edité par Jack126 24 juillet 2015 à 16:19:37

  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 6:10:32

Connexion à  fb sur internet
  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 17:47:49

Mais cela ne résout pas le problème, je ne veux pas contourner le problème.

Comment facebook fait pour faire un système de connexion comme celui que je recherche? Si je voulais contourner le problème, je l'aurai fais et je n'aurai posé aucune question ici. Si je demande de l'aide c'est pour comprendre et résoudre un problème.

Merci d'avance si vous pouviez m'aider car cela fait 5 jours que je suis bloqué...

  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 18:24:57

Salut,

Le problème ne se situe pas du niveau d'Android. Malheureusement du côté applicatif, tu n'as pas des millions de possibilités. Le plus simple et le mieux reste de stocker dans les préférences utilisateurs un UUID unique correspond à ton utilisateur et à envoyer côté serveur pour retrouver ton utilisateur et effectuer les requêtes qui vont biens et qui correspondent à ton utilisateur.

Ce que tu souhaites en réalité faire c'est sécuriser ton API. Pour ça, tu peux regarder du côté de OAuth 2.

  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 18:33:49

Merci enfin une réponse qui commence à m'avancer. En effet, je souhaite faire cela. L'idée de générer un id unique est pas mal.

Sinon j'ai pensé à un autre système, peut tu m'indiquer si celui-ci est assez sécurisé:

L'utilisateur se connecte à partir de l'appli avec son userEmail et son userPass.

Côté PHP, on conçoit une table SQL qui s'occupe de gérer les gens connecter, quand un user se connecte, son userEmail, userId, et sessionKey (une clé unique qui pourrait être générée pour une durée limitée) sont mis dans une table et envoyé vers l'appli.

On récupère ensuite sur l'appli dans les SharedPreferences son userId, son userEmail et sa sessionKey. 

Ensuite à chaque requête on utilise ces 3 données là pour s'assurer que l'utilisateur est connecté. On change également la sessionKey toutes les 10-15 min pour s'assurer qu'elle ne soit pas pirater ou je ne sais quoi xD

Bref, mon système est-il sécurisé si je procède ainsi? 

  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 21:31:54

As-tu regardé ce que propose le système OAuth 2.0 ? Si j'étais toi, je me tournerai vers des systèmes reconnus plutôt qu'un système maison...

  • Partager sur Facebook
  • Partager sur Twitter
26 juillet 2015 à 22:44:57

J'ai regardé leur site mais je ne comprends pas trop ce qu'on doit faire, il y a des liens vers github mais je ne vois pas vraiment comment "installer" cela :/
  • Partager sur Facebook
  • Partager sur Twitter
4 août 2015 à 16:59:29

Up! J'aurai vraiment besoin d'aide pour utiliser OAuth, Merci d'avance.

-
Edité par Jack126 4 août 2015 à 16:59:55

  • Partager sur Facebook
  • Partager sur Twitter