GITkitを使ってみる Part2

Part1では単純にAccount Chooserを立ち上げたに過ぎませんでした。きちんとユーザ認証出来るように改造していきます。

OAuth2.0を使わないユーザ認証

GITkitを使うといっても、必ずGoogleYahoo! (以下IDP...IDentitiy Provider) のメールアドレスじゃないとユーザ登録出来ないのではちょっと不便です。そのサイト固有のユーザ情報を登録したいときもあります。そこでもう一度Account Chooserのユーザインターフェイスを見てみます。


左側のペインはIDPを使ったログインのためのインターフェイスです。そして右側がサイト固有のアカウントでログインするためのインターフェイスです。今回は右側を作って行きます。


GITkitでは、Javascriptで設定したコールバックURLをハンドリングすることでユーザ認証を実現します。つまりGITkit側が既定のコールバックURLに対してGETやらPOSTを投げてくるのです。これらのリクエストに適宜返答していくことで全体のユーザ認証を実現することが出来るわけです。

それでは一つ一つ見ていくことにします。

/usrStatusUrl

こちらのコールバックURLはずばり、Account Chooserの右側にメールアドレスを入力し、ログインボタンを押した時にコールバックされてきます。ここでは引数として渡ってくるメールアドレスが登録済みのものかどうかをチェックして、結果をJSON形式で返します。データストアを使って超簡単に作ってみました。

class UserInformation(db.Model):
    email = db.StringProperty(required=True)
    password = db.StringProperty(required=True)

# /userStatusUrlのコールバックハンドラ
class UserStatusPage(webapp.RequestHandler):
    def post(self):
        email = self.request.get('email')
        query = UserInformation.all().filter('email = ', email)
        if query == None or query.count() != 1:
            response = {"registered" : False}
        else:
            response = {"registered" : True}

        self.response.content_type = 'application/json'
        simplejson.dump(response, self.response.out, ensure_ascii=False)


データストアに指定されたメールアドレスを照会しています。もし存在していれば、「registered: True」で返します。存在していなければ「registered: False」で返します。もしTrueを返すと以下のようなパスワードプロンプト画面が表示されます。


そしてもしFalseを返すと /signup がコールバックされます。

/login

↑で書いたパスワードプロンプトにパスワードを入れてもらい、ログインすると /login がコールバックされます。普通であればここはhttpsを使うんでしょうね (そうしないとパスワードが平文で流れてしまうので) 。引数として受け取ったメールアドレスとパスワードを照会して、結果をJSON形式で返却します。

こちらも先ほどと同様、データストアを使って簡単に実装しています。

class MyLoginPage(webapp.RequestHandler):
    def post(self):
        email = self.request.get('email')
        password = self.request.get('password')

        query = UserInformation.all().filter('email = ', email).filter('password = ', password)
        if query == None or query.count() != 1:
            response = {'status' : 'PasswordError'}
        else:
            response = {'status' : 'OK'}

    self.response.content_type = 'application/json'
    simplejson.dump(response, self.response.out, ensure_ascii=False)


一致するユーザ情報があれば、「status: OK」を返します。もしなければ (パスワードが間違っていれば) 「status: PasswordError」を返します。とっても簡単な作りになっています。ここでPasswordErrorを返すとこんな感じに表示されます。


Trueを返すと /home にリダイレクトされます。

/home

こちらはサイト固有のアカウントでログインが成功した後リダイレクトされるURLです。

/signup

このURLは入力したメールアドレスがまだ登録されていない場合にコールバックされます。そこでパスワードや他の情報を入力してもらうことになります。


サイト固有のユーザ認証を実現するのはとても簡単でした。次は (当然ですが) IDPを使ったユーザ認証に挑戦します。