2009-07-29 93 views
9

我希望这是一个相对直接的事情,并且我的谷歌技能在这个场合简直失败了。我有一个BASIC身份验证受保护资源,我希望PHP执行POST HTTP请求。使用HTTP基本认证从PHP发出FORM POST请求

我已经试过注射身份验证:基本的(加密U/P数据)成似乎没有工作的头 - 所以我不知道,可以Greyskull的我的意思是StackOverflow上的权力提供任何指导。

$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

您是否尝试过(或有权访问)为此使用卷曲? – bumperbox 2009-07-29 08:30:30

+0

好点,我应该说。我试图最小化(如果不是否定的话)修改php.ini的要求。 我已经必须激活OpenSSL扩展才能完成SSL ......这很痛苦,CURL可能是一种选择,但我宁愿先不用CURL来探索所有途径。 – 2009-07-29 08:36:04

回答

3

使用我的一个例子:

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

应工作 - 你确定它是一个基本认证系统吗?使用类似CharlesProxy这样的值来观察原始标题数据可能是值得的,以确保它是一种认证(并且您也可以复制授权字符串!)。

-2

这是我用来执行POST请求的函数。希望它可以做你想做什么:

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

下面是用它来对POST变量转发到API

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

谢谢,但这似乎是我所拥有的,并没有处理这个问题 - HTTP基本身份验证问题。 – 2009-07-29 08:48:34