BASIC 認証

ソースはこちらで公開しています。

$ hg clone http://labs.monospace.jp/hg/google monologista-google

API を作るときBASIC 認証を使っていたのですが、httpauth.py だと
Django の認証に依存していたので、書き換えました。

絶対もっとスマートに書けるんだろうなぁと思いつつ ... 。
MiddleWare にするべきか ... 。

あとは api_key は CLEARTEXT で保存されているので Digest 認証にしちゃってもいいかもですね。

これで無事 monologista API を作ることが出来ます:-P
GAE 版 monologista でも API が使えますよー(多分

import base64

from django.http import HttpResponseNotAllowed, HttpResponse
from django.utils import simplejson

from monologista.main.models import Account, Monology

def allow_methods(*methods):
    """Checking allowed methods.

    `methods` is list of HTTP method.
    ex) 'GET', 'POST', 'PUT', 'DELETE'.
    """
    def _func(func):
        def __func(request, *argv, **kwargv):
            if request.method in methods:
                return func(request, *argv, **kwargv)
            return HttpResponseNotAllowed(methods)
        return __func
    return _func

def http_login_required(realm=None):
  def decorator(func):
    def handler(request, *args, **kw):
        response = HttpResponse(status=401)
        response['WWW-Authenticate'] = 'Basic realm="%s"' % (realm or 'Django')
        try:
            (method, encoded) = request.META['HTTP_AUTHORIZATION'].split()
            if method.lower() == 'basic':
                (monologista_id, api_key) = base64.b64decode(encoded).split(':')
                account = Account.all().filter("monologista_id =", monologista_id).get()
                if not account:
                    return response
                if account.api_key == api_key:
                    return func(request, *args, **kw)
                return response
        except (KeyError,), e:
            return response
    return handler
  return decorator

private_area = http_login_required(realm='monologista')

@allow_methods('GET')
@private_area
def api_sample(request, format):
    if format == 'json':
        data = format
    else:
        data = format
    return HttpResponse(data)
    #return HttpResponse(data, mimetype='application/%s' % format)

DjangoHttpAuthMiddleware - アクセンスのおまけ - Trac
http://omake.accense.com/wiki/DjangoHttpAuthMiddleware