Django でユーザ管理をアウトソース
Webサービスを開発するにあたり、ユーザにパスワードをもう一組管理させるのは避けたい。というか自分が管理したくない。ポータル的なサービスじゃない限り、それは無駄に敷居を上げてるだけなんじゃないかな。
特にこれだけ開発が簡単になってくると、ちょっとしたサービスを作ってすぐ公開とかもあるだろう。それら全てにアカウントとパスワードを覚えていられない。自分が今この状態で、このサービスにはどの名前とパスワードだっけ?と途方に暮れることも多い。
そんなわけで、本棚アプリはユーザ管理を丸投げすることにしよう。
うまい具合にはてなやlivedoorが認証APIを公開してるし、YAHOOも公開間近な雰囲気。これを利用しない手はないでしょう。
ついでに認証部分を Django のアプリ「django-authapi」として公開しておく。ライセンスはMIT。
http://djangoauthapi.reguzy.jp/ にアクセスすると、どんなものか分かります。今は認証APIにリダイレクトして、認証API側からリダイレクトするとユーザを作成するだけ。
- ダウンロードはこちら -> Django-authapi 0.2.1
- ソースはこちら -> http://reguzy.jp/trac/browser/tags/djangoauthapi/0.2.1
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 の認証と共存できるようにした。パスワードもランダムな文字列を設定するようにしたので、気にしなくても大丈夫なはず。