web-dev-qa-db-ja.com

http基本認証「ログアウト」

HTTP基本認証の資格情報は、ブラウザーを閉じるまで保存されますが、ブラウザーを閉じる前に資格情報を削除する方法はありますか?

HTTP 401ステータスコードのトリック について読みましたが、 正しく動作しない のようです(回答のコメントを参照)。多分 メカニズムtracが解決策です

JavaScriptを使用して資格情報を削除できますか?または、JavaScriptとステータス401トリックの組み合わせで?

60
deamon

Update:このソリューションは、多くのブラウザで動作しないようです。海津のコメント:

偽の認証情報を送信してブラウザに正しい認証された認証情報を忘れさせるというこのソリューションは、Chrome(16)およびIE(9)。Firefoxで動作します。 (9)。


実際には、偽の資格情報をサービスに送信することで回避策を実装できます。これは、パスワードなしで別の(存在しない?)ユーザー名を送信することにより、ブラウザーで機能します。ブラウザは、認証された資格情報に関する情報を失います。

例:

https://www.example.com/ =>「user1」として基本認証でログインします

開催中

https://[email protected]/

ログアウトしました。 ;)

よろしく

追伸:しかし、与えられた情報に頼る前に、必要なすべてのブラウザーでこれをテストしてください。

33
Jan.

1月の回答を拡張し、owyongskの回答を更新します。

ブラウザーが保護しようとしているページに基本的に偽のログイン要求を送信するjquery Javaスクリプトコードの例を次に示します。テストされたすべてのブラウザーでキャッシュされた資格情報が削除され、保護されていないページ。

何か問題が発生した場合のalert()は、おそらく他の何かに変更する必要があります。

//Submits an invalid authentication header, causing the user to be 'logged out'
function logout() {
    $.ajax({
        type: "GET",
        url: "PUT_YOUR_PROTECTED_URL_HERE",
        dataType: 'json',
        async: true,
        username: "some_username_that_doesn't_exist",
        password: "any_stupid_password",
        data: '{ "comment" }'
    })
//In our case, we WANT to get access denied, so a success would be a failure.
.done(function(){
    alert('Error!')
})
//Likewise, a failure *usually* means we succeeded.
//set window.location to redirect the user to wherever you want them to go
.fail(function(){
    window.location = "/";
    });
}

その後、ログアウトリンクでlogout()関数を呼び出すだけで簡単になり、技術的にはハックジョブですが、ユーザーにはシームレスに機能するように見えました。

10
1n5aN1aC

最新のChrome=とFirefoxを使用して、現在動作しているハックを試すことができます。ユーザー名:false、パスワードなどの特定の資格情報のみを受け入れるサーバー上に「/ logout」ページを作成します。 :false。次に、以下のAJAXリクエストを使用して、ユーザーをそのページに送信できます。

  $("#logout").click(function(e){                                              
    e.preventDefault();                                                        
    var request = new XMLHttpRequest();                                        
    request.open("get", "/logout", false, "false", "false");                                                                                                                               
    request.send();                                                            
    window.location.replace("WHEREVER YOU WANT YOUR LOGGED OUT USER TO GO");                                              
  });

起こることは、現在のユーザーの資格情報ではなく、有効なXMLHttpRequestから偽のユーザー名とパスワードがキャッシュされ、ユーザーがページにログインしようとすると、キャッシュされた偽の資格情報を使用して認証に失敗し、ユーザーに尋ねることです別のものを入力します。お役に立てれば!

7
owyongsk

JavaScriptを使用して資格情報を削除できます。

    $("#logout").click(function(){
        try {
            document.execCommand("ClearAuthenticationCache");
            window.location.href('/logout.html'); // page with logout message somewhere in not protected directory
        } catch (exception) {}
    });

このコードはIEでのみ機能します。これが、try/catchブロックがそこに追加される理由です。また、同じ理由でIEユーザーのみに対してログアウトリンクを表示する必要があります:

    <!--[if IE]>
        <div id="logout">[Logout]</div>
    <![endif]-->

そして、他のユーザーに対する私の提案は次のようなものです:

    <div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>
4
Vilius Gaidelis

うまく機能した実装を完成させただけです。サーバーでセッション、ユーザー名、パスワードを評価し、その情報を追跡します。ログインアルゴリズムは次のとおりです。

1.ユーザーとパスワードが空でないかどうかを確認し、空でない場合は401を返します。

2.ログインしたユーザーリストにセッションを登録したかどうかを確認し、そうでない場合はユーザーとパスワードが有効かどうかを確認し、そうであればリストにセッションIDを保存して401を返します。このステップを説明します:セッションIDは、発生した3つのことの1つとは異なります。a)ユーザーが別のウィンドウを開いています。 b)ユーザーセッションが終了した、つまりユーザーがログアウトした。 c)非アクティブのためセッションが期限切れになりました。ただし、ユーザー資格情報が有効である限りセッションを保存しますが、401を返してパスワードを要求します。セッションを保存しない場合、新しいセッションIDがないため、ユーザーはログインできません。リストにあります。

3.ユーザー資格情報が正しいかどうかを確認します。正しい場合は、セッション情報を保存してページの提供を続けます。そうでない場合は401を返します。

そのため、ユーザーをログアウトする必要があるのは、ユーザーがログアウトページを要求し、Webブラウザーが再度ログインダイアログを表示したときにサーバーでセッションを閉じることだけです。

私はこれを書いているときに、偽装を避けるためにユーザーがすでにログインしているかどうかをプログラムがチェックするステップが必要だと考えています。それについてのあなたのコメント。

あなたがアイデアを得て、セキュリティ上の欠陥を見たらコメントしてください;)

4
Erwin

サーバーコードを制御できる場合は、指定された資格情報に関係なく「401 Unauthorized」と応答する「ログアウト」機能を作成できます。この失敗により、ブラウザーは保存された資格情報を強制的に削除します。

Chrome 34、IE 11、Firefox 25-Express.jsサーバーとHTTP基本認証を使用してこれをテストしました。

3
Greg T

Chrome(バージョン66)で機能しているのは、401を返すURLにAjaxリクエストを送信することです。このようにして、基本認証キャッシュはクリアされているようです。

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();
0
Thomas