Martina H.: HTTP Authentifizierung übersenden

Hallo Gemeinde,

ich möchte einen Cronjob aufsetzen, welcher in regelmäßigen Abständen Werte an eine entfernte Gegenstelle per GET Command übergibt.
Ich habe es recht einfach mit

fopen ("http://webseite.ath.cx/stat.cgi?trc0p0=222", "r");

versucht, aber das funktioniert nicht, da die Seite per HTTP Authentifizierung geschützt ist.
Wie kann ich das Problem lösen? Hatte es mit

fopen ("http://user:passwort@webseite.ath.cx/stat.cgi?trc0p0=222", "r");

versucht. Das geht zwar im Browser, aber nicht durch den Cronjob.
Wenn ich Papa Google frage, finde ich immer nur die "andere Seite", also wie man die Authentifizierung selbst mit PHP nutzt.

Ich hoffe sehr, ihr könnte mir irgendwie helfen.

Danke! Liebe Grüße,
Martina

  1. hi,

    versucht, aber das funktioniert nicht, da die Seite per HTTP Authentifizierung geschützt ist.
    Wie kann ich das Problem lösen?

    Mach ein Socket auf und gibt dem GET Request den entsprechenden Header

    Authorization: Basic $credentials

    mit. Nach dem Header dann eine Leerzeile.

    Hotti

    1. Moin!

      Mach ein Socket auf und gibt dem GET Request den entsprechenden Header

      Und wenn das zu kompliziert ist nimm wget. Die Hilfeseite ist hier.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Moin,

        Und wenn das zu kompliziert ist nimm wget.

        Mein ehemaliger Kollege aus Kassel hat auch immer 'wget' genommen und 'lynx'.

        H-O-tti

        1. Moin!

          Mein ehemaliger Kollege aus Kassel hat auch immer 'wget' genommen und 'lynx'.

          Lynx wäre etwas daneben. Aber wget ist echt stark und gehört in vielen Distributionen zur Grundausstattung.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

    2. Hey,

      Mach ein Socket auf und gibt dem GET Request den entsprechenden Header

      Authorization: Basic $credentials

      mit. Nach dem Header dann eine Leerzeile.

      Danke, aber leider verstehe ich es nicht ganz. Könntest du mir den netten Tip nochmal genauer schreiben?

      LG, Martina

      1. Moin!

        Danke, aber leider verstehe ich es nicht ganz. Könntest du mir den netten Tip nochmal genauer schreiben?

        Wenn es php sein MUSS (was nicht glaube) ist curl hilfreich.

        Literatur: http://www.php.net/manual/de/book.curl.php

        In jedem anderen Fall empfehle ich ein dafür vorgesehenes Werkzeug zu benutzen. Wget ist hier der Kandidat der Wahl. Das geht auch mittels System-Aufrufs innerhalb von php:

        $strAntwort=wget -O - --user=user- --password=password -- http://webseite.ath.cx/stat.cgi?trc0p0=222;`

        Brauchst Du statt der abgeholten Ressource eine Erfolgsmeldung, dann versuche:

        $bol=`wget -O /dev/null `--user=user- --password=password -- http://webseite.ath.cx/stat.cgi?trc0p0=222; echo $?;`;  
          
        if (0 == $bol) {  
            # erfolg  
        } else {  
            # misserfolg  
        }
        

        Achte auf die Backticks.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Moin!

          Korrektur:

          Das Backtick vor --user=user  und das Minus danach weglassen:

          Also:

          wget -O - --user=user --password=password

          respektive:

          wget -O /dev/null --user=user --password=password

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Hallo Fastix,

            sorry, mit wget kann ich gar nichts anfangen. Hab auch nur ein Webpack bei Hosteurope, da gibts das sicherlich gar nicht. Sollte also PHP sein. Über das curl bin ich glaube ich schon gestolpert. Mal sehen, ob ich da als Anfänger überhaupt durchsteige...

            Danke!

            1. Moin!

              sorry, mit wget kann ich gar nichts anfangen. Hab auch nur ein Webpack bei Hosteurope, da gibts das sicherlich gar nicht.

              probieren kostet nichts:

              <?php  
              echo `wget -O - http://www.google.de`;  
              ?>
              

              liefert im Erfolgsfall Google extra-light

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix

              1. DANKE!! Auch wenn es nicht so meine Art ist, dass ich es mit etwas gelöst habe, was ich gar nicht kenne und überhaupt nicht verstehe, aber es klappt!

                Langsam gingen mir auch die Nerven aus...

                Danke, lieben Dank an euch beide!

                Martina

      2. hi,

        Danke, aber leider verstehe ich es nicht ganz. Könntest du mir den netten Tip nochmal genauer schreiben?

        Getestet :)

          
        $credentials = base64_encode('user:password');  
          
        $sock = socket_create(AF_INET, SOCK_STREAM, 0);  
        $status = socket_connect($sock, 'rolfrost.de', 80);  
        $status = socket_write($sock, "GET /index.html HTTP/1.0\nAuthorization: Basic $credentials\n\n");  
        $status = socket_read($sock, 255, PHP_BINARY_READ);  
          
        print $status;  
        
        

        sock_read: Länge ggf. von 255 weiter erhöhen, dass Du mehr siehst (Über den Header hinaus). Obenstehender Code ist nicht schön, verbessern darfst Du gerne.

        Horst Roggenbrot

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
        1. Danke Horst,

          habs jetzt versucht:

          $credentials = base64_encode('user:pw');  
            
          $sock = socket_create(AF_INET, SOCK_STREAM, 0);  
          $status = socket_connect($sock, 'webseite.ath.cx', 80);  
          $status = socket_write($sock, "GET /hcs_stat.cgi?trc0p0=333 HTTP/1.0\nAuthorization: Basic $credentials\n\n");  
          $status = socket_read($sock, 1024, PHP_BINARY_READ);
          

          Klappt aber leider nicht ganz, bekomme als antwort:
          HTTP/1.0 401 Unauthorized WWW-Authenticate: Basic realm="default" Authentication Required!

          Brauche ich eine andere Art?

          LG, Martina

          1. hi,

            wenn alles passt:

              
            $credentials = base64_encode('user:password'); // hier Klartext  
            $sock = socket_create(AF_INET, SOCK_STREAM, 0);  
            socket_connect($sock, 'rolfrost', 80); // nur domain-Name!!!  
            socket_write($sock, "GET /index.html HTTP/1.0\nAuthorization: Basic $credentials\n\n"); // Slash ist wichtig!!! (Pfad ab Server-Root)  
            $res = socket_read($sock, 255, PHP_NORMAL_READ); // gibt nur die erste Zeile der Response  
            print $res;  
              
            // user:password stimmt nicht  
            // HTTP/1.1 401 Authorization Required  
              
            // user:password OK  
            // HTTP/1.1 200 OK  
            
            

            Mach bei socket_read() PHP_NORMAL_READ, die Response hat dann nur eine Zeile, die reichen sollte, zu sehen, ob es funktioniert.

            1. ich hab auch nur den Domain-Namen drin:

              webseite.ath.cx

              ansonsten alles nach deinem Tip. Kommt jedoch weiterhin
              HTTP/1.0 401 Unauthorized

              Bin wahrscheinlich zu doof, oder schon zu lange dran....

              1. hi,

                ansonsten alles nach deinem Tip. Kommt jedoch weiterhin
                HTTP/1.0 401 Unauthorized

                Benutzername:Passwort

                stimmt nicht. Wenn es stimmt, siehst Du status 200

                Hotti

              2. Moin!

                Versuche es doch mal mit geeigneteren Mitteln:

                Literatur:
                http://www.php.net/manual/de/function.curl-setopt.php

                Suche dort nach "HTTPAUTH".

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix

                1. jetzt habe ich doch noch eine Frage. Hast du eine Idee, warum ein zweiter Parameter nicht übergeben wird?

                  $strAntwort=wget -O - --user=user --password=pw -- http://webseite.ath.cx/hcs\_stat.cgi?trs1=1&trs2=2;

                  LG. Martina

                  1. Moin!

                    jetzt habe ich doch noch eine Frage. Hast du eine Idee, warum ein zweiter Parameter nicht übergeben wird?

                    $strAntwort=wget -O - --user=user --password=pw -- http://webseite.ath.cx/hcs\_stat.cgi?trs1=1&trs2=2;

                    Ja. Mein Fehler.

                    Der Content-Wechsel: Innerhalb der Shell muss entweder das & maskiert werden:

                    $strAntwort=`wget -O - --user=user --password=pw -- http://webseite.ath.cx/hcs_stat.cgi?trs1=1\&trs2=2`;  
                    
                    

                    ... oder Du schließt die URL in Quotas ein:

                    $strAntwort=wget -O - --user=user --password=pw -- "http://webseite.ath.cx/hcs_stat.cgi?trs1=1&trs2=2";

                    Beides funktioniert. Letzteres ist die bessere Lösung.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix

                    1. Einen abschließenden Guten Abend!

                      $strAntwort=wget -O - --user=user --password=pw -- "http://webseite.ath.cx/hcs_stat.cgi?trs1=1&trs2=2";

                      Beides funktioniert. Letzteres ist die bessere Lösung.

                      Hat jetzt wunderbar funktionert. Nochmal vielen, vielen lieben Dank!

                      LG, Martina

              3. Hallo nochmal,

                mit hat das mit dem PHP keine Ruhe gelassen. Habs jetzt nochmal probiert und die länge der Antwort erweitert. Jetzt kam dann auch mehr "Antwort":

                HTTP/1.0 401 Unauthorized WWW-Authenticate: Basic realm="default" Authentication Required!

                Könnte dieses realm="default" noch der Grund sein, warum es mit folgendem Code nicht geht?

                $credentials = base64_encode('user:password'); // hier Klartext  
                $sock = socket_create(AF_INET, SOCK_STREAM, 0);  
                socket_connect($sock, 'rolfrost', 80); // nur domain-Name!!!  
                socket_write($sock, "GET /index.html HTTP/1.0\nAuthorization: Basic $credentials\n\n"); // Slash ist wichtig!!! (Pfad ab Server-Root)  
                $res = socket_read($sock, 255, PHP_NORMAL_READ); // gibt nur die erste Zeile der Response  
                print $res;
                

                Danke und Grüße,
                Martina

  2. Hallo Martina,

    versucht, aber das funktioniert nicht, da die Seite per HTTP Authentifizierung geschützt ist.
    Wie kann ich das Problem lösen? Hatte es mit

    fopen ("http://user:passwort@webseite.ath.cx/stat.cgi?trc0p0=222", "r");

    versucht.

    Das ist aber laut PHP-Handbuch die korrekte Vorgehensweise und bei mir funktioniert das so auch. (Hinweis: Eigentlich ist das mit User + Passwort kein gültiger HTTP-URL, allerdings haben die PHP-Entwickler es so gemacht, dass PHP es dennoch schluckt. Viele Browser tun das auch, aber im Browser kann man sich im Gegensatz zu PHP nicht drauf verlassen.)

    Wenn es bei Dir nicht klappt, dann muss der Fehler woanders liegen. Was ist denn die Fehlermeldung, die erzeugt wird?

    Viele Grüße,
    Christian