Salut tout le monde,
J'ai récemment commencé un tutoriel sur la création complète d'un lanceur Minecraft, que j'ai laissé à l'abandon après avoir perdu mes deux derniers chapitres à cause d'une mauvaise manip'.
Cependant, étant sur le bon chemin, et ayant peut-être des gens suivant le tutoriel, j'ai décidé d'expliquer clairement (mais brièvement) comme s'authentifier auprès de Mojang en C# et Visual Basic .NET.
I. Télécharger MojangAPI
L'authentification n'étant pas tant fastidieuse, mais plutôt répétitive à écrire, j'en ai fais une bibliothèque de classe, dont le code source est disponible, et qui est utilisable en Visual Basic et en C#.NET.
Vous pouvez cliquer sur le bouton Download ZIP au-dessus de l'arborescence pour télécharger le code source ; la .dll est à la racine (MojangAPI.dll).
II. Créer une requête d'authentification
Afin de vous authentifier auprès de Mojang, vous devez, via MojangAPI, envoyer une requête contenant l'identifiant du joueur (nom de compte ou adresse mail) et son mot de passe.
À noter › Le mot de passe sera envoyé tel quel ; non-crypté.
1. Déclaration de la requête
Pour envoyer la requête, en présumant que vous avez déjà intégré MojangAPI dans votre projet et l'avez importé dans votre classe, vous devez créer la requête telle que suit :
Code (vbnet):
Dim AuthRequest As New Request(Method.POST, URL.AUTHENTICATION.SIGN_IN)
Code (csharp):
Request authRequest
= new Request
(Request
.Method.POST, URL
.AUTHENTICATION.SIGN_IN);
Pour les novices, voici quelques explications.
AuthRequest est le nom de la variable qui permet d'identifié l'objet de type Request créé.
Ici, Method.POST est le premier paramètre du constructeur de l'objet Request, et correspond au type de requête (donc un POST, c'est une requête HTTP), et URL.AUTHENTICATION.SIGN_IN contient l'adresse de destination de la requête. (cc @Pyxel )
2. Déclaration de la réponse
La requête étant créée, nous devons créer l'objet qui contiendra la réponse.
C'est un objet de type AuthenticationResponse, dont la structure permet une récupération aisée du pseudonyme de l'utilisateur (en cas de connexion par mail), du token utilisateur et client (pour un rafraichissement de la connexion).
Code (vbnet):
Dim RawResponse As String = AuthRequest.Execute(Headers.Authentication.Signin("[username/mail]", "[password]"))
Dim AuthenticationResponse As New AuthenticationResponse(RawResponse)
Code (csharp):
String rawResponse
= authRequest
.Execute((string)Header
.Authentication.Signin("[username/mail]",
"[password]"))
AuthenticationResponse authResponse
= new AuthenticationResponse
(rawResponse
);
Pour les novices, c'est pareil que tout à l'heure, sauf que le type est un string (chaine de caractères), que remplira le retour de la fonction Execute, qui est une fonction de la classe Request, dont AuthRequest est la variable.
La variable AuthenticationResponse, elle, est de type AuthenticationResponse (comme son nom), qui a besoin d'un paramètre, qui se trouve être la réponse de la requête, RawResponse.
Remplacez évidemment [username/mail] et [password] par les données correspondantes.
À noter › N'oubliez pas de faire une vérification avant d'envoyer la requête. Évitez de mettre directement TXT_USERNAME.Text et TXT_PASSWORD.Text dans les paramètres de la requête ; car l'utilisateur n'a peut-être rien mit. Il serait plus sage de vérifier s'ils sont vides ou non ; auquel cas avertir l'utilisateur.
La requête va s'exécuter au niveau de la méthode AuthRequest.Execute. Si vous voulez déclarer la variable RawResponse plus tôt pour une raison quelconque, vous devrez donc la déclarer nulle (Nothing en VB.NET, null en C#) et exécuter la requête plus tard dans le code.
3. Lecture de la réponse
La requête a été envoyée et sa réponse est stockée dans une variable AuthResponse : vous pouvez maintenant la lire pour savoir si votre utilisateur est connecté, ou si l'authentification a échoué pour une quelconque raison (que vous pouvez récupérer aussi).
Code (vbnet):
If AuthResponse.GetResponse.Error = Nothing Then
Console.WriteLine("PlayerName: " & AuthResponse.GetResponse.PlayerName)
Console.WriteLine(" AccessToken: " & AuthResponse.GetResponse.AccessToken)
Console.WriteLine(" ClientToken: " & AuthResponse.GetResponse.ClientToken)
Else
Console.WriteLine("Authentication failed.")
Console.WriteLine("PlayerName: " & AuthResponse.GetResponse.PlayerName)
Console.WriteLine(" ErrorType: " & AuthResponse.GetResponse.Error)
Console.WriteLine(" ErrorMessage: " & AuthResponse.GetResponse.ErrorMessage)
End If
Code (csharp):
if (authResponse.GetResponse.Error == null) {
Console.WriteLine("PlayerName: " & authResponse.GetResponse.PlayerName);
Console.WriteLine(" AccessToken: " & authResponse.GetResponse.AccessToken);
Console.WriteLine(" ClientToken: " & authResponse.GetResponse.ClientToken);
} else {
Console.WriteLine("Authentication failed.")
Console.WriteLine("PlayerName: " & authResponse.GetResponse.PlayerName);
Console.WriteLine(" ErrorType: " & authResponse.GetResponse.Error);
Console.WriteLine(" ErrorMessage: " & authResponse.GetResponse.ErrorMessage);
}
Ici, la manière la plus simple de vérifier qu'il n'y a pas eu d'erreur d'authentification, est de vérifier si le contenu de AuthResponse.GetResponse.Error n'est pas nul.
Auquel cas, vous pouvez récupérer la raison de cette erreur dans AuthResponse.GetResponse.ErrorMessage.
Pour résumer, voici le code complet en C# et en Visual Basic.
Code (vbnet):
Dim AuthRequest As New Request(Method.POST, URL.AUTHENTICATION.SIGN_IN)
Dim RawResponse As String = AuthRequest.Execute(Headers.Authentication.Signin("Hawezo", "[password]"))
Dim AuthenticationResponse As New AuthenticationResponse(RawResponse)
If AuthResponse.GetResponse.Error = Nothing Then
Console.WriteLine("PlayerName: " & AuthResponse.GetResponse.PlayerName)
Console.WriteLine(" AccessToken: " & AuthResponse.GetResponse.AccessToken)
Console.WriteLine(" ClientToken: " & AuthResponse.GetResponse.ClientToken)
Else
Console.WriteLine("Authentication failed.")
Console.WriteLine("PlayerName: " & AuthResponse.GetResponse.PlayerName)
Console.WriteLine(" ErrorType: " & AuthResponse.GetResponse.Error)
Console.WriteLine(" ErrorMessage: " & AuthResponse.GetResponse.ErrorMessage)
End If
Code (csharp):
Request authRequest
= new Request
(Request
.Method.POST, URL
.AUTHENTICATION.SIGN_IN);
String rawResponse
= authRequest
.Execute((string)Header
.Authentication.Signin("[username/mail]",
"[password]"))
AuthenticationResponse authResponse
= new AuthenticationResponse
(rawResponse
);
if (authResponse
.GetResponse.Error == null) {
Console
.WriteLine("PlayerName: " & authResponse
.GetResponse.PlayerName);
Console
.WriteLine(" AccessToken: " & authResponse
.GetResponse.AccessToken);
Console
.WriteLine(" ClientToken: " & authResponse
.GetResponse.ClientToken);
} else {
Console
.WriteLine("Authentication failed.")
Console
.WriteLine("PlayerName: " & authResponse
.GetResponse.PlayerName);
Console
.WriteLine(" ErrorType: " & authResponse
.GetResponse.Error);
Console
.WriteLine(" ErrorMessage: " & authResponse
.GetResponse.ErrorMessage);
}
Vous savez maintenant comment authentifier votre joueur dans votre lanceur.
Je vais probablement écrire d'autres exemples de codes pour les autres types de requêtes disponibles :
- API Status - permet de savoir si les serveurs de Mojang sont disponibles ;
- UUID at time - permet d'obtenir l'UUID du compte correspondant à un certain pseudonyme utilisé à un certain temps ;
- Name history - permet d'obtenir l'historique des pseudonymes d'un joueur ;
- UUIDs - permet d'obtenir des informations sur un joueur, ainsi que son UUID ;
- Profil + Skin/cape - permet d'obtenir des informations détaillées sur un joueur, ainsi que les URL (encodées en base64) de son skin et de sa cape (permet aussi de vérifier si le compte a payé le jeu ou non) ;
- Toutes les authentifications (connexion, déconnexion, rafraichissement, invalidation, et validation).
Pour information, j'ai pu développer cette bibliothèque grâces aux pages sur Yggdrasil et Mojang API.