24 May 2008

PHPでApache認証のユーザ名を得る

PHPでApacheでの認証ユーザ名を得る方法。

Basic認証の場合は、$_SERVER['PHP_AUTH_USER'] にユーザ名がセットされ、MD5認証では$_SERVER['PHP_AUTH_DIGEST']に認証情報がセットされる… はず。

あるレンタルWebサーバでは、Basic認証しているにもかかわらず、ユーザ名を得ることが出来ない…

PHPマニュアルによれば、「外部認証が可能でかつ セーフモード が有効の場合」は$_SERVER['REMOTE_USER'] を利用せよと書かれている。 知りませんでした。

認証されたユーザ名を表示するテストプログラム

<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { print('BASIC認証されていません'); } else { print('BASICユーザ名 :' . $_SERVER['PHP_AUTH_USER']); } if (!isset($_SERVER['PHP_AUTH_DIGEST'])) { print('MD5認証されていません'); } else { $strData = http_digest_parse($_SERVER['PHP_AUTH_DIGEST']); if(!$strData) { print('MD5認証のデータ取得が出来ません'); } else { print('MD5ユーザ名 :' . $strData['username']); } } if (!isset($_SERVER['REMOTE_USER'])) { print('REMOTE_USER環境変数は定義されていません'); } else { print('REMOTE_USER環境変数 :' . $_SERVER['REMOTE_USER']); } exit; function http_digest_parse($txt) { // データが失われている場合への対応 $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); $data = array(); preg_match_all('@(\w+)=([\'"]?)([a-zA-Z0-9=./\_-]+)\2@', $txt, $matches, PREG_SET_ORDER); foreach ($matches as $m) { $data[$m[1]] = $m[3]; unset($needed_parts[$m[1]]); } return $needed_parts ? false : $data; } ?>

http_digest_parse関数は、PHPマニュアルをそのままパクっています。