IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

[HTTP] Authentification htaccess


Sujet :

Développement

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut [HTTP] Authentification htaccess
    Bonjour,

    Je cherche à récupérer le contenu d'un fichier qui est protégé par une authentification htaccess basic.

    J'ai réussi à trouver un bride de requête HTTP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GET http://domain.com/fichier.txt HTTP/1.0
    Authorization: Basic bG9naW46cGFzcwo=
    bG9naW46cGFzcwo= correspondant au couple login:password uuencodé.

    Mais je reçois en réponse un accès refusé :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>401 Authorization Required</title>
    </head><body>
    <h1>Authorization Required</h1>
    <p>This server could not verify that you
    are authorized to access the document
    requested.  Either you supplied the wrong
    credentials (e.g., bad password), or your
    browser doesn't understand how to supply
    the credentials required.</p>
    </body></html>

    Je développe en C à la de la bibliothèque gnet.

    Je suis nul en ce qui concerne les réseaux donc je me tourne vers vous pour savoir si je suis parti dans la bonne voie et pourquoi ça ne fonctionne pas ?


  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    C'est encodé en base64 :
    Pour obtenir l'autorisation d'accès, le client enverra l'user-ID et le mot de passe, séparatés par un "deux-points" (":"), le tout encodé en base64 [5].

    Accréditif_de_base = "Basic" SP cookie-basique

    cookie-basique = ["userID-mot_de_passe" encodé base64 [5],
    limité à 76 char/line]

    userID-mot_de_passe = [ nom_ID ] ":" *TEXT
    Et gnet semble te proposer le nécessaire

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par julp Voir le message
    C'est encodé en base64 :

    Et gnet semble te proposer le nécessaire
    Non ça ne marche pas mieux : j'obtiens la même chaîne (c'est plus simple à faire avec la fonction qui va bien c'est déjà ça de gagné )

    Je me demande s'il ne pas quelque chose à ma requête ?

    Je suis sous Linux et j'ai bien mis les sauts de ligne "\r\n"

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Sous firefox, je te conseilles de télécharger le mode LiveHTTPHeaders qui permet de visualiser en direct les requêtes http (côté client en réception et en envoi).

    Tu fais un test réel (avec le navigateur). Tu recupère la requête et t'as plus qu'à l'insérer dans ton code
    Je ne répondrai à aucune question technique en privé

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Je l'ai fait en PHP :
    Pour l'authentification j'ajoute l'entête :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete .= 'Authorization: Basic ' . base64_encode($infos['user'] . ':' . $infos['pass']) . "\r\n";
    Et la partie base64_encode me donne pour ton exemple :

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    J'avais juste oublié un espace entre l'url et HTTP (bien sûr en changeant l'url, je l'ai rajouté ) :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    command = g_strconcat ("GET ", from, " HTTP/1.0\r\n", "Authorization: Basic ", mdp_64, "\r\n", NULL);

    Bon maintenant le programme se bloque, c'est sûrement qu'il se passe quelque chose

  7. #7
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Bonjour,

    dans ces cas la ca vaut la peine de faire une capture avec TCPDump ou bien Wireshark (Wireshark est mieux puisque le filtrage est quand meme plus facile a creer) afin de voir si le serveur a besoin d'informations supplementaires, par exemple.

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Aramis Voir le message
    dans ces cas la ca vaut la peine de faire une capture avec TCPDump ou bien Wireshark (Wireshark est mieux puisque le filtrage est quand meme plus facile a creer) afin de voir si le serveur a besoin d'informations supplementaires, par exemple.
    Oui c'est possible qu'il manque des info, c'est la fonction g_io_channel_read qui permet de lire le un flux (tiens au passage elle est obsolète ) qui ne retourne pas.

    Je ré-ressayerai ce soir avec la requête complète

  9. #9
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    bien entendu je ne peux que partager mon experience. Quand je developpe des applications distribuees/client/server et etc j'utilise moi aussi des fonctions de debuggage internes aux programmes. Cependant, je trouve l'utilisation d'utilitaire tel que TCPDump ou WireShark une tres bonnes additions a mon arsenal. Apres tout, ce sont des outils tres bien fait, solide, et qui tres rarement tombent en panne comme la fonction g_io_channel_read .

    Bon courage,

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Aramis Voir le message
    WireShark
    J'aurais dû plus écouter sur les bancs de la fac, on avait fait un TP avec

    En tout cas très efficace pour trouver le problème :
    Checksum: 0x6210 [incorrect, should be 0xae0a (maybe caused by "TCP checksum offload"?)]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    0000  00 07 cb 44 b8 1b 00 18  f3 ec ed ab 08 00 45 00   ...D.... ......E.
    0010  00 ae 57 d9 40 00 40 06  81 01 c0 a8 33 01 5b 79   ..W.@.@. ....3.[y
    0020  12 4d 87 4c 00 50 a8 a9  f4 05 b6 ca 9e 24 80 18   .M.L.P.. .....$..
    0030  00 5c 62 10 00 00 01 01  08 0a 00 10 a3 e0 63 ca   .\b..... ......c.
    0040  8c 42 47 45 54 20 68 74  74 70 3a 2f 2f            .BGET ht tp://
    Même résultat avec la version courte et complète de la requête.

    Le problème c'est que ça ne viens pas de moi l'entête

    Voici le code épuré :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*
     * from : url du fichier
     * mdp_64 : login:password "crypté" sur 64 bits
     */
    command = g_strconcat ("GET ", from, " HTTP/1.0\r\n", "Authorization: Basic ", mdp_64, "\r\n", NULL);
    gnet_io_channel_writen (iochannel, command, strlen (command), &n);
    g_io_channel_read (iochannel, buffer, sizeof (buffer), &n);

    C'est pourtant pas compliqué

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    J'ai refait mon code en utilisant les fonctions bas niveau Unix et j'ai toujours le même problème :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
     
    #define FROM "http://"
    #define MDP_64 "XXXX"
     
    static void download_file (void)
    {
      int fd;
      const char *command = NULL;
     
      command = "GET " FROM " HTTP/1.0\r\nAuthorization: Basic " MDP_64 "\r\n";
      fd = socket (AF_INET, SOCK_STREAM, 0);
      if (fd > 0)
      {
        struct sockaddr_in sin;
        struct hostent *hostinfo;
     
        hostinfo = gethostbyname ("developpez.com");
        sin.sin_addr = *(struct in_addr *)hostinfo->h_addr;
        sin.sin_port = htons (80);
        sin.sin_family = AF_INET;
        if (connect (fd, (struct sockaddr *)&sin, sizeof (struct sockaddr)) == 0)
        {
          if (write (fd, command, strlen (command) * sizeof (*command)) > 0)
          {
            char buf[BUFSIZ] = "";
     
            errno = 0;
            while (read (fd, buf, sizeof (buf)) >= 0)
            {
              printf ("%s\n", buf);
            }
            perror (NULL);
          }
          else
          {
            perror (NULL);
          }
        }
        else
        {
          perror (NULL);
        }
      }
      else
      {
        perror (NULL);
      }
    }
     
    int main (void)
    {
      download_file ();
      return 0;
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/08/2008, 17h28
  2. Réponses: 1
    Dernier message: 14/03/2008, 15h56
  3. authentification .htaccess / PHP
    Par nicoweb371 dans le forum Apache
    Réponses: 1
    Dernier message: 22/11/2006, 21h39
  4. [HTTP] authentification par méthode post
    Par G00x2 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 03/07/2005, 15h05
  5. [passwd user http]authentification
    Par ould dans le forum Sécurité
    Réponses: 2
    Dernier message: 08/07/2004, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo