[Tutorial] Login Sytem | Systиme d'authentification -MYSQL-
#1

[SIZE="7"][CENTER][MYSQL] Systиme d'authentification[/CENTER][/SIZE]
[CENTER]Dans ce tutoriel, vous apprendrez а faire un systиme de compte par joueur en mysql.[/CENTER]

[SIZE="5"]Somaire[/SIZE]
  1. Partie MYSQL
  2. Partie PAWN
La version de MYSQL utilisй est la r39

[SIZE="5"]1.Partie MYSQL[/SIZE]
Dans cette partie, nous allons crйй la table qui stockera
Cette table comprendra 3 colonnes :
- une colonne ID ( de type int, auto incrйmentй, index : primary) qui stockera l'ID de la rangйe,
- une colonne pseudo ( de type varchar (24 caractиres) ) qui stockera les pseudos,
- et une colonne password ( de type text ) qui stockera les mots de passe.
[Image: 1.sql.jpg]
C'est tout pour la partie MYSQL.

[SIZE="5"]2.Partie PAWN[/SIZE]
Dans cette partie nous allons rйdigй le code qui servira pour le systиme.
Il y aura 3 sous partie :
  1. Vйrification de l'existence de compte
  2. Register
  3. Login
Nous allon dйjа dйfinir les dialogs.
[pawn]
#define DIALOG_REGISTER 0
#define DIALOG_LOGIN 1[/pawn]
Mettez sa tout en haut de votre script.

[SIZE="4"]1.Vйrification de l’existence du compte[/SIZE]
Comme dit dans le titre, nous allons vйrifiй si le compte est dйjа prйsent dans la base de donnйes.
Pour ce faire, nous allons utilisй la callback OnPlayerConnect().

Tout d'abord nous allons dйfinir nos variables qui servirons а stocker le nom du joueur et la requкtes а effectuer.
[pawn]new name[MAX_PLAYER_NAME+1], query[120];[/pawn]
Ensuite on rйcupиre le nom du joueur
[pawn]GetPlayerName(playerid,name,sizeof(name));[/pawn]
On rйdige la requкtes SQL qu'on incrйmente а query et qu'on exйcute.
mysql_format(mysql,query,sizeof(query),"SELECT * FROM membre WHERE pseudo='%s'",name);
mysql_query(mysql,query);

Via la requкtes effectuй prйcйdemment, on check si les donnйes sont prйsente dans la base de donnйe. Pour faire зa, on vйrifie le nombre de rangйe rйcupйrй.
[pawn]
if(cache_get_row_count() == 1)
{ //le compte existe
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"LOGIN","Entrez votre mot de passe ci-dessous","ok","");
}
else if(cache_get_row_count() == 0)
{ //le compte n'existe pas

ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"REGISTER","Entrez un mot de passe ci-dessous","ok","");
}
else
{ //Erreur : problиme dans la base de donnйes
SendClientMessage(playerid,-1,"Il y a un problиme dans la base de donnйes, veuillez contactй un administrateur.");
SetTimerEx("ErrorDB",1000,false,"i",playerid);
}
[/pawn]
Je traduit la condition :
Si le nombre de rangйe est йgal а 1, c'est que le compte existe, ( on lui affiche le dialog pour ce login )
Sinon si le nombre de rangйe est йgal а 0, c'est que le compte n'existe de pas, ( on lui affiche le dialog pour ce register )
Sinon si le nombre est йgal ni а un ni а 0, c'est qu'il y a un problиme dans la base de donnйes ( si par exemple cache_get_row_count() retourne 2, c'est qu'il y a des doubles dans la base de donnйes ).

Voilа c'est aussi simple que зa. ((:

[SIZE="4"]2.Register[/SIZE]
Ici nous allons rйdigй le bout de code qui servira dans le cas oщ le joueur n'est pas enregistrй dans la base de donnйes.

Ce code est a placй а cette endroit
[pawn]
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_REGISTER)
{
// ICI
}
return 1;
}
[/pawn]

Dйjа, on vйrifie si il ne quitte pas la boоte de dialog.
[pawn]
if(!response)
{
ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"REGISTER","Entrez un mot de passe ci-dessous","ok","");
}
[/pawn]

On ajoute ensuite а la suite de ce code , le code suivant
[pawn]
else
{
if(strlen(inputtext) < 1)
{
ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"REGISTER","Entrez un mot de passe ci-dessous","ok","");
}
else
{
new query[120],name[MAX_PLAYER_NAME+1];
GetPlayerName(playerid,name,sizeof(name));
mysql_format(mysql,query,sizeof(query),"INSERT INTO membre(pseudo,password) VALUES('%s',MD5('%s'))",name,inputtext);
mysql_query(mysql,query);
SendClientMessage(playerid,-1,"Enregistrement rйussi.");
}
}
[/pawn]
Dans ce bout de code, on vйrifie si la boоte de dialog n'est pas vide. Si elle est vide, on la rйaffiche.
Sinon si elle n'est pas vide, on dйclare les variables qui stockeront la requкte et le nom du joueur.
Ensuite, on formate puis on exйcute la requкte qui insert les donnйes du joueur dans la base de donnйes et on lui envoie un message pour lui dire qu'il s'est enregistrй avec succиs.

