携帯固有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にセッションを埋め込むとか ね.面倒ね.
Comments