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

Langage PHP Discussion :

Récupérer un fichier XML avec authentification HTTP


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut Récupérer un fichier XML avec authentification HTTP
    Bonjour,

    je cherche une solution pour pouvoir récupérer un fichier XML sur un serveur distant, et le dossier dans lequel se trouve le fichier est protégé par une authentification HTTP.

    J'ai trouvé la fonction suivante sur php.net :

    Code : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    function readHTTPDigestAuthenticatedFile($host,$file,$username,$password)
    {
        if (!$fp=fsockopen($host,80, $errno, $errstr, 15))
            return false;
     
        //first do the non-authenticated header so that the server
        //sends back a 401 error containing its nonce and opaque
        $out = "GET /$file HTTP/1.1\r\n";
           $out .= "Host: $host\r\n";
           $out .= "Connection: Close\r\n\r\n";
     
         fwrite($fp, $out);
     
        //read the reply and look for the WWW-Authenticate element
        while (!feof($fp))
        {
            $line=fgets($fp, 512);
     
            if (strpos($line,"WWW-Authenticate:")!==false)
                $authline=trim(substr($line,18));
        }
     
        fclose($fp);
     
        //split up the WWW-Authenticate string to find digest-realm,nonce and opaque values
        //if qop value is presented as a comma-seperated list (e.g auth,auth-int) then it won't be retrieved correctly
        //but that doesn't matter because going to use 'auth' anyway
        $authlinearr=explode(",",$authline);
        $autharr=array();
     
        foreach ($authlinearr as $el)
        {
            $elarr=explode("=",$el);
            //the substr here is used to remove the double quotes from the values
            $autharr[trim($elarr[0])]=substr($elarr[1],1,strlen($elarr[1])-2);
        }
     
        foreach ($autharr as $k=>$v)
            echo("$k ==> $v\r\n");
     
        //these are all the vals required from the server
        $nonce=$autharr['nonce'];
        $opaque=$autharr['opaque'];
        $drealm=$autharr['Digest realm'];
     
        //client nonce can be anything since this authentication session is not going to be persistent
        //likewise for the cookie - just call it MyCookie
        $cnonce="sausages";
     
        //calculate the hashes of A1 and A2 as described in RFC 2617
        $a1="$username:$drealm:$password";$a2="GET:/$file";
        $ha1=md5($a1);$ha2=md5($a2);
     
        //calculate the response hash as described in RFC 2617
        $concat = $ha1.':'.$nonce.':00000001:'.$cnonce.':auth:'.$ha2;
        $response=md5($concat);
     
        //put together the Authorization Request Header
        $out = "GET /$file HTTP/1.1\r\n";
           $out .= "Host: $host\r\n";
        $out .= "Connection: Close\r\n";
        $out .= "Cookie: cookie=MyCookie\r\n";
        $out .= "Authorization: Digest username=\"$username\", realm=\"$drealm\", qop=\"auth\", algorithm=\"MD5\", uri=\"/$file\", nonce=\"$nonce\", nc=00000001, cnonce=\"$cnonce\", opaque=\"$opaque\", response=\"$response\"\r\n\r\n";
     
        if (!$fp=fsockopen($host,80, $errno, $errstr, 15))
            return false;
     
        fwrite($fp, $out);
     
        //read in a string which is the contents of the required file
        while (!feof($fp))
        {
            $str.=fgets($fp, 512);
        }
     
        fclose($fp);
     
        return $str;
    }
    C'était exactement ce que je voulais, mais malheureusement ça me retourne ceci :

    Code : 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
    HTTP/1.1 302 Found
    Vary: Accept-Encoding
    Connection: close
    Location: https://xxx.xxx.com/dossier/fichier.xml
    Content-Length: 468
    Content-Type: text/html; charset=iso-8859-1
    Date: Tue, 01 Dec 2009 17:12:08 GMT
    Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/4.4.4-8+etch1 proxy_html/2.5 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
     
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>302 Found</title>
    </head><body>
     
    <h1>Found</h1>
    <p>The document has moved <a href="https://xxx.xxx.com/dossier/fichier.xml">here</a>.</p>
    <hr>
    <address>Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/4.4.4-8+etch1 proxy_html/2.5 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8 Server at partenaires.wexpay.com Port 80</address>
    </body></html>
    Il me dit que le fichier a changé d'adresse, mais il me redonne exactement la même que celui que je lui demande, du coup impossible de récupérer le fichier xml au final.

    Avez vous une idée de comment faire pour récupérer mon fichier avec cette fonction, ou alors avez vous une autre proposition pour essayer de lire ce fichier ?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    tu as essayé de récupérer le fichier comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu = file_get_contents('https://nomDUtilisateur:motDePasse@serveur/repertoire/fichier.xml');
    GNAP !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Ca ne marche pas directement comme ça, mais j'ai trouvé ceci qui fonctionne bien avec file_get_contents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function get_xml($username, $password)
    {
      $context = stream_context_create(array(
        'http' => array(
          'method'  => 'GET',
          'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                       "Content-type: application/x-www-form-urlencoded\r\n",
          'timeout' => 5,
        ),
      ));
      $xml = file_get_contents('https://xxx.xxx.com/dossier/fichier.xml', false, $context);
     
      return $xml;
    }
    En pensant bien à activer l'extension openssl de PHP.

    Le seul hic c'est que je dois travailler avec PHP4, et cette fonction ne fonctionne que avec PHP5, la faute à file_get_contents :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: file_get_contents() expects at most 2 parameters, 3 given in ...
    Une idée pour une solution alternative ?

  4. #4
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Je pencherais pour une utilisation de curl. J'ai déjà fait des requêtes sur des pages comportant une authentification http basic.

    Il faudra paramètrer curl avec ces paramètres ci pour prendre en compte l'authentification.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    curl_setopt($ressource,CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
    curl_setopt($ressource,CURLOPT_USERPWD,'username:password');
    Il faut biensur ajouter les autres options spécifique à tes besoins.
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ch = curl_init();
     
    curl_setopt($ch, CURLOPT_URL,"https://xxx.xxx.com/dossier/fichier.xml"); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, "login:pass"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     
    $res = curl_exec($ch);
    Ca marche bien merci, même en PHP4

    Pour ceux qui serait intéressé par la première fonction que j'ai mise, j'étais en train de voir qu'il faut mettre le port 443 au lieu de 80 pour le fsockopen, puisque c'est une adresse https.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 23
    Dernier message: 29/04/2014, 23h31
  2. Réponses: 3
    Dernier message: 11/03/2008, 01h14
  3. Modification de fichier XML avec XSLT
    Par osmoz dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/07/2005, 11h04
  4. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13
  5. [XML] comment récupérer un arbre xml posté par http ?
    Par tomperso dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/07/2004, 10h29

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