Apache httpdやnginxの設定でBasic認証のログアウトを簡単に実現する方法

Pocket

※ 以下の内容はChrome47、Opera34でうまく動作しましたが、IE11、Edge25、FireFox43では認証が残ったままになり、意図通り動作しませんでした。そもそもBasic認証はブラウザがサーバへユーザID/パスワードを一方的に送ってくる方式のため、確実にログアウトできるかはブラウザ次第です。HTTPの仕様としてBasic認証のログアウトが組み込まれない限り、サーバ側からどんな操作をしたところで確実なログアウトは不可能かと思います。


Basic認証を利用してアクセス制限を行った場合、ブラウザに認証状態が残るため2度目以降のアクセスはログインID/パスワードを聞かれません。
この認証が通った状態は、ブラウザを終了するまで残ります。複数のブラウザを起動していたり複数のタブを開いている場合は、すべてのブラウザを閉じないといけないのでちょっと面倒です。認証が必要なサイトの操作が終わったときに、意図的に認証状態を破棄できた方が安心です。

そこで、nginxの設定でログアウトが簡易的に実現できないかやってみたところ、あっさりできたので紹介します。

    location /hoge/ {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/conf.d/htpasswd;

        root /usr/share/nginx/html
    }

    location = /hoge/logout.html {
        return 401;
    }

上記は /hoge/ にBasic認証をかけています。そして /hoge/logout.html にアクセスがあった場合に ステータスコード 401 を返しています。
logout.htmlファイルを用意する必要はありません。

この設定を入れて logout.html へアクセスした様子。

この後、Basic認証がかかっているページへアクセスすると…。

いい感じです。

Apache httpdの場合は次のような感じです。

<Location /hoge>
    SSLRequireSSL
    AuthType       Basic
    AuthName       "Restricted"
    AuthUserFile   "/etc/httpd/conf/htpasswd"
</Location>

<ifModule mod_rewrite.c>
    <Location /hoge/logout.html>
        RewriteEngine on
        RewriteRule '' '' [R=401,L]
    </Location>
</ifModule>

簡易的なログアウトとしては十分な気がしますが、Chrome、Operaでしか動作しないのが残念です。
もっといい方法が見つかったら、また紹介したいと思います。

Pocket

コメントを残す

メールアドレスが公開されることはありません。