如何在PHP curl中使用基本授权

62

我在使用带有基本授权的 PHP curl 请求时遇到了问题。

以下是命令行 curl:

curl -H "Accept: application/product+xml" "https://{id}:{api_key}@api.domain.com/products?limit=1&offset=0"

我已经尝试了以下设置curl头文件的方法,但它并没有起作用。

Authorization: Basic id:api_key
or 
Authorization: Basic {id}:{api_key}

我收到了“请求中的身份验证参数缺失或无效”的响应,但是我已经使用了正确的id和api_key,在命令行curl中可以正常工作(我已测试)

请帮忙解决问题。

4个回答

167

请尝试以下代码:

$username='ABC';
$password='XYZ';
$URL='<URL>';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$URL);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$result=curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code
curl_close ($ch);

4
我也能够删除 CURLOPT_HTTPAUTH 这一行并且让它正常工作。 - Joshua Pinter
7
@JoshPinter,您使用的是字符串'CURLAUTH_BASIC'而不是常量CURLAUTH_BASIC - Walter Tross
2
这对我有用 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Basic ".base64_encode($this->username.":".$this->password), ]); - FosAvance
2
curl_exec()执行后再调用curl_getinfo(),不是吗? - Alien Technology
除了在结果页面上单击链接时,它对我有效。我如何在单击结果页面上的链接时再次调用此脚本? - Sadık
显示剩余2条评论

9

这对我实际上起作用了,而不是使用 curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); - Harish Prasanna
1
@HarishPrasanna,这是同样的事情... - DrLightman

7
$headers = array(
    'Authorization: Basic '. base64_encode($username.':'.$password),
);
...
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

4
回答一个已有三个答案的六岁儿童问题时,重要的是解释你的回答涉及到问题的哪个新方面。仅代码回答通常可以通过添加解释来改进。 - Jason Aller
@JasonAller 我测试了所有的方法,但都没有起作用。有一个评论和我的回答类似,但我认为这个解决方案必须是一个答案。 - Danoosh
@Danoosh,你的代码是多余的。你手动构建了 AUTH 头部,并指定了 Basic(基本)认证方式和对用户/密码进行了Base64编码,然后又让 cURL 自己创建一个使用 Basic 认证的 AUTH 头部。但是你没有提供任何要使用的用户名/密码给 cURL,所以它无法完成这个任务。选择其中一种方法 - 第二种方法 - 为什么要手动实现编码,而 cURL 可以为你完成呢? - Marki555

1

这是传递标题的简单方法

function get_data($url) {

$ch = curl_init();
$timeout = 5;
$username = 'c4f727b9646045e58508b20ac08229e6';        // Put Username 
$password = '';                                        // Put Password
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");    // Add This Line
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$url = "https://storage.scrapinghub.com/items/397187/2/127";
$data = get_data($url);
echo '<pre>';`print_r($data_json);`die;    // For Print Value

检查我的JSON值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接