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マニュアルをそのままパクっています。