HTTP 基本認証資格情報はブラウザーを閉じるまで保存されますが、ブラウザーを閉じる前に資格情報を削除する方法はありますか?
HTTP 401 ステータス コードを使用したトリックについて読みましたが、正しく機能していないようです(コメントを参照して回答してください)。おそらく、trac が使用するメカニズムが解決策です。
JavaScript で資格情報を削除できますか? それとも JavaScript とステータス 401 トリックの組み合わせでしょうか?
HTTP 基本認証資格情報はブラウザーを閉じるまで保存されますが、ブラウザーを閉じる前に資格情報を削除する方法はありますか?
HTTP 401 ステータス コードを使用したトリックについて読みましたが、正しく機能していないようです(コメントを参照して回答してください)。おそらく、trac が使用するメカニズムが解決策です。
JavaScript で資格情報を削除できますか? それとも JavaScript とステータス 401 トリックの組み合わせでしょうか?
更新: このソリューションは、多くのブラウザーでは機能しないようです。カイツのコメント:
偽の資格情報を送信してブラウザに正しい認証資格情報を忘れさせるこのソリューションは、Chrome (16) および IE (9) では機能しません。Firefox (9) で動作します。
実際には、偽の資格情報をサービスに送信することで回避策を実装できます。これは、別の (存在しない?) ユーザー名をパスワードなしで送信することにより、ブラウザーで機能します。ブラウザーは、認証された資格情報に関する情報を失います。
例:
https://www.example.com/ =>「user1」として基本認証でログイン
開催中
https://foobar@www.example.com/
ログアウトしました。;)
よろしく
Ps: ただし、与えられた情報に頼る前に、必要なすべてのブラウザでこれをテストしてください。
Jan.の回答を拡張し、owyongskの回答を更新します。
これは、ブラウザが本質的に保護しようとしているページに偽のログイン要求を送信するようにするjquery java-scriptコードの例です。これにより、テストされたすべてのブラウザでキャッシュされた資格情報が削除され、ユーザーが保護されていないページにリダイレクトされます。ページ。
何か問題が発生したときの 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() 関数を呼び出すだけで簡単になり、ユーザーにはシームレスに機能するように見えましたが、技術的にはまだハック ジョブです。
最新の Chrome と Firefox で現在機能しているハックを試すことができます。ユーザー名: false、パスワード: false などの特定の資格情報のみを受け入れる "/logout" ページをサーバー上に作成します。次に、以下の 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 から偽のユーザー名とパスワードがキャッシュされ、ユーザーがページにログインしようとすると、キャッシュされた偽の資格情報が使用され、認証に失敗し、ユーザーに尋ねます。別のものを入力します。お役に立てれば!
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>
私にとっては問題なく機能した実装を終えたところです。サーバーでセッション、ユーザー名、およびパスワードを評価するため、その情報を追跡します。ログインアルゴリズムは次のとおりです。
1.ユーザーとパスワードが空でないかどうかを確認し、空でない場合は 401 を返します。
2. ログイン ユーザー リストにセッションが登録されているかどうかを確認します。登録されていない場合は、ユーザーとパスワードが有効かどうかを確認し、有効な場合はセッション ID をリストに保存してから 401 を返します。この手順について説明します。セッション ID が異なります。次の 3 つのいずれかが発生しました。a) ユーザーが別のウィンドウを開いています。b) ユーザー セッションが終了しました。つまり、ユーザーがログアウトしました。c) 非アクティブのためにセッションが期限切れになった。ただし、ユーザー資格情報が有効である限りセッションを保存したいのですが、401 を返してパスワードを 1 回要求します。セッションを保存しないと、新しいセッション ID がないため、ユーザーはログインできません。私たちのリストにあります。
3.ユーザー資格情報が正しいかどうかを確認し、正しい場合はセッション情報を保存してページの提供を続行し、そうでない場合は 401 を返します。
そのため、ユーザーをログアウトする必要があるのは、ユーザーがログアウト ページを要求し、Web ブラウザーが再びログイン ダイアログを表示したときに、サーバーでセッションを閉じることだけです。
これを書いているときに、なりすましを避けるためにユーザーが既にログインしているかどうかをプログラムがチェックするステップが必要だと考えています。複数のセッションを許可するために、ユーザーごとに複数のセッション ID を保存できるかもしれません。それについてのあなたのコメント。
アイデアが得られることを願っています。セキュリティ上の欠陥があればコメントしてください;)
Chrome (バージョン 66) でうまくいったのは、401 を返す URL に Ajax リクエストを送信することです。これにより、基本認証キャッシュがクリアされたように見えます。
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();