Djangoでbasic認証をかける
djangosnippetsにmiddlewareのサンプルがあります
Django snippets: Basic Auth Middleware
ついでにBasic認証の仕組みをメモしておこうと思います。
Basic認証の流れ
1. クライアントが認証が必要なページをリクエスト
2. サーバーはユーザー名とパスワードが送られてこない場合、401を返す
この部分ですね
def process_request(self,request): if not request.META.has_key('HTTP_AUTHORIZATION'): return self.unauthed()
3. ユーザによりユーザ名とパスワードが入力されると、クライアントはリクエストに認証ヘッダを追加して再度送信します。
ユーザ名とパスワードの組みをコロン ":" で繋ぎ、Base64でエンコードしたものが送信されます
確認してみます。当然ですが一致してますね
import base64 print base64.encodestring('user:pass') # => dXNlcjpwYXNz
4. 認証に成功するとリクエストを処理する。ユーザ名やパスワードが間違っていた場合は401を返す。
以下の部分ですね。送信された認証ヘッダをbase64デコードしてコロン":"でスプリットして、設定と一致するかチェックしてます。
else: authentication = request.META['HTTP_AUTHORIZATION'] (authmeth, auth) = authentication.split(' ', 1) if 'basic' != authmeth.lower(): return self.unauthed() auth = auth.strip().decode('base64') username, password = auth.split(':', 1) if username == settings.BASICAUTH_USERNAME and password == settings.BASICAUTH_PASSWORD: return None return self.unauthed()