※ ChatGPTを利用し、要約された質問です(原文:phpを用いたダイジェスト(digest)認証後のログアウト処理方法)
phpを用いたダイジェスト認証後のログアウト処理方法
このQ&Aのポイント
phpを使ったダイジェスト認証のログアウト処理方法について教えてください。
現在作成しているサイトでダイジェスト認証を行いたいですが、ログアウト処理の方法がわかりません。
ダイジェスト認証を使用した後のログアウト処理の方法について詳しく教えてください。
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'])を最初に行うことで認証情報を消し,再度入力ダイアログが現れる現象を確認しました.
(もちろん,正しい値を入力してもまた聞かれる状態です..)
現時点では,なんらかの方法により,クライアント側の認証データ(セッション?)を消すことで,ログアウトができると考えています.
以上より,今回用いているダイジェスト認証処理を行った後のログアウト処理方法についてどなたか御教授ください.
よろしくお願いします.
お礼
早速のご回答、またとても分かりやすい内容ありがとうございます。 基礎的な知識があやふやなまま調べていたため、上記のような結論へ辿りつくことができませんでしたが、とてもスッキリしました。 basic認証(digest認証)で無理であるのならば、http://www.stackasterisk.jp/tech/php/php03_06.jsp などを参考に、セッション管理により認証ページを作成してみたいと思います。 また、cookieの知識もつけた後、上記方法も試してみたいと思います。 上記の様な大変分かりやすい説明をしていただき、本当にありがとうございました。