在 PHP curl 请求中使用 Auth Digest 标头变量

Posted

技术标签:

【中文标题】在 PHP curl 请求中使用 Auth Digest 标头变量【英文标题】:Using Auth Digest header variable in PHP curl request 【发布时间】:2016-07-20 18:29:00 【问题描述】:

我正在使用一个 API,该 API 为我提供了一个用于连接的令牌。它给出了这些说明。

然后在所有后续调用中将这个令牌发送到标头变量 Auth Digest 中的服务器。

我不确定这意味着什么。我尝试了几种方法并阅读了几个堆栈溢出问题。这是我尝试过的。有关详细信息,请参阅包含的代码 cmets。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);

// I have tried setting both of these
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

// In combination of the above separately, I have tried each of these individually
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $token);

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Auth Digest: ' . $token));

curl_setopt($ch, CURLOPT_POST, true);
$post_data = array('Auth Digest' => $token);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));

curl_setopt($ch, CURLOPT_USERPWD, $token); 

// Then I execute and close, either giving me a failed response and a response that says token is not valid
$response = curl_exec($ch);
$header_sent = curl_getinfo($ch, CURLINFO_HEADER_OUT);
if (!$response) 
    echo $action . ' curl request failed';
    return false;

curl_close($ch);
$response_json = json_decode($response);
var_dump($response_json);

以下是一些相关的 *** 问题,我尝试将它们应用于我的问题,但没有成功。

Curl request with digest auth in php for download Bitbucket private repository

Client part of the Digest Authentication using PHP POST to Web Service

How do I make a request using HTTP basic authentication with PHP curl?

我需要知道他们可能期望的原始 http 标头是什么,或者我如何使用 php curl 生成他们可能期望的标头。

【问题讨论】:

通常看起来像$headers = array("Authorization: Digest $token");,但可能还有更多。在不知道 API 或确切细节的情况下,我们只能猜测。 @drew010 有效。如果您可以将其发布为答案,我会接受。如果您能展示如何使用 curl_setopt 而不使用 CURLOPT_HTTPHEADER 来完成它,我们将不胜感激,因为这需要我手动设置标题的每一行。 我添加了一个答案。不确定我是否完全理解您的评论,但使用 CURLOPT_HTTPHEADER 并不意味着您需要手动设置标题的每一行。这只允许您传递额外的标题 curl 没有选项或您想要更好地控制。它仍然会做其他所有事情。 【参考方案1】:

摘要授权标头通常如下所示:

Authorization: Digest _data_here_

所以在你的情况下,试试:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//... existing options here
$headers = array(
    'Authorization: Digest ' . $token,
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);

如果您使用CURLOPT_HTTPHEADER,它只指定要发送的附加标头,不需要您在此处添加所有标头。

如果您发送的其他标头都有明确的选项,请使用这些选项并将一个授权标头传递给CURLOPT_HTTPHEADER

【讨论】:

以上是关于在 PHP curl 请求中使用 Auth Digest 标头变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 dig 和 curl 确定网站的物理主机

如何使用curl在php中调试get请求

在 PHP 中使用 CURL 发出 PUT 请求

PHP中使用cURL实现Get和Post请求的方法

在PHP中使用CURL实现GET和POST请求的方法

php使用cURL实现Get和Post请求的方法