携帯固有IDでユーザ認証

携帯端末固有IDでユーザ認証をしてみようとテストした. ちなみに,端末IDのみで認証することが危険だから実用的じゃない!!なんて話は受け流す.

端末固有IDの取得方法は,「 ウノウラボ Unoh Labs: Pythonで携帯の機種判別をする (perezvon さん)」からライブラリを利用しました.

まず,Userモデルを拡張で Profileモデルを作成.こちらにはデバイスIDを登録できる.

# project/common/models.py

class Profile(models.Model):
    user        = models.OneToOneField(User)
    device_id   = models.CharField(max_length=100, blank=True)

端末固有IDで認証するための DeviceIdBackend を作成. ModelBackendを継承して作ってみたんだが…どうなんでしょ!?

# project/common/auth/backends.py

from django.contrib.auth.backends import ModelBackend
from project.common.models import Profile

class DeviceIdBackend(ModelBackend):

    def authenticate(self, device_id=None):
        try:
            profile = Profile.objects.get(device_id=device_id)
            return profile.user
        except Profile.DoesNotExist:
            return None

これを settings.py に情報を追加

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'project.common.auth.backends.DeviceIdBackend',
)

とりあえず,動くかどうか views.py にログイン処理を書いてみる. forms.py を書いたりしたらスッキリに見えたりするんでしょうがーんなもん無視!

# project/app/views.py

from uamobile import detect, exceptions
from uamobile.nonmobile import NonMobileUserAgent

from django.contrib.auth import login, authenticate
from django.template import loader, RequestContext as Context
from django.http import HttpResponse, HttpResponseRedirect, Http404

def sign_in(request):

    # デバイス情報の取得
    try:
        device = detect(request.META)
    except exceptions.NoMatchingError, e:
        raise Http404

    # 携帯以外のアクセス処理
    if isinstance(device, NonMobileUserAgent):
        raise Http404

    if request.method == 'POST':
        # 端末固有IDからユーザ情報取得
        user = authenticate(device_id = device.serialnumber)
        if user is None or not user.is_active:
            raise Http404
        # ログイン処理(TODO:)
        login(request, user)
        return HttpResponseRedirect('app_template.html')
    else:
        # ログイン画面表示
        t = loader.get_template('login_template.html')
        c = Context(request, {})
        return HttpResponse(t.render(c))

こんな感じでとりあえずユーザ認証はできたようだ. ちなみに,コレ携帯から試していない(笑).User Agent Switcherで偽装して成功した感じ. また,ログイン処理はSession系の処理をしないといけないはず,Cookieが使えるかとか/Getにセッションを埋め込むとか ね.面倒ね.

[Django] [Mobile]

2007/11/24 01:02 | Comments(0)

Comments

Comment Form