remarque : 'MD5()' sert a cryptй le mot de passe. Si un jour vous vous faites volй votre passe de donnйes, le voleur n'aura pas accиs au mot de passe, car ils seront cryptй. ( а ma connaissance, le MD5 ne peut pas кtre dйcryptй ).

[SIZE="4"]3.Login[/SIZE]
Ici nous allons rйdigй le bout de code qui servira dans le cas oщ le joueur est dйjа enregistrй dans la base de donnйes.

Ce code est a placй а cette endroit
[pawn]
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_LOGIN)
{
// ICI
}
return 1;
}
[/pawn]

Pareil que pour le register, on vйrifie si il ne quitte pas la boоte de dialog.
[pawn]
if(!response)
{
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"LOGIN","Entrez votre mot de passe ci-dessous","ok","");
}
[/pawn]

Ensuite on ajoute ce bout de code а la suite
[pawn]
else
{
if(strlen(inputtext) < 1)
{
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"LOGIN","Entrez votre mot de passe ci-dessous","ok","");
}
else
{
new query[120],name[MAX_PLAYER_NAME+1];
GetPlayerName(playerid,name,sizeof(name));
mysql_format(mysql,query,sizeof(query),"SELECT * FROM membre WHERE pseudo='%s' AND password=MD5('%s')",name,inputtext);
mysql_query(mysql,query);

if(cache_get_row_count() == 1){ //Mot de passe correcte
SendClientMessage(playerid,-1,"Connexion rйussi.");
}
else if(cache_get_row_count() == 0){ //Mot de passe incorrecte
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"LOGIN","Mot de passe incorrecte.","ok","");
}
}
}
[/pawn]

Ici, le dйbut est pareil que pour le register.
On vйrifie que la boоte de dialog n'est pas vide, si elle est vide on lui rйaffiche la boоte de dialog.
Sinon si elle n'est pas vide, on crйй les variables qui stockeront le nom et la requкte а exйcuter, on incrйmente name avec le nom du joueur, on formate la requкte, et on l'exйcute.
Pour la requкtes, je vais vous la dйcrire :
Elle sйlectionne toute les rangйes de la table membre qui contienne le pseudo du joueur et le mot de passe йcrit ( directement cryptй ).
Aussi simple que зa.

Ensuite, on vйrifie si la requкte retourne des rangйe.
Si oui, c'est que le mot de passe est correcte, on lui affiche message pour lui dire qu'il s'est connectй avec succиs. si elle on retourne aucune, le mot de passe est incorrecte. On lui rйaffiche donc le dialog.

Et voilа vous savez maintenant crйй un systиme d'authentification tout simple. ((:



Voilа ce tuto est terminй j'espиre qu'il vous aura plus et aussi, j'espиre qu'il en aidera plus d'un !
C'est mon premier tuto donc si vous avez des critiques ( constructive merci bien ) , n'hйsitez pas а me les faire par !
Sur ceux, See you all !
Reply
#2

Propre, merci а toi.
Reply
#3

Tutoriel sympathique.

Je te conseille d'utiliser mysql_tquery, imagine qu'il y ait un reboot du gamemode et que plusieurs joueurs se connectent en mкme temps, il y aura un micro laps temps et pourrait stopper durant а peu prиs 1 seconde toutes exйcutions de code.

Ah oui aussi, prйcise la version du plugin mysql de BlueG que tu utilises, tout le monde ne possиde pas les fonctions threadйes et de cache.
Reply
#4

D'acc merci pour tes conseils.
Reply
#5

Merci du partage :)
Reply
#6

Oui зa serait bien que tu donnes l'archives complиte du Plugin avec les includes pour Linux ou Windows, sinon parfait :)
Reply
#7

Jolie tuto, merci a toi !
Reply
#8

%e avec mysql_format au lieu de %s pour sйcurisй contre les injections SQL.

Pas besoin de 24 caractиres pour l'username parce que c'est 20 max, et pas de TEXT pour le password, tu met un vachar de la taille d'un MD5.

Merci du tuto
Reply
#9

Noliax8;3320633 Wrote:%e avec mysql_format au lieu de %s pour sйcurisй contre les injections SQL.

Pas besoin de 24 caractиres pour l'username parce que c'est 20 max, et pas de TEXT pour le password, tu met un vachar de la taille d'un MD5.

Merci du tuto

Depuis les derniиres versions de MySQL, le %e est useless йtant donnй que le %s = corrigй.
Reply
#10

Baltimore;3320734 Wrote:Depuis les derniиres versions de MySQL, le %e est useless йtant donnй que le %s = corrigй.


https://sampwiki.blast.hk/wiki/MySQL/R33#mysql_format

Lit moi stp
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)