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()


401が返されるブラウザはみなれたダイアログを表示します。


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()