验证AP WebFeed请求

时间:2012-07-18 01:03:12

标签: php authentication post

我正在尝试实现一种验证对Associated Press提要的请求的PHP方法。来自他们的文档:

  

要对所有Feed和内容请求进行身份验证,AP WebFeeds系统使用HTTP基本身份验证,该身份验证目前是联合供稿的标准。大多数提要阅读器和阅读器组件允许提前配置用户凭据,并将其传递到标头而不是URL中。

     

重要:目前广泛阻止直接在网址中传递凭据。有关详细信息,请参阅Microsoft http://www.microsoft.com/technet/security/bulletin/MS04-004.mspx上的安全公告。

     

您可以配置阅读器或组件,使用以下格式创建名称/值的身份验证标头:

     

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

     

其中{Encoded_username_and_password}替换为字符串“username: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

2 个答案:

答案 0 :(得分:1)

Authorization is an HTTP header不是POST参数。您使用了CURLOPT_POSTFIELDS来设置请求的正文。相反,您需要使用CURLOPT_HTTPHEADER设置它(它的条目在列表中相当远):

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

如果已经不明显,您不需要将其作为发布请求(除非API要求),因此您可以删除:

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

答案 1 :(得分:0)

您也可以使用此代码:

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

我刚尝试过,它运行正常。

希望它有所帮助。问候。