BASIC 認証でログアウトを可能にする方法

Cookie でログイン状態を管理すればいいんじゃいのかな。

まず、ログインボタンを押した時「だけ」is_logged_on を真にする。

HTTP/1.1 Authorization Required
Set-Cookie: is_logged_on=1
WWW-Authenticate: Basic realm="Hoge123456"
...

サーバ側では、Basic 認証のパスワードがあり、かつ、is_logged_on の値が真であることをチェックすればいい。

GET / HTTP/1.1
Cookie: is_logged_on=1
Authorization: Basic ...
...

HTTP/1.1 200 OK
...

で、ログアウトの際には、Cookie を消す。

HTTP/1.1 200 OK
Set-Cookie: is_logged_on=0
...

そして、is_logged_on=0 の場合には、Authorization ヘッダがなかろうが、パスワードが間違っていようが、401 を返さ「ない」。

もう眠いから間違ってるかもしれないけど (Kazuho@Cybozu Labs: HTTP 認証でログアウト処理 昔はできないって思ってたっぽいし) 。

22:59 追記: beinteractive さんに教えてもらったけど、Trac がそういうやりかたらしい (Yoshihiro Shindo on Twitter: "@kazuho trac のログインがそんな感じっぽい気がしますが") 。ありがとうございます。確かにそうやってログイン状態の遷移とセッション情報を絡めてハンドリングしないと、Session Fixation CSRF を防げないですね。

7月12日追記: kanatoko さんが以前書いてらっしゃったとのこと via はてブ (Basic認証でログアウト|freeml byGMO)