经过身份验证的curl在php中不起作用


Authenticated curl not working in php

我正在尝试创建一个简单的PHP脚本,该脚本在两个不同的域上调用两个不同RESTAPI。这两种服务都是HTTPS,需要身份验证。当我从终端进行卷曲时,我会得到两个域的JSON响应,一切都很好:

curl—用户"myuser:mypassword"https://www.example.com/rest/api/2/projects

请注意,这是一个GET,而不是POST。

奇怪的是,当我从PHP脚本中尝试完全相同的curl命令时,它们都不起作用。

这就是发生的事情:

  • 第一个域返回一个空的JSON数组,没有任何错误。仅此:[]
  • 第二个域在JSON:中返回此错误

    {"错误":[{"context":null,"message":"不允许您访问此资源","exceptionName":"com.atlassian.stach.exception.AuthenticationException"}]}

以下是没有发生的事情:

  • 没有SSL证书错误或警告
  • 没有身份验证错误

即使输入了错误的用户名或密码,两个服务的操作方式也完全相同。

对我来说,可疑的是这两个域都没有对我的调用进行身份验证,这让我认为我的代码或php curl库有问题。

这是我的代码:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $link3); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$encodedAuth = base64_encode($username.":".$password);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authentication : Basic ".$encodedAuth));
curl_setopt($curl, CURLOPT_USERPWD, $username.":".$password);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
$status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);   //get status code

我知道有些是多余的,但我想尝试所有的东西,但都没有效果。有什么想法吗?

我的环境:

  • OS X Yosemite(10.10.2)
  • PHP 5.6.6(我手动升级到最新版本,试图让它发挥作用)

当前的代码混合了各种方法,并以一种冲突的方式进行:

  • 认证报头被命名为Authorization:而不是Authentication:
  • CURLOPT_HTTPAUTH, CURLAUTH_ANY试图与服务器进行协商,但它不应该(正在工作的cURL命令行也不应该)

只需使用:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $link3);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERPWD, $username.":".$password);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,true);
# for debugging/non-prod
#curl_setopt($curl, CURLOPT_VERBOSE, true);
#curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
echo $result;