headerのAuthorizationを取得したい

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
authorized

この記事を三行にまとめると

Authorizationという項目を取得することができません
ヘッダ情報のAuthorizationを出力してみます
URLを任意に変えて、試してみてください
PHPでヘッダ情報を取得したければ、$_SERVERという変数の中身を見れば、たいていのものは取得できます。

でも$_SERVERだと、Authorizationという項目を取得することができません。

Authorizationを取得したい場合は、「apache_request_headers()」か「getallheaders()」を使います。

どういうときに使うかはその人次第ですけど、うーん、そうですね……自分でAPIを実装する場合のアクセストークンに使う場合、とかですかね……?

例えば、curlを使って、こんなリクエストを投げてみます。

$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'http://norm-nois.com/reference/api.php');
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: token12345'));
curl_exec($ch);
curl_close($ch);

http://norm-nois.com/reference/api.phpというURLにリクエストを送っています。curlの使い方については、ここでは省略。やっていることは、ヘッダ情報に「Authorization」をくっつけてるだけです。

http://norm-nois.com/reference/api.phpには、こんなコードを書いて、ヘッダ情報のAuthorizationを出力してみます。

$header = $_SERVER;
echo '$_SERVER:'.$header['Authorization'].'<br />';

$header = apache_request_headers();
echo 'apache_request_headers:'.$header['Authorization'].'<br />';

$header = getallheaders();
echo 'getallheaders:'.$header['Authorization'].'<br />';

実際にやってみると分かりますが、出力結果はこうなります。

$_SERVER:
apache_request_headers:token12345
getallheaders:token12345

$_SERVERだけ、Authorizationが取得できていません。他の二つは「token12345」という値が取得できました。



レンタルサーバーとかによっては、apache_request_headers()を使っても、取得できない場合があるかもしれません。とりあえず、さくらインターネットでは取得できなかった。

そういう場合は、.htaccessにこんなのを加えてみてください。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP:Authorization} ^(.*)
  RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

これでAuthorizationを取得できるようになると思います。

ちなみに、http://norm-nois.com/reference/api.phpは実在のURLですが、上記の.htaccessの設定を外してあるので、アクセスしてもAuthorizationは取得できない状態になってます。「あれ? 言われた通りやってみたのに取得できてねーぞ」ってなります。

実際に検証してみたい場合は、URLを任意に変えて、試してみてください。よろしくお願いしゃっす。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2023年05月18日 18:19:53
crytus
この件、すごく参考になりました。
ありがとうございました。
2023年05月18日 23:39:20
まっち~(管理人)
> crytusさん
いえいえ、お役に立ててよかったです。