phpを用いたダイジェスト(digest)認証後のログアウト処理方法
いつもお世話になっています.
早速ですが,タイトルの件について質問します.
現在作成しているサイトでダイジェスト認証を行いたく,以下のプログラム digest_auth() を利用して認証を行っています.
URL: http://techblog.ecstudio.jp/tech-tips/digestauth.html
※説明のため,"[1],[2],[3]"を追記しています.
-----------------------------------------------------------------------
function digest_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){
// [1]
if (!$_SERVER['PHP_AUTH_DIGEST']){
$headers = getallheaders();
if ($headers['Authorization']){
$_SERVER['PHP_AUTH_DIGEST'] = $headers['Authorization'];
}
}
// [2]
if ($_SERVER['PHP_AUTH_DIGEST']){
// PHP_AUTH_DIGEST 変数を精査する
// データが失われている場合への対応
※ 文字数制限のため中略. (暗号化のための準備.)
if ($auth_list[$data['username']]){
// 有効なレスポンスを生成する
$A1 = md5($data['username'].':'.$realm.':'.$auth_list[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response){
unset($_SERVER['PHP_AUTH_DIGEST']);
}else{
return $data['username'];
}
}
}
// [3]
//認証データが送信されているか
header('WWW-Authenticate: Digest realm="'.$realm.'", nonce="'.uniqid(rand(),true).'", algorithm=MD5, qop="auth"');
header('HTTP/1.1 401 Authorization Required');
header('Content-type: text/html; charset='.CHARSET );
die($failed_text);
}
-----------------------------------------------------------------------
index.php より 上記関数 digest_auth() を含む degest.php へリンクさせ,ログイン及び認証させています.
degest.php では”ログアウト”を index.php へリンクさせ,戻る仕様としています.
ここで,一度ログアウトした際に,認証データがクライアント側にあるため,再度 index.php よりログインする際,プログラム中の[1] や [2] により処理され,入力ダイアログ[3]は出てきません.
ブラウザを閉じることで,認証データ(セッション?)が消え,ログアウトしたことになるということは見つけましたが,今回は認証データを任意に消したいというものです.
ログアウトした際に,クライアント側のセッション情報を消せばよいのかとおもい,ログアウト先の index.php 内で以下の処理を行ってみました.
URL: http://www.php.net/manual/ja/function.session-destroy.php
-----------------------------------------------------------------------
(文字数制限のため省略) リンク先 "例1"
----------------------------------------------------------------------
しかし,うまくログアウトすることができませんでした.つまり,入力ダイアログ[3]が表示されませんでした.
また,$_SERVER['PHP_AUTH_DIGEST']の値がセッション情報から得られいて,セッション情報を消しても,[1]によりヘッダー情報から$_SERVER['PHP_AUTH_DIGEST']の情報を補っているためかとおもい,[1]を消してから再度トライしてみましたが,やはりダメでした.
確認だけで当たり前の現象ですが,[1]を消して,さらにunset($_SERVER['PHP_AUTH_DIGEST'])を最初に行うことで認証情報を消し,再度入力ダイアログが現れる現象を確認しました.
(もちろん,正しい値を入力してもまた聞かれる状態です..)
現時点では,なんらかの方法により,クライアント側の認証データ(セッション?)を消すことで,ログアウトができると考えています.
以上より,今回用いているダイジェスト認証処理を行った後のログアウト処理方法についてどなたか御教授ください.
よろしくお願いします.
お礼
ご回答ありがとうございます。 gooからOKWAVEに引越してまいりました。 ご教示いただいた方法で一度試してみます。
補足
ありがとうございました。できました。