2009-07-29 10 views
9

Spero che questa sia una cosa relativamente semplice da fare e che le mie competenze di Google mi abbiano semplicemente fallito in questa occasione. Ho una risorsa protetta con autenticazione BASIC che voglio che PHP esegua una richiesta HTTP POST contro.Invia FORM Richiesta POST da PHP utilizzando l'autenticazione di base HTTP

ho cercato di iniettare autenticazione: di base (dati crittografati u/p) nelle intestazioni che non sembrano funzionare - così mi chiedo, possono i poteri di Greyskull intendo StackOverflow fornire alcuna guida.

$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

hai provato (o hai accesso) a usare arricciatura per questo? – bumperbox

+0

Buon punto, qualcosa che avrei dovuto dire. Sto cercando di minimizzare (se non negare) il requisito per le modifiche a php.ini. Ho già dovuto attivare l'estensione OpenSSL per fare SSL..questo è un dolore, e CURL può essere un'opzione, ma preferirei esplorare tutte le vie senza prima CURL. –

risposta

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"; 

Dovrebbe funzionare - sei sicuro che sia un sistema di autenticazione di base? Può valere la pena guardare i dati dell'intestazione cruda usando qualcosa come CharlesProxy per assicurarsi che sia un'autenticazione (e sarete quindi in grado di copiare anche la stringa di autorizzazione!).

+0

Grazie Richy, questo è quello che ho avuto - mi chiedo se l'ho scritto in inglese britannico (cioè l'autorizzazione) che ovviamente non funzionerebbe. Investigherà ulteriormente su questo approccio. –

+1

Incrocio le dita: come inglese, ho fatto l'autorizzazione/autorizzazione a scivolare un paio di volte. Ho anche conosciuto alcuni siti di autenticazione controllare l'intestazione HTTP_REFERER (sic) per "autenticazione aggiuntiva" insieme a usare anche i cookie (sì, dannatamente complesso per automatizzare gli accessi!). CharlesProxy (o Microsoft Fiddler) ti consente di vedere cosa sta inviando il tuo browser e ti consente di replicarlo nel codice. –

-2

Ecco una funzione che utilizzo per eseguire le richieste POST. Speriamo che si può fare quello che vuoi:

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; } 

Ed ecco un esempio di me utilizzarlo per trasmettere sulle variabili POST ad un'API

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

Grazie, ma sembra essere più o meno quello che ho e non affronta la questione della domanda: l'autenticazione di base HTTP. –

Problemi correlati