2012-07-18 77 views
4

我正在嘗試實施一種驗證對美聯社訂閱源的請求的PHP方法。從他們的文檔:對AP WebFeed請求進行身份驗證

要認證所有的飼料和內容請求,AP WebFeeds系統使用HTTP基本認證,這是當前標準的聯合供稿。大多數提要閱讀器和閱讀器組件允許提前配置用戶憑據,並將它們傳遞到標題中而不是URL中。

重要:直接在URL中傳遞憑據目前被廣泛阻止。有關詳細信息,請參閱位於http://www.microsoft.com/technet/security/bulletin/MS04-004.mspx的Microsoft安全公告。

可以配置一個讀取器或組件來創建與以下列格式中的名稱/值的認證頭:

("Authorization", "Basic " + {Encoded_username_and_password})

其中{Encoded_username_and_password}替換爲字節串「,在Base64編碼用戶名密碼。」

如果您正在編寫自己的客戶端代碼以下載訂閱源,請使用內置於編程語言庫中的HTTP基本認證。 HTTP基本認證在大多數平臺上都可用;例如Perl,PHP,C或Java。

我的嘗試是:

/** 
* Begin Transaction 
*/ 

$url = "http://syndication.ap.org/AP.Distro.Feed/GetFeed.aspx?idList=" . implode(',', $idList) . "&idListType=products&maxItems=25";  
$auth = "Authorization=Basic " . base64_encode($user . ":" . $pass);  
$ch = curl_init(); // initialize curl handle 
curl_setopt($ch, CURLOPT_URL, $url); // set url to post to 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable 
curl_setopt($ch, CURLOPT_POST, 1); // set POST method 
curl_setopt($ch, CURLOPT_POSTFIELDS, $auth); // add POST fields 
$result = curl_exec($ch); // run the whole process 
curl_close($ch); 

/** 
* End Transaction 
*/ 

var_dump($result); 

這給了我:

string(405) " 

    Authentication 
    FeedServer 
    Authentication Failed on GetFeed 

    Authentication denied no auth credentials detected 

" 

什麼是驗證在PHP這個請求的正確方法是什麼?

See also the provided ASP.NET and Java examples

回答

1

Authorization is an HTTP header不是POST參數。您使用CURLOPT_POSTFIELDS設置請求的主體。相反,你需要使用CURLOPT_HTTPHEADER來設置它(它的入口是很遠在列表中向下):

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . base64_encode($user . ":" . $pass))); 

而在情況下,它是不是很明顯已經,你不需要做這個作爲POST請求(除非該API要求的話),這樣你就可以刪除:

curl_setopt($ch, CURLOPT_POST, 1); // set POST method 
0

您也可以使用此代碼:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $pass); 

我剛纔試了一下,它工作正常。

希望它有幫助。問候。

相關問題