PHPでの認証の記事はよくあるのですが、いったん認証された後、$_SERVER[‘PHP_AUTH_USER’]などの値がどこまで継続して使用できるのかどうか確認しました。
大まかには、最初にPHPで認証させてHTMLを表示させます。この後、Webサーバーに、$_SERVER[‘PHP_AUTH_USER’]を返信させます。
下記が、最初にアクセスするPHPです(このコードは「初めてのPHP&MySQL」という書籍の例題を書きかえたものです)。前半が認証するところです。testというデータベースがあって、testuserというユーザーが居ます。このユーザーを読み取りだけができる限定された権限のユーザーとしました。ログイン認証用の画面がポップアップで表示されるのですが、そこで入力するユーザーとは別のユーザーです。ログインするユーザーは書きかえる権限を持つユーザーを想定しています。この他、authors というテーブルがあって、パスワードなどが記録されています。
<?php
$db_host='localhost';
$db_database='test';
$db_username='testuser';
$db_password='apassword';
require_once("Auth/HTTP.php");
$AuthOpts = array('dsn' => "mysql://$db_username:$db_password@$db_host/$db_database",
'table' => "authors", // テーブル名
'usernamecol' => "name", // ユーザ名の列
'passwordcol' => "password", // パスワードの列
'cryptType' => "md5" // パスワードの暗号化方法
);
$authenticate = new Auth_HTTP("DB", $AuthOpts);
// レルム名を設定
$authenticate->setRealm('Member Area');
// 認証失敗時のメッセージ
$authenticate->setCancelText('<h2>Access Denied</h2>');
// 認証を開始
$authenticate->start( );
// ユーザ名とパスワードをデータベースと照合
if ($authenticate->getAuth( )){
$somebody = $authenticate->username;
echo <<< src_no_owari
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test auth</title>
<script type="text/javascript" src="jquery/jquery.min.js"></script>
<script type="text/javascript">
//<![CDTA[
function call_php() {
// ダミー
var tmp = new Date().getTime();
$.ajax({
url:"test.php",
type:'post',
dataType:'text',
data:{'param1':tmp},
timeout:5000,
async:false,
success:function(returntext,status){
if(status!='success')return;
alert(returntext);
} });
}
//]]>
</script>
</head>
<body>
<button type="button" id="" class="" onclick="call_php();" style=";">
Call PHP
</button>
</body>
</html>
src_no_owari;
}
?>
上記コードの後半で、認証後、HTMLが書き出されます。ただボタンがひとつあるだけのものです。クライアントから見れば、ただのHTMLです。この場合に、あらためてWebサーバーにアクセスして、認証の継続を確認してみました。ボタンを押すと、test.phpを呼び出します。test.phpは下記です。
<?php
echo $_SERVER['PHP_AUTH_USER'];
?>
$_SERVER[‘PHP_AUTH_USER’]を返すだけのものですが、確かにログインしたユーザー名が返って来ました。つまり、Webサーバーがユーザーを記憶しているようですので、次にデータベースにアクセスするときには、クライアントからユーザー名とパスワードを送る必要は無いようです。