Django でユーザ管理をアウトソース

Webサービスを開発するにあたり、ユーザにパスワードをもう一組管理させるのは避けたい。というか自分が管理したくない。ポータル的なサービスじゃない限り、それは無駄に敷居を上げてるだけなんじゃないかな。

特にこれだけ開発が簡単になってくると、ちょっとしたサービスを作ってすぐ公開とかもあるだろう。それら全てにアカウントとパスワードを覚えていられない。自分が今この状態で、このサービスにはどの名前とパスワードだっけ?と途方に暮れることも多い。

そんなわけで、本棚アプリはユーザ管理を丸投げすることにしよう。
うまい具合にはてなやlivedoorが認証APIを公開してるし、YAHOOも公開間近な雰囲気。これを利用しない手はないでしょう。

ついでに認証部分を Django のアプリ「django-authapi」として公開しておく。ライセンスはMIT。
http://djangoauthapi.reguzy.jp/ にアクセスすると、どんなものか分かります。今は認証APIにリダイレクトして、認証API側からリダイレクトするとユーザを作成するだけ。

Python 2.4, Django 0.97 pre が必要。
プラガブルなアプリにしてるつもりだけど、なってないよ、っていう場合はコメントするかチケットを作成してくださいな。

2007/09/24 修正
Ver.0.2.1 に修正。Djangoの認証と共存できるようにした。

詳しい使い方はあとで書く。

使い方

http://reguzy.jp/trac/browser/tags/djangoauthapi/0.2.1/readme.txt
だいたいのところはこれを読めばわかるかな・・・

認証APIのアプリ登録

まずこれをしないと始まらない。今のところ対応しているのは2つだけ。

以下ははてなについて説明するけど、livedoorでも流れは同じ。hatena -> livedoor に読み替えること。
コールバックURLは /authapi/hatena/ とする。

Django プロジェクトの設定

次に authapi をコピーして、urls.py で authapi.urls.py をインクルードする。

urlpatterns += patterns('',
    (r'^authapi/', include('authapi.urls')),
)

settings.py に以下の設定を追加して、APIキーと秘密鍵は認証APIで取得したものに修正する。

# input your application setting
HATENA_AUTH_API_KEY = 'hatena_auth_api_key'
HATENA_AUTH_SECRET = 'hatena_secret_key'
LIVEDOOR_AUTH_API_KEY = 'livedoor_auth_api_key'
LIVEDOOR_AUTH_SECRET = 'livedoor_secret_key'
AUTHENTICATION_BACKENDS = (
    'authapi.views.AuthApiBackend',
    'django.contrib.auth.backends.ModelBackend',
)
ログインURLを設定する

テンプレートなら {% url authapi-hatena-login %} を、ビューなら reverse('authapi-hatena-login') を使う。
取得するURLはこれ -> /authapi/hatena/login/
処理は redirect_to_auth が行っていて、認証APIのページにリダイレクトするだけ。
(はてなの場合 http://auth.hatena.ne.jp/auth?api_key={api_key}&api_sig={api_sig} にリダイレクト)


これで使えるようになるはず。

処理の流れとか

/authapi/hatena/login/ にユーザがアクセスしたら認証APIに飛ばす。そこでユーザが許諾すると /authapi/hatena/ にリダイレクトされてくる。その時に渡されるGETパラメータを使って、ユーザ情報をはてなに問い合わせている。取得できるのは ID とか、プロフ画像?とか。Django-authapi で使うのはIDだけ。

ユーザ情報が取得できたら、ID@hatena という名前とパスワード:ランダム文字列 でDjangoのユーザを作成してログインさせる。


ここでパスワードを固定にしているのは、Django側でログインさせるための処置。
ユーザのパスワードがわからないと、authenticate ができない。なので login もできない。
が、はてなとかのパスワードは当然こちらではわからないので、パスワードを固定にするしか思いつかなかった。

したがって、Django-authapiを使う場合は独自のログイン画面を用意しないこと。
使う場合は十分な注意が必要。少なくとも ID@hatena : dummy でログインできないようにする必要がある。

2007/09/24 追記
カスタムの認証バックエンドを使って、Django の認証と共存できるようにした。パスワードもランダムな文字列を設定するようにしたので、気にしなくても大丈夫なはず。