2009-07-29 39 views
9

Tôi hy vọng đây là một điều tương đối thẳng về phía trước để làm, và kỹ năng google của tôi đã đơn giản là thất bại trong dịp này. Tôi có một tài nguyên bảo mật xác thực BASIC mà tôi muốn có PHP thực hiện một yêu cầu POST HTTP chống lại.Vấn đề MẪU BÀI ĐĂNG ĐĂNG KÝ Từ PHP bằng cách sử dụng Xác thực HTTP cơ bản

Tôi đã thử tiêm Xác thực: Basic (mã hóa u/p dữ liệu) vào các tiêu đề đó đã không xuất hiện để làm việc - vì vậy tôi tự hỏi, các quyền hạn của Greyskull tôi có nghĩa là StackOverflow có thể cung cấp bất kỳ hướng dẫ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

bạn đã thử (hoặc có quyền truy cập) để sử dụng curl cho điều này? – bumperbox

+0

Điểm tốt, điều tôi nên nói. Tôi đang cố gắng để giảm thiểu (nếu không phủ nhận) yêu cầu sửa đổi để php.ini. Tôi đã có để kích hoạt phần mở rộng OpenSSL để làm SSL ... đó là một nỗi đau, và CURL có thể là một lựa chọn nhưng tôi thà khám phá tất cả các con đường mà không có CURL đầu tiên. –

Trả lời

3

Sử dụng:

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

Nên hoạt động - bạn có chắc đó là một hệ thống xác thực cơ bản không? Có thể đáng xem dữ liệu tiêu đề thô bằng cách sử dụng thông tin như CharlesProxy để đảm bảo đó là xác thực (và sau đó bạn sẽ có thể sao chép chuỗi ủy quyền!).

+0

Cảm ơn Richy, đó là những gì tôi đã có - Tôi tự hỏi nếu tôi đã viết nó bằng tiếng Anh Anh (tức là Authorization) mà rõ ràng là không hoạt động. Sẽ điều tra thêm cách tiếp cận này. –

+1

Ngón tay vượt qua: với tư cách là người Anh, tôi đã tự mình thực hiện giấy ủy quyền/Ủy quyền một vài lần. Tôi cũng đã biết một số trang xác thực kiểm tra tiêu đề HTTP_REFERER (sic) để "xác thực bổ sung" cùng với việc sử dụng cookie (yep, phức tạp chết để tự động đăng nhập!). CharlesProxy (hoặc Fiddler của Microsoft) sẽ cho phép bạn xem những gì trình duyệt của bạn đang gửi và cho phép bạn sao chép mã đó. –

-2

Đây là hàm tôi sử dụng để thực hiện yêu cầu POST. Hy vọng rằng nó có thể làm những gì bạn muốn:

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

Và đây là một ví dụ về tôi sử dụng nó để chuyển tiếp vào các biến POST để một API

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

Cảm ơn, nhưng điều đó dường như là khá nhiều những gì tôi có và không đối phó với vấn đề của câu hỏi - Xác thực HTTP cơ bản. –

Các vấn đề liên quan