1. Le forum de Minecraft-France va définitivement fermer ses portes. Celui-ci restera en lecture seule mais vous ne pourrez plus y apporter de nouveaux topics. Nous vous invitons à nous rejoindre sur le Discord de Minecraft-France qui permet de présenter vos projets, discuter avec la communauté etc.. Merci à tous d'avoir fait vivre ce forum de nombreuses années. Pour nous rejoindre sur Discord, Cliquez ici

Autres [.NET] S'authentifier auprès de Mojang

Discussion dans 'Tutoriels' créé par Hawezo, 5 Mar 2016.

  1. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    146
    Sexe:
    Homme
    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.


    [​IMG]


    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.

    [​IMG]

    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.


    III. Résumé


    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);
    }
     

    [​IMG]


    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.
     
    • J'aime J'aime x 2
    • Utile Utile x 1
    #1 Hawezo, 5 Mar 2016
    Dernière édition: 5 Mar 2016
  2. Polymeth

    Polymeth Mineur de Diamants

    Inscrit:
    16 Août 2014
    Messages:
    2 133
    Points:
    180
    Sexe:
    Homme
    Rah, c'est bête, j'avais comme projet de faire une API Mojang. Bon, soit, je trouve que le tutoriel est sympathique, même si il pourrait encore plus être détaillé. l'API a l'air bien complète et bien codée, le code est propre ainsi que le topic.
    Bravo à toi! ;)
     
    • J'approuve J'approuve x 1
    • Sympa Sympa x 1
  3. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    146
    Sexe:
    Homme
    Merci :)
    Rien ne t'empêche de faire ton API, toi aussi. Il y a plusieurs trucs que je n'ai pas inclus dans la mienne, et puis je n'en ai pas le monopole :p
    Question détails, que voudrais-tu que je rajoute ? Il me semblait assez détaillé, mais je veux bien que tu me dises quoi détailler ^^
     
    • Informatif Informatif x 1
  4. Polymeth

    Polymeth Mineur de Diamants

    Inscrit:
    16 Août 2014
    Messages:
    2 133
    Points:
    180
    Sexe:
    Homme
    En se disant que nous sommes sur un forum Minecraft, et que la communauté de Minecraft est majoritairement jeune, il faudrait argumenter les lignes de codes. Couper en plusieurs les lignes pour expliquer.
    Bon, expliquons.
    AuthRequest est le nom de la requête.
    As New Request désigne...
     
    • Informatif Informatif x 1
  5. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    146
    Sexe:
    Homme
    Voilà, c'est fait, brièvement. ^^
     
    • Utile Utile x 1

Partager cette page