Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVA] HTTP Authentification basique

Sujet résolu
    13 avril 2008 à 16:30:45

    bonjour, dans le cadre d'un exo de cours, je doit réaliser un serveur Java qui demande une authentification basique HTTP. J'ai fait le programme plus bas, qui est sencée réaliser la première étape (demande d'authenfication, pas vérification du mot de passe), mais quand je teste en localhost (bon port), avec mon navigateur web, il ne se passe rien, (il semblerais que le navigateur n'envoi attendent quelquechose du serveur au niveau de la ligne en bleu, et n'envoi rien)

    Voici le programme :

    -------------------------------------------------------------------------------------
    import java.io.*; import java.net.*;
    public class FormServer {
    public static void main (String args[]) {
    String l;
    try {
    ServerSocket serv = new ServerSocket(2000); System.out.println("formserver created at port 2000.");
    while (true) {
    Socket c = serv.accept();
    LineNumberReader i = new LineNumberReader(new InputStreamReader(c.getInputStream()));
    PrintWriter o= new PrintWriter(c.getOutputStream(), true);
    while (true) { System.out.println(l = i.readLine()); if (l.equals("")) break;}

    o.println("HTTP/1.0 200 OK"); o.println("Server: SWCM/1.0"); o.println("MIME-version: 1.0");
    o.println("Content-type: text/html"); o.println("HTTP/1.0 401 Unauthorized"); o.println("WWW-Authenticate:Basic Realm=\"SWCM example\""); o.println(""); // Cabecera

    o.println("Authentification basica, contrasena = asignatura");
    System.out.println(l = i.readLine());

    o.println("<HTML> <BODY>"); // Cuerpo
    o.println("<H1> Servidor SWCM </H1>");
    o.println("muchas gracias por su transacción<br>El producto es SWCM27 y la clave es XC5h7-67YH5");
    o.println("</BODY> </HTML> ");
    c.close();
    }
    }
    catch (IOException e) { System.err.println(e); }
    }
    }

    --------------------------------------------------------------------------------------
    PS : parmis les contraintes, il est demandé de ne pas fermer la connection au cours du dialogue HTTP

    Quelqu'un saurais m'aider?

    Merci

    Romuald
    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2008 à 21:31:52

      Ajoute le champ Content-Length comme ça il n'y a pas d'ambiguïté si le client a tout reçu ou pas. Je ne sais pas si ça va t'aider beaucoup, mais techniquement le client n'a aucun moyen de savoir sauf si la connexion est fermée...
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        13 avril 2008 à 21:39:57

        Citation : Zyxozyx

        Je ne sais pas si ça va t'aider beaucoup, mais techniquement le client n'a aucun moyen de savoir sauf si la connexion est fermée...


        Personnellement, je code un petit serveur HTTP en C, et je trouve bien plus simple de couper la connexion pour indiquer que la connexion est terminée. De plus, c'est tout à fait standard et ça marche très bien ...
        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2008 à 22:08:45

          Merci à vous, Vos solution n'étaient pas suffisante, il y avait un autre problème en plus : la requete Http était en meme temps une requete de OK et une requète d'authenfication. Voici donc le code : (version avec content-length)

          -----------------------------------------------
          import java.io.*; import java.net.*;
          public class FormServer {
          public static void main (String args[]) {
          String l;
          try {
          ServerSocket serv = new ServerSocket(2000); System.out.println("formserver created at port 2000.");
          while (true) {
          Socket c = serv.accept();
          LineNumberReader i = new LineNumberReader(new InputStreamReader(c.getInputStream()));
          PrintWriter o= new PrintWriter(c.getOutputStream(), true);
          while (true) { System.out.println(l = i.readLine()); if (l.equals("")) break;} // Solicitud
          o.println("HTTP/1.0 401 Unauthorized"); o.println("Server: SWCM/1.0"); o.println("MIME-version: 1.0");o.println("Content-length: 0");
          o.println("WWW-Authenticate:Basic Realm=\"SWCM example\""); o.println(""); // Cabecera
          o.println("Authentification basica, contrasena = asignatura");

          LineNumberReader p = new LineNumberReader(new InputStreamReader(c.getInputStream()));
          System.out.println(l = p.readLine());


          // je lirais plus de ligne en réalité plus tard, pour pouvoir extraire le mot de passe inscrit, et rediriger l'utilisateur selon que le mot de passe est bon ou non


          o.println("<HTML> <BODY>"); // Cuerpo
          o.println("<H1> Servidor SWCM </H1>");
          o.println("muchas gracias por su transacción<br>El producto es SWCM27 y la clave es XC5h7-67YH5");
          o.println("</BODY> </HTML> ");
          c.close();
          }
          }
          catch (IOException e) { System.err.println(e); }
          }
          }
          ---------------------------------------
          • Partager sur Facebook
          • Partager sur Twitter
            14 avril 2008 à 7:20:45

            Citation


            Personnellement, je code un petit serveur HTTP en C, et je trouve bien plus simple de couper la connexion pour indiquer que la connexion est terminée.
            De plus, c'est tout à fait standard et ça marche très bien ...


            Je crois sauf erreur que c'était le comportement préconisé en HTTP 1.0....

            @Luciano6666  
            : Juste une remarque avec ton code précédent : tu mets le Content-Length à 0. C'est pas très clean, enfin je trouve.... Idéalement il faudrait une valeur réelle.

            Sinon je serais ravi de savoir comment tu vas faire pour le base64. Je n'ai jamais vu cette fonction en Java. Accessoirement le md5 et le sha1 non plus d'ailleurs.
            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2008 à 9:42:13

              oui en effet la méthode fermant la connection est plus clean et marche mieux (finalement j'ai fait les deux, on verra bien ce qui passera). Pour la convertion à partir de base 64, voila :

              ---------------------------------------

              import java.util.*;
              byte[] buf = new sun.misc.BASE64Decoder().decodeBuffer(mot_en_B64);
              String mot_en_String = new String(buf);
              System.out.println(pass);
              --------------------------------------
              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2008 à 9:53:53

                Ah, autrement dit c'est une classe propriétaire un peu cachée non ?
                • Partager sur Facebook
                • Partager sur Twitter

                [JAVA] HTTP Authentification basique

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown