我正在尝试实现一种验证对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中验证此请求的正确方法是什么?
答案 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);
我刚尝试过,它运行正常。
希望它有所帮助。问候。