web-dev-qa-db-ja.com

PHPおよびcurlを使用して認証ヘッダーを設定します

CommissionJunctionのRESTサービスを使用しています。これには、AuthorizationヘッダーでAPIキーを送信する必要があります。

ヘッダーは次のように設定します。

_$ch = curl_init();
curl_setopt_array($ch, array(
  // set url, timeouts, encoding headers etc.
  CURLOPT_URL => 'https://....',
  // ...
));

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Authorization: ' . CJ_API_KEY,
  'User-Agent: ' . OUR_USER_AGENT
));

$response = curl_exec($ch);
$info = curl_getinfo($ch);
_

問題は、Authorizationヘッダーが送信されないことです(ローカルURLを使用し、_User-Agent_ヘッダーが設定されていることを示すvar_export($_SERVER)を実行してこれをデバッグしましたが、 Authorizationヘッダー。)

ヘッダー名を_X-Authorization_に変更すると、送信されますが、サービスは特にAuthorizationヘッダーを必要とするため、これは役に立ちませんでした。

PHP + cURLを取得して任意のAuthorizationヘッダーを送信するにはどうすればよいですか?

21
searlea

Authorizationヘッダーは、PHPの_$_SERVER_変数に含まれていません。リクエストを適切にデバッグするには、Apache_request_headers()を使用する必要があります。これは、Authorizationヘッダーを希望どおりに送信したことを示しています。

その後、問題は、かなり悪いドキュメントを前提として、Authorizationヘッダーに何を入れるかを正確に把握することに移りました。

30
searlea

クライアントがヘッダーを設定すると、リクエストのAuthorization-ヘッダーが_$_SERVER_に含まれます。これが新しいものかどうかはわかりませんが、現在はそうなっています。 HTTPヘッダーは、_$_SERVER_配列のプレフィックスとして_HTTP__が付けられます。これは、以前は見落としていた可能性があります。

また、Apache_request_headers()は、ApacheをWebサーバーとして使用する場合にのみ定義される関数です。そのため、nginxなどを持っている人は誰もが除外されます。

デモ

サーバー側:

_<?php
// server.php
var_dump($_SERVER['HTTP_AUTHORIZATION']);
_

テスト

Webサーバーを起動します(PHP 5.4)が必要です:

_$ php -S 0.0.0.0:31337 -t .
_

server.phpが現在のディレクトリにあることを確認してください。

CURLを使用してテストします。

_$ curl -H 'Authorization: FOO' http://0.0.0.0:31337/server.php
string(3) "FOO"
_

動作します。 :)

4
Till