https-Seite mit Authentifizierung mittels cUrl holen?

Alles, was PHP betrifft, kann hier besprochen werden.

https-Seite mit Authentifizierung mittels cUrl holen?

Postby kschroeder » 21. December 2010 09:13

Hallo,

ich würde gerne den Inhalt einer Https-Seite holen, die eine Authentifizierung erfordert. Das heisst, es geht ein Browser-Popup auf, dass nach Benutzername und Passwort fragt.
Ich habe auf der PHP-Hilfe zwar einige Beispiele gefunden, aber diese funktionieren leider nicht.
Vielleicht kann mir jemand helfen, wie ich das hinbekomme?

So sieht mein bisheriges Script aus, dass bei Seiten ohne Benuzer-/Passwort-Abfrage funktioniert:

Code: Select all
function open_https_url($url,$refer,$usecookie) {
    if ($usecookie) {
        if (file_exists($usecookie)) {
            if (!is_writable($usecookie)) {
                return "Error: Can't write to $usecookie cookie file, create an empty cookie.txt file in same folder as script";
            }
        } else {
            $usecookie = "cookie.txt";
            if (!is_writable($usecookie)) {
                return "Error: Can't write to $usecookie cookie file, create an empty cookie.txt file in same folder as script";
            }
        }
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt ($ch, CURLOPT_HTTPAUTH, "CURLAUTH_ANY");
   curl_setopt ($ch, CURLOPT_USERPWD, "myusername:mypassword");
   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt ($ch, CURLOPT_SSLVERSION, 3);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
   curl_setopt($ch, CURL_HTTP_VERSION_1_1, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    if ($usecookie) {
        curl_setopt($ch, CURLOPT_COOKIEJAR, $usecookie);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $usecookie);   
    }
    if ($refer != "") {
        curl_setopt($ch, CURLOPT_REFERER, $refer );
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   $result = curl_exec ($ch);
   $info = curl_getinfo($ch);
   if ($result === false || $info['http_code'] != 200) {
      $result = "Error: No cURL data returned for $url [". $info['http_code']. "]";
      if (curl_error($ch)) {
         $result .= "\n". curl_error($ch);
      }
   }
   curl_close ($ch);
   return $result;
}

$dateiurl = "https://myserver.com/info/abfrage?OpenAgent&test1&test2&test3";

$datei = open_https_url($dateiurl,"",true);

print $datei;
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby Nobbie » 21. December 2010 11:02

curl_setopt ($ch, CURLOPT_HTTPAUTH, "CURLAUTH_ANY");


Das ist in jedem Fall ein dicker Fehler, richtig wäre das:

Code: Select all
curl_setopt ($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);


Das sind vordefinierte Konstanten und gehören nicht in Quotes. Wenn das nicht hilft, würde ich sowieso stattdessen CURLAUTH_BASIC benutzen (ausprobieren).
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby kschroeder » 21. December 2010 11:19

Danke für die Antwort.
Ich habe die Quotes entfernt und sowohl Basic als auch Any ausprobiert.
Als Antwort erhalte ich immer "Error: No cURL data returned for...."
Selbst wenn ich absichtlich ein falsches Kennwort angebe.

Ich hab auf einer anderen Seite folgenden Code gefunden und ebenfalls versucht:
Hier wird überhaupt nichts zurückgegeben. Auch egal welches Kennwort :(

Code: Select all
$headers = array(
   "POST ".$page." HTTP/1.0",
   "Accept: text/html",
   "Cache-Control: no-cache",
   "Pragma: no-cache",
   "Authorization: Basic " . base64_encode($credentials)
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

$data = curl_exec($ch);
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby Nobbie » 21. December 2010 11:56

Auf http://www.php.net findet man bei curl_setopt() dieses Beispiel (ACHTUNG: dieses Beispiel wie auch dein letzter Code-Schnipsel ist für POST geschrieben, nicht für GET, das musst Du anpassen!):

Code: Select all
Hi,
Anyone who is interested in submitting their information by post to HTTPS site (e.g. payment gateway) where https page needs basic authentication before submitting the information. below code will be helpful.

<?php
$submit_url = "https://sitename/process.php";

$curl = curl_init();

curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_SSLVERSION,3);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($curl, CURLOPT_URL, $submit_url);

$data = split("text/html", curl_exec($curl) );
$temp = split("\r\n", $data[1]) ;

$result = unserialize( $temp[2] ) ;

print_r($result);
curl_close($curl);
?>


Da ich mit cURL noch nie etwas gemacht habe, kann ich Dir sonst nicht weiterhelfen, das musst Du selbst hinkriegen. Das ist mir zu aufwändig, mich da selbst einzuarbeiten, da ich es nicht benötige.

Ich würde aber mal versuchen, den URL-Wrapper von PHP zu bemühen, der ist nämlich ganz schön intelligent. Der unterstützt nämlich das sonst nicht standardisierte Format, UserID und Passwort in der URL mitzugeben. Und da auch das Protokoll https unterstützt wird, sollte das eigentlich gehen. Ein Beispiel sähe so aus:

Code: Select all
<?php
     $page = file_get_contents("https://myuser:mypassword@www.domain.com/ordner/datei?param1&param2");
     echo $page;
?>


Dazu muss aber der URL_Wrapper aktiviert sein (Ist er aber, glaube ich zumindest, im Xampp Standardzustand). Wenn in der URL Sonderzeichen sind (Spaces usw.), kannst Du sie nicht 1:1 übergeben, sondern musst sie vorher mit urlencode() konvertieren.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby kschroeder » 21. December 2010 14:07

Ich habe den ersten Code-Schnipsel mal für Get umgebaut (d.h. einfach die Post-befehle entfernen, da GET Standard ist.)
jetzt bekomme ich immer die Meldung Unauthorized Access....

Das zweite Code-Schnipsel funktioniert leider auch nicht, er scheint die mitgegebenen Authentifizierungs-Informationen zu ignorieren.

Wenn ich anonymen Zugriff gestatte, also die Authentifizierung abschalte, dann funktioniert das file_get_contents wunderbar.
Ich hatte auch nur deshalb cUrl in Betracht gezogen, um die Authentifizierung sauber mitzugeben, scheint aber an meinem Grundverständnis zu scheitern.
Offenbar ist die Seite mit eingeschalteter Authentifizierung vielleicht auch etwas komplexer als üblich.
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby Nobbie » 21. December 2010 16:22

kschroeder wrote:Offenbar ist die Seite mit eingeschalteter Authentifizierung vielleicht auch etwas komplexer als üblich.


Ist das überhaupt eine HTTP Authorisierung? Vielleicht ist es das ja gar nicht.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby kschroeder » 21. December 2010 16:27

Es ist in jedem Fall eine klassische HTTP Authentifizierung, Basic, base64.
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby Nobbie » 21. December 2010 16:41

Woher weißt Du das?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby kschroeder » 22. December 2010 07:08

Weil das in der Dokumentation des Server so angegeben ist.
Und mir dies auch von anderer Seite (externer Dienstleister für die Betreuung dieses Servers) bestätigt wurde.
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Re: https-Seite mit Authentifizierung mittels cUrl holen?

Postby Nobbie » 22. December 2010 10:39

Dann fällt mir nichts mehr ein, das musst Du alleine hinkriegen.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04


Return to PHP

Who is online

Users browsing this forum: No registered users and 18 guests