web-dev-qa-db-ja.com

PHPでcURL POST HTTPリクエストにAuthorizationヘッダーを含める方法

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);

動作しない、助けてください。 :)

PDATE:私は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のトリックは私のためにそれをしました。 :) :) :) ありがとうございました!!

50
user1437671

@ 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);
19
Igor Parra

ほとんどのコードがあります…

CURLOPT_HTTPHEADER for curl_setopt() は、各ヘッダーを要素として持つ配列を取ります。複数のヘッダーを持つ1つの要素があります。

$header配列にAuthorizationヘッダーを追加する必要もあります。

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

「application/json」の代わりに「Content-type:application/x-www-form-urlencoded」を使用します

0
Anudeep Sharma