1

我正在创建我的第一个 API,合作伙伴需要使用 cURL 从他们的服务器访问该 API。因此,在创建它时,我使用服务器 #1 来创建测试连接脚本,并使用服务器 #2 来托管 API。在服务器 #1 我有:

<?php

$url = "http://example.net/api/";

$data['api_key'] = "AFsASfafasasf";
$data['api_secret'] = "faskakfokfl3a";

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

$result = curl_exec($ch);
curl_close($ch);

echo $result;

?>

在服务器 #2 上,API 文件,我有这个(只是为了测试连接):

<?php

echo "Testing API...";
echo $_POST['api_key'];
echo $_POST['api_secret'];

?>

问题是,当我在服务器 #1 上运行测试脚本时,我得到了这个:

“需要授权

此服务器无法验证您是否有权访问所请求的文档。要么您提供了错误的凭据(例如,错误的密码),要么您的浏览器不了解如何提供所需的凭据。

此外,在尝试使用 ErrorDocument 处理请求时遇到 401 Authorization Required 错误。”

这肯定与 cURL 相关联,因为 Server #1 可以与任何其他基本 PHP 脚本一起使用。

我在网上看到的所有示例似乎都不需要授权......所以它是我需要设置的 CURLOPT 字段中的内容,还是 .htaccess 或其他我缺少的地方?

谢谢!

4

2 回答 2

4

当服务器需要某种身份验证才能访问网页并且在大多数情况下是基本身份验证时,就会出现 401 错误。

您能否确认您的服务器#1 上是否配置了基本身份验证?如果服务器 #1 需要基本身份验证,则浏览器将第一次询问它,然后它将存储凭据并在每个后续请求中传递它。

如果配置了基本身份验证,则以下将使用 cURL 传递凭据

curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);

于 2013-03-26T10:59:26.673 回答
0

当我尝试在运行 API 的同一台服务器上运行 cURL 命令时,我遇到了同样的错误。

我终于弄清楚 httpd.conf 中的虚拟主机设置是为单个网关 IP 设置的,而不是 127.0.0.1。

因此,假设 apache,我认为服务器 #2 可能以与 #1 上的 apache 设置冲突的方式调用服务器 #1。

  1. 检查服务器 #2 上的 /etc/hosts 文件,以确定它是直接通过其内部 IP 调用服务器 #1,还是默认情况下仅在 LAN 外部发送。

  2. 检查服务器 #1 上的 httpd.conf 设置,特别是在解析域时为哪些 IP 地址配置 NameVirtualHost 和 VirtualHost。需要将它们配置为允许从服务器 #2 调用的 IP 地址。

于 2015-10-05T03:50:06.943 回答