6

PHPで行われたダイジェスト認証をログアウトする方法はありますか?PHPダイジェスト認証、ログアウト

私はunset($ _ SERVER ["PHP_AUTH_DIGEST"])を試みました。 しかし、それはreloginを要求しません。 ブラウザを閉じても機能し、ここに自分の機能があります。

function login(){ 
     $realm = "Restricted area"; 
     $users = array("jamesm"=>""); 
     if (empty($_SERVER["PHP_AUTH_DIGEST"])) { 
      header("HTTP/1.1 401 Unauthorized"); 
      header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\""); 
      return false; 
     } 
     if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]])) 
      return false; 
     $A1 = md5($data["username"] . ":{$realm}:{$users[$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) 
      return false; 
     return true; 
    } 
    function logout(){ 
     unset($_SERVER["PHP_AUTH_DIGEST"]); 
     return true; 
    } 

さらにこれをやめるためにログアウト機能を追加する必要があります。

私が領域を変更した場合は機能しますが、変更する必要はありません。

+0

[HTTP認証ログアウト(PHP経由)](http://stackoverflow.com/questions/449788/http-authentication-logout-via-php)。答え:いいえ。 – netcoder

+0

私はそれができます、ちょうど方法がわからないことを知っています。 –

+0

ブラウザを閉じて情報がブラウザ内に登録されるので、 – ajreal

答えて

10

$ _SERVER ['PHP_AUTH_DIGEST']の設定を解除しても効果はありません。問題は、あなたが設定したタスクに本当に「良い」答えがないということです。

HTTP仕様では技術的に許可されていませんが、実際には、実際には、他のブラウザに401を送信すると、ほとんどのブラウザが効果的に「ログアウト」します。Per php.net/http-auth:

サーバレスポンス401を受信すると、Netscape NavigatorとInternet Explorerの両方で領域のローカルブラウザウィンドウの認証キャッシュがクリアされます。これにより、ユーザは効果的にユーザをログアウトし、ユーザ名とパスワードを再入力することができます。ログインを「タイムアウト」するために、または「ログアウト」ボタンを提供するために、これを使用する人もいます。あなたのコードから

、最も簡単な方法は、おそらくのようなものです:

function logout(){ 
    header('HTTP/1.1 401 Unauthorized'); 
    return true; 
} 

しかし、再び、これは実際にはHTTP仕様での承認を受けたものではありません。

+0

これは動作しますが、ログアウトページでログインを求められます。それを介してログインすることはできません。実際、私は全くログインできません。ああ、それはまったく私をログアウトするだけで再びログインすることはできません。また、ヘッダ( "HTTP/1.1 401 Unauthorized")だけを与えなければならなかった。いいえ、www-autherticateをもう一度。 –

+0

ダイエットがそれを必要としていたかどうかは分かりませんでした。私はまだダイジェストを実装していません。 – TML

+0

次のようなものが私のためにうまくいくことがわかります。http:// codepad。org/BUJvSmnm 私の場合、logout()でWWW-Authenticateヘッダーが必要なブラウザが少なくとも1つ見つかりました(Firefox 3.6)ので、生成されたuniqid()を$ _SESSIONで永続的に使用していますログアウトヘッダーに入力します。 – TML

6

正解:http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - セクション6.1
信頼できる方法はありません。

いくつかの回避策には、401を偽造し、領域を変更する、または意図的に無効な資格情報を使用してAJAX認証要求を承認するなどがあります。

+0

このIETFドラフト文書の該当セクションは6.1です:認証資格証明とアイドルクライアント – TML

+0

PHPコードをお願いします。 –

+0

@JamesM:ログインダイアログを表示しないようにするには、jQuery経由でこれを開始する必要があります。別の 'logout1.php'をリクエストしてください。ヘッダ( "Status:401 Logout")とヘッダ( "WWW-Authenticate:無効化、基本領域=ログアウト")を送信します。オプションで、チェックを行わずに肯定応答する 'logout2.php'に対する無効な認証情報を持つ2番目のAJAX呼び出し。 – mario

関連する問題