POST-Request mit Proxy Authentifizierung
tobeit
- php
Hallo zusammen,
es ist nun schon wieder eine Weile her, dass ich geschrieben hab, wieviel Zeit so ein Diplomarbeit frisst ^^
Aber nun hab ich mal wieder ein Anliegen und zwar überarbeite ich derzeit meinen Server-Zugriff mittels PHP!!
Bisher habe ich einen Socker zum Proxy geöffnet und meine Request runter geschrieben und daraufhin ein Ergebnis im XML-Format zurück erhalten. Jedoch hat sich zum Jahreswechsel hin die Authorisierung über den Proxy geändert. Im Browser wird dies alles über ein pac-Skript gemanaget, in meinem Programm muss ich dies jetzt nachbilden bzw. ein anderes Verfahren verwenden!!
Mir wurde empfohlen mittels Basic Authentification base64-codiert den Request vorzunehmen, wie gebe ich dies im Header an?? Bzw. was muss ich beachten?? Wie kann ich die Codierung vornehmen?? Was gibt es da an entsprechender Literatur im Web?? Ich denke, ich bin noch nicht richtig in der Thematik durch gestiegen um nach den passenden Informationen zu suchen, deshalb bin ich über jede Anregung dankbar ...
Als Zusatz, hier mein bisheriger Code
$handle = @fsockopen($proxy_name, $proxy_port, $errno, $errstr);
// Header schreiben
$out = "POST http://".$host."/Service1.asmx/GetLogEntries HTTP/1.1\r\n";
$out .= "Host: ".$host.":80\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($request)."\r\n";
$out .= "Connection: close\r\n\r\n";
$out .= $request; // POST-Parameter
fwrite($handle, $out);
// Antworten lesen und in Buf zwischenspeichern
while (!feof($handle))
$buf .= fgets($handle,128);
fclose($handle);
print $buf;
Schon mal vielen Dank im Voraus und Grüße
tobeit
Hi tobeit,
Ich denke, ich bin noch nicht richtig in der Thematik durch gestiegen um nach den passenden Informationen zu suchen, deshalb bin ich über jede Anregung dankbar ...
Nach meinen kurzen Recherchen gerade, ist ein PAC-Script nichts anderes als eine Proxy-Autokonfiguration. Im Prinzip rufst der Browser da eine Ressource ab und erhält davon einen Javascript-ähnlichen Code, welchen der Browser evaluiert und damit seine Proxy-Einstellungen automatisch setzt. Das besondere daran ist, dass diese Ressource natürlich von PHP o.ä. dynamisch generiert sein kann und somit abhängig von den Tageszeiten, abhängig von der IP, von der aus du das PAC-Script aufrufst oder von irgendeinem anderen, den Netzwerk-Administratoren gefallenden Faktor sein kann.
Finde also zunächst heraus, welche Proxy-Einstellungen das PAC-Script vornimmt, damit du diese manuell nachbauen kannst.
Alles was nun folgt, ist lediglich ein ganz normaler Request über einen zugangsgeschützten Proxy. Dabei probiert der Browser zunächst eine Nutzung des Proxys ohne sich dafür zu authentifizieren, womit er vom Proxy mit einem 406 Proxy Authentication Required und Details im Proxy-Authenticate Header in der Response belohnt wird. Also zeigt der Browser nun ein Eingabefeld für Benutzername und Passwort an und versucht den Request noch einmal, unter Verwendung des Proxy-Authorization Headers beim Request.
Sind die Zugangsdaten für den Proxy korrekt gewesen, so liefert der Proxy die gewünschte Seite. Dies kann z.B. mit 200 OK geschehen, oder aber auch mit 401 Unauthorized, falls der Zielserver ebenfalls noch eine Authorisierung erforder, Details stehen dann im WWW-Authenticate Header in der Response. Nun kann der Browser erneut nach Benutzername und Passwort fragen, diesmal für den Zielserver und danach wieder einen Request starten. Für diesen Request muss natürlich erneut der Proxy-Authorization Header (für den Proxy) gesendet werden, weil wir sonst wieder von vorne anfangen würden *g* Zusätzlich wird nun aber noch der Authorization Header mitgeschickt (für den Zielserver).
Und dann hat der Browser hoffentlich seine Seite erhalten, welche er anzeigen soll. Uff. ;-)
Viele Grüße,
~ Dennis.
Hallo Dennis,
vielen Dank für die ausführliche Antwort, mit dem wenigen Wissen, dass ich mir gestern durch erfragen und recherchieren erarbeitet habe, läuft dies doch auf Folgendes hinaus ...
Das Verfahren, das Du mir beschrieben hast, müsste die Basic Authentification sein. Dafür hab ich sogar schon eine Implementierung in PHP gefunden, dies sieht dann so aus:
// Socket zu Proxy öffnen
$handle = @fsockopen($proxy_name, $proxy_port, $errno, $errstr);
$proxy_user = ""; // muss noch eingerichtet werden
$proxy_pass = "";
$out = "POST http://".$host."/Service1.asmx/GetLogEntries HTTP/1.1\r\n";
$out = "Proxy-Authorization: Basic ". base64_encode ("$proxy_user:$proxy_pass")."\r\n"
$out .= "Host: ".$host.":80\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($request)."\r\n";
$out .= "Connection: close\r\n\r\n";
$out .= $request;
fwrite($handle, $out);
Mein derzeitiges Problem beschränkt sich jetzt wohl nur noch auf die Netzwerk-Strukturen, in denen ich arbeite. Warte darauf, dass mir ein User eingerichtet wird, der dem Proxy dann bekannt ist und den Zielserver erreichen darf!!
Grüße