如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?

Posted

技术标签:

【中文标题】如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?【英文标题】:How to include Authorization header in cURL POST HTTP Request in PHP? 【发布时间】:2012-09-02 02:40:50 【问题描述】:

我正在尝试通过 Gmail OAuth 2.0 访问用户的邮件,我正在通过 Google 的 OAuth 2.0 Playground 解决这个问题

在这里,他们指定我需要将其作为 HTTP 请求发送:

POST /mail/feed/atom/ HTTP/1.1
Host: mail.google.com
Content-length: 0
Content-type: application/json
Authorization: OAuth SomeHugeOAuthaccess_tokenThatIReceivedAsAString

我尝试编写代码来发送此请求,如下所示:

$crl = curl_init();
$header[] = 'Content-length: 0 
Content-type: application/json';

curl_setopt($crl, CURLOPT_HTTPHEADER, $header);
curl_setopt($crl, CURLOPT_POST,       true);
curl_setopt($crl, CURLOPT_POSTFIELDS, urlencode($accesstoken));

$rest = curl_exec($crl);

print_r($rest);

不工作,请帮忙。 :)

更新:我接受了 Jason McCreary 的建议,现在我的代码如下所示:

$crl = curl_init();

$headr = array();
$headr[] = 'Content-length: 0';
$headr[] = 'Content-type: application/json';
$headr[] = 'Authorization: OAuth '.$accesstoken;

curl_setopt($crl, CURLOPT_HTTPHEADER,$headr);
curl_setopt($crl, CURLOPT_POST,true);
$rest = curl_exec($crl);

curl_close($crl);

print_r($rest);

但是我没有得到任何输出。我认为 cURL 在某处默默地失败了。请帮忙。 :)

更新 2: NomikOS 的伎俩为我做到了。 :) :) :) 谢谢!!

【问题讨论】:

无耻的自我推销。你可能对我写的 oAuth 库感兴趣:github.com/PeeHaa/phpoAuthLib 哦,嘿,这看起来很酷。稍后会检查它:) @peehaa +1..... 好东西必须推广,无论如何。 @PeeHaa 好的,对不起。我会收回我的陈述。 【参考方案1】:

您拥有大部分代码……

CURLOPT_HTTPHEADER for curl_setopt() 采用一个数组,每个标题都作为一个元素。您有一个带有多个标题的元素。

您还需要将 Authorization 标头添加到您的 $header 数组中。

$header = array();
$header[] = 'Content-length: 0';
$header[] = 'Content-type: application/json';
$header[] = 'Authorization: OAuth SomeHugeOAuthaccess_tokenThatIReceivedAsAString';

【讨论】:

嘿,嗯。仍然没有得到任何输出。 :( 您可能有不止 1 个问题。很难说。有什么错误吗?您已确认身份验证令牌?等 是的,我在呼应 auth_token 并且它似乎给了我一个很长很好的字符串。 - 请检查我更新的代码并检查是否需要做任何事情。非常感谢你的耐心。 :)【参考方案2】:

@jason-mccreary 完全正确。此外,我建议您使用此代码以在出现故障时获取更多信息:

$rest = curl_exec($crl);

if ($rest === false)

    // throw new Exception('Curl error: ' . curl_error($crl));
    print_r('Curl error: ' . curl_error($crl));


curl_close($crl);
print_r($rest);

编辑 1

要进行调试,您可以将 CURLOPT_HEADER 设置为 true 以检查带有 firebug::net 或类似名称的 HTTP 响应。

curl_setopt($crl, CURLOPT_HEADER, true);

编辑 2

关于Curl error: SSL certificate problem, verify that the CA cert is OK 尝试添加此标头(只是为了调试,在生产环境中您应该将这些选项保留在true 中):

curl_setopt($crl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

【讨论】:

嘿,感谢您添加此内容。现在我收到一条错误消息:Curl 错误:SSL 证书问题,验证 CA 证书是否正常。详细信息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 有效! :D 非常感谢! :) :)【参考方案3】:

使用“内容类型:application/x-www-form-urlencoded”而不是“application/json”

【讨论】:

以上是关于如何在 PHP 的 cURL POST HTTP 请求中包含授权标头?的主要内容,如果未能解决你的问题,请参考以下文章

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

CURL实现发送Get和Post请求(PHP)

curl实现发送Get和Post请求(PHP)

centos根据php的curl请求post过来的参数执行对应的sh脚本

如何在php中获取curl请求的请求头信息及相应头信息

如何在php中获取curl请求的请求头信息及相应头信息