4

我正在尝试实现一种 PHP 方法来验证对美联社提要的请求。从他们的文档中:

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

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

您可以配置读取器或组件以创建具有以下格式的名称/值的身份验证标头:

("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 中验证此请求的正确方法是什么?

另请参阅提供的 ASP.NET 和 Java 示例

4

2 回答 2

1

授权是 HTTP 标头而不是 POST 参数。您使用CURLOPT_POSTFIELDSwhich 设置请求的正文。相反,您需要使用它来设置它CURLOPT_HTTPHEADER(它的条目在列表中非常靠后):

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

如果它还不是很明显,你不需要把它作为一个发布请求(除非 API 需要它),所以你可以删除:

curl_setopt($ch, CURLOPT_POST, 1); // set POST method
于 2012-07-18T01:27:43.680 回答
0

您也可以使用以下代码:

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

我刚刚尝试过,效果很好。

希望它有所帮助。问候。

于 2013-05-21T12:21:33.440 回答