BASIC認証で無操作による自動的にログアウトさせる方法
Apache2.4以降だったら大丈夫の筈
COOKIE使いますので、使えない端末は多分ログイン出来なくなります
(ちょっと工夫すれば大丈夫だけど)
今時のブラウザは401レスポンスを受けてBASIC(DIGEST)認証を処理するので
ログイン中でも401レスポンスを返してやれば、認証処理が走るわけ。
これをApacheのみで自動化するのが、本稿のエッセンシャルな所
普段は、BASIC認証って下記のように書いてる筈なので、ちょっと手を加える
<Location />
AuthUserFile /pub/www/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType basic
require valid-user
</Location>
一定時間が来たら、強制的に401レスポンスを返してやればいい
タイマーなんてものは無いので、あるものを適当に使う
と言うことで、Cookieの出番。
10分間有効なCookieを作って、無かったときは強制的に401レスポンスを返してやる。
アクセス時に、Cookieをmod_rewriteで設定してやって、そのCookieが存在しなければ
レスポンスとして401を返してやればいい。
初回アクセスではCookieが存在しないので如何なる状態でも401へ飛ばされるけど
通常の認証と同じなので問題ないよね(嘘、Cookieが使えないクライアントはログイン出来なくなる。セッションクッキーと組み合わせたら解決できるけど、面倒だから書かない)
サンプルコードではLOGINって名前でCookieを作っている
1.LOGINってCookieが存在しなければ、FORCELOGIN環境変数をセット
2.LOGIN Cookieを設定(これによって、2回目(BASIC認証情報入力後)のアクセス時は、1が満たせなくなって、3もスキップされる)
3.FORCELOGIN環境変数が存在すれば、AuthUserFile で指定するユーザー認証ファイルを/dev/nullにして全ユーザーの認証が通らないようにする(これをするのにIF構文を使っているので2.4以降が必要)
4.Cookieには10分の有効期限付きなので、10分間アクセスが無ければCookieは失効して、1の処理が走り、3で強制的に認証させられる
なんかスクリプトで処理してるなら、スクリプトでLOGIN Cookieを抹消する処理してやれば、明示的にログアウトすることも出来る
RewriteEngine On
# 1. クッキーが存在していなければ、環境変数セット
RewriteCond %{HTTP_COOKIE} !LOGIN=([^;]+) [NC]
RewriteRule ^.*$ - [E=FORCELOGIN:1]
# 2. あなたのドメインと有効時間(分)を入れる
RewriteRule ^.*$ - [CO=LOGIN:1:example.jp:10:/]
<Location />
# 3. 環境変数で ユーザー認証ファイルを切り替え
<If "%{ENV:FORCELOGIN} = 1">
AuthUserFile /dev/null
</If>
<Else>
AuthUserFile /pub/www/.htpasswd
</Else>
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType basic
require valid-user
</Location>
3分間ハッキングでした