4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Basic認証で強制ログアウトさせて、再認証プロンプトを表示させる

Last updated at Posted at 2021-01-05

はじめに

Basic認証で強制的にログアウトさせ、別アカウントで再認証させる仕組みを作るのにすごく手間取ったのでメモを残しておきます。

結論

Ajaxで存在しないアカウントを指定し呼んで、その後location.hrefで遷移させればOK。

ソースコード

jQueryの使用を想定。
axios等を使う場合は、脳内で置き換えてください。

function logout() {
  $.get('https://logout@example.com').always(function() {  // https://example.com下がBasic認証必要と想定
    location.href = 'https://example.com';
  });
}

のような関数を作って、aタグのclickイベントとして呼び出せばOK

解説

まず前提として、Basic認証で認証情報の破棄は想定した作りになっていません。
そのため、ログアウト扱いにして再度認証のプロンプトを強制表示させるためには、ユーザーにブラウザを閉じて開き直してもらう以外には、前述のように別ユーザーとしてログインを試行すればOKです。

URLに
https://user_name:password@example.com
と入れることで、https://example.comに、IDuser_name、パスワードpasswordで認証した際と同じ挙動になります。

ここではlogoutという存在しないアカウントで試行をしたことにより、401レスポンスが返ってきて認証が破棄されます。
その後のlocation.hrefでページ遷移をすると認証情報が破棄されているので、再度プロンプトが表示されるというわけです。

Ajaxでsuccessやdoneではなくalwaysを指定しているのは、レスポンスコードが401のためsuccessを通らずfailedになるため、手抜きでalwaysを指定しています。

失敗談

当初はバックエンドのredirect処理で頑張っていましたがうまく転送されず断念。
フロントエンドだけで実装してみました。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?