经过身份验证的 curl 在 php 中不起作用
Authenticated curl not working in php
我正在尝试创建一个简单的 PHP 脚本,它在两个不同的域上调用两个不同的 REST API。这两种服务都是 HTTPS 并且需要身份验证。当我从终端执行 curl 时,我在 JSON 中得到了两个域的响应,并且一切正常:
curl --user “myuser:mypassword” https://www.example.com/rest/api/2/projects
请注意,它是 GET,而不是 POST。
奇怪的是,当我从我的 PHP 脚本中尝试完全相同的 curl 命令时,它们都不起作用。
这会发生什么:
- 第一个域 returns 一个没有错误的空 JSON 数组。就是这样:[]
第二个域returns这个错误在JSON:
{"errors":[
{
"context":空,
"message":"You are not permitted to access this resource",
"exceptionName":"com.atlassian.stash.exception.AuthorisationException"
}
]}
以下是未发生的事情:
- 没有 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(我手动升级到最新版本试图让它工作)
当前代码混合了各种方法并以相互冲突的方式进行:
- 身份验证 header 被命名为
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;
我正在尝试创建一个简单的 PHP 脚本,它在两个不同的域上调用两个不同的 REST API。这两种服务都是 HTTPS 并且需要身份验证。当我从终端执行 curl 时,我在 JSON 中得到了两个域的响应,并且一切正常:
curl --user “myuser:mypassword” https://www.example.com/rest/api/2/projects
请注意,它是 GET,而不是 POST。
奇怪的是,当我从我的 PHP 脚本中尝试完全相同的 curl 命令时,它们都不起作用。
这会发生什么:
- 第一个域 returns 一个没有错误的空 JSON 数组。就是这样:[]
第二个域returns这个错误在JSON:
{"errors":[ { "context":空, "message":"You are not permitted to access this resource", "exceptionName":"com.atlassian.stash.exception.AuthorisationException" } ]}
以下是未发生的事情:
- 没有 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(我手动升级到最新版本试图让它工作)
当前代码混合了各种方法并以相互冲突的方式进行:
- 身份验证 header 被命名为
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;