如何在 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 请求中包含授权标头?的主要内容,如果未能解决你的问题,请参考以下文章