编码HTTP Basic Auth

时间:2016-08-22 16:13:38

标签: php http curl encoding basic-authentication

我使用PHP cURL与Rest API进行通信。大多数功能都是使用X-Ephemeral-Tokens执行的,但不幸的是,他们不允许通过这些功能提供删除权限,所以我不得不通过HTTP基本身份验证实现删除功能。

我遇到的麻烦是测试帐户的密码是随机字符串,包括多个特殊字符(其中一些是双引号)。我通过在单引号中包含username:password组合(即')使用普通的cURL二进制文件来处理请求,但我不确定如何将其转换为PHP。相关摘录如下。

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Accept: application/json",
                                              "Content-Type: application/json"));
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, $uname . ":" . $pass);
curl_setopt($curl, CURLOPT_URL, "https://cloud.ravellosystems.com/api/v1/applications/" . $appid);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
$result = curl_exec($curl);

我尝试了各种引号和网址编码组合,但仍然会收到一条响应代码,表明身份验证无法正常工作。

这是基于API文档显示的使用普通cURL(略微修改)的HTTP请求

curl -v -X DELETE -H "Content-Type: application/json" -H "Accept: application/json" --user ravello@ravello.com:password https://cloud.ravellosystems.com/api/v1/applications/414244

有关如何解决这个问题的任何建议都非常感激。

3 个答案:

答案 0 :(得分:5)

好的,如果有其他人有这个问题,我找到了解决方案。

基本上你可以在上面的代码中看到我试图使用cURL PHP方法来设置CURLOPT_USERPWDCURLOPT_HTTPAUTH的选项。然而,在这个地方,密码中的特殊字符导致解析问题,我认为服务器实际上只有一部分正在使用。

但是,所有这些选项基本上都设置了HTTP标头,如@mpyw屏幕截图所示。这是Authorization标头,格式如下:

`Authorization: Basic [base64 encoded username:password]`

所以我摆脱了这些选项并通过base64编码我的username:password字符串然后添加标题来手动完成。

$auth = base64_encode($uname . ":" . $pass);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: Basic $auth",
                                              "Accept: application/json",
                                              "Content-Type: application/json"));

现在一切正常!感谢那些发布答案的人 - 你们两个都为我提出了解决方法。

答案 1 :(得分:2)

我比较了两种方法,即提供详细输出。

enter image description here enter image description here

发送的标头是相同的,除了PHP不包含User-Agent标头。 API是否需要User-Agent标题?

修改

包含'

的密码

enter image description here enter image description here

包含"

的密码

enter image description here enter image description here

答案 2 :(得分:0)

我相信您必须使用base64_encode用户名和密码。试试这个:

curl_setopt($curl, CURLOPT_USERPWD, base64_encode($uname . ":" . $pass));