2009-07-29 18 views
9

Espero que esto sea relativamente sencillo de hacer, y que mis habilidades de google simplemente me hayan fallado en esta ocasión. Tengo un recurso de autenticación BASIC protegido del que quiero que PHP realice una solicitud POST HTTP en contra.Issue FORM POST Request From PHP using HTTP Basic Authentication

He intentado inyectar Autenticación: Básico (cifrado de datos u/p) en las cabeceras que no aparecen para trabajar - por lo que me pregunto, ¿pueden los poderes de Greyskull significo Stackoverflow proporcionar cualquier orientación.

$req .= "&cmd=_initiate_query"; 
$header = "POST /someendpoint HTTP/1.1\r\n". 
     "Host:example.com\n". 
     "Content-Type: application/x-www-form-urlencoded\r\n". 
     "User-Agent: PHP-Code\r\n". 
     "Content-Length: " . strlen($req) . "\r\n". 
     "Connection: close\r\n\r\n"; 
$fp = fsockopen ('ssl://example.com', 443, $errno, $errstr, 30); 
if (!$fp) { 
    // HTTP ERROR 
} else { 
    fputs ($fp, $header . $req); 
    while (!feof($fp)) { 
     $result .= fgets ($fp, 128); 
    } 
    fclose ($fp); 
} 
+0

¿Ha intentado (o tiene acceso) usar curl para esto? – bumperbox

+0

Buen punto, algo que debería haber dicho. Estoy intentando minimizar (si no negar) el requisito de modificaciones a php.ini. Ya tuve que activar la extensión OpenSSL para hacer SSL ... lo cual es un problema, y ​​CURL puede ser una opción, pero prefiero explorar todas las avenidas sin CURL primero. –

Respuesta

3

Usando:

$header = "POST /someendpoint HTTP/1.1\r\n". 
     "Host:example.com\n". 
     "Content-Type: application/x-www-form-urlencoded\r\n". 
     "User-Agent: PHP-Code\r\n". 
     "Content-Length: " . strlen($req) . "\r\n". 
     "Authorization: Basic ".base64_encode($username.':'.$password)."\r\n". 
     "Connection: close\r\n\r\n"; 

debería funcionar - ¿Estás seguro de que es un sistema de autenticación básico? Puede valer la pena ver los datos de encabezado sin procesar usando algo como CharlesProxy para asegurar que sea una autenticación (¡y también podrá copiar la cadena de autorización!).

+0

Gracias Richy, eso es lo que tenía. Me pregunto si lo escribí en inglés británico (es decir, Autorización), lo que obviamente no funcionaría. Investigará este enfoque más. –

+1

Dedos cruzados: como británico, he hecho que la Autorización/Autorización se deslice algunas veces yo mismo. También he conocido algunos sitios de autenticación que comprueban el encabezado HTTP_REFERER (sic) para "autenticación adicional" junto con el uso de cookies (sí, malditamente complejo para automatizar los inicios de sesión). CharlesProxy (o el Fiddler de Microsoft) le permitirá ver lo que está enviando su navegador y le permitirá replicarlo en el código. –

-2

Aquí hay una función que uso para realizar solicitudes POST. Es de esperar que puede hacer lo que quiera:

function http_post($server, $port, $url, $vars) { 

// get urlencoded vesion of $vars array 
$urlencoded = ""; 

foreach ($vars as $Index => $Value) 
    $urlencoded .= urlencode($Index) . "=" . urlencode($Value) . "&"; 

$urlencoded = substr($urlencoded,0,-1); 

$headers = "POST $url HTTP/1.0\r\n" 
. "Content-Type: application/x-www-form-urlencoded\r\n" 
. "Content-Length: ". strlen($urlencoded) . "\r\n\r\n"; 

$fp = fsockopen($server, $port, $errno, $errstr, 10); 
if (!$fp) return "ERROR: fsockopen failed.\r\nError no: $errno - $errstr"; 

fputs($fp, $headers); 
fputs($fp, $urlencoded); 

$ret = ""; 
while (!feof($fp)) $ret .= fgets($fp, 1024); 

fclose($fp); 
return $ret; } 

Y he aquí un ejemplo de mí usarlo para remitir las variables POST a una API

$response = http_post("www.nochex.com", 80, "/nochex.dll/apc/apc", $_POST); 
+0

Gracias, pero parece ser más o menos lo que tengo y no trata el asunto de la pregunta: autenticación HTTP básica. –