NAV_MENU
賽は投げられた。人事尽くして天命待つと言うか、転がりだした物は止められないというか。まぁ、ちょとは覚悟しとけよ。
基本的に毎日更新。出来なかったときは遡ってやります。多分。きっと。出来たら良いな

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分間ハッキングでした