-
Notifications
You must be signed in to change notification settings - Fork 4
Tornadoでの認証周り
Tornadoでの認証周り、具体的にはユーザのログインについて解説する。Tornadoの認証では基本的にはCookieが使われる。
Cookieとは、webサイトを訪れた時に、ユーザに関する情報(e.g. ユーザID、パスワードなど)を入れ、ユーザのローカルにファイルとして保存しておいたもののこと。
これを使うことで、再び同じwebサイトを訪れた時に、そのサイトに自分の情報を通知することができる。たとえば、Cookieに含まれるユーザIDとパスワードを通知することで、サイトに自動的にログインすることができる。
このように、Cookieには個人情報が含まれる場合があるので、悪用されないように注意が必要。
また、CookieはWebブラウザごとに保管することに注意しよう。これはつまり、あるサイトにChromeでログインして、CookieにユーザIDとパスワードを保存したとしても、同じサイトにFireFoxで訪れれば自動的にログインはしないということ。
Tornadoでは現在ログイン中のユーザは、リクエストハンドラ内でself.current_userとすることで利用できる。また、テンプレートの中では、current_userで利用することができる。self.current_userやcurrent_userを使用した時には、実際にはget_current_userメソッドが呼ばれている。ちなみに、get_current_userメソッドはデフォルトではNoneを返すため、オーバーライドしないとself.current_userもデフォルトではNoneを返す。そのため、self.current_userで役に立つユーザ情報を取得したい場合は、get_current_userメソッドをオーバーライドする必要がある。
ユーザがログインしているかどうかを確かめるために、if self.current_user == None:として確かめることができるが、この条件文をログイン判定が必要なすべてのメソッドに書くのは非常に面倒くさい。そこで、Tornadoではtornado.web.authenticatedデコレータを用意している。このデコレータでgetやpostメソッドを修飾することで、ログイン判定のための条件式を書かなくて済むようになる。もしログインしていなければ、アプリケーションオブジェクトのsettingで設定したlogin_urlに飛ばされる。
get_secure_cookieでcookieが格納されているかどうか調べることでログインしているか否かがわかる。逆に、ログインするときは、フォームから受け取ったユーザIDとパスワードが、データベースの中に入っているかどうかを照合して、入っていたら、set_secure_cookieする。また、set_secure_cookieとget_secure_cookieを利用する際には、アプリケーションのsettingにcookie_secretを設定しなければならない。この内容は、ランダムな文字列にする。
ログアウトするときには、clear_cookieを呼び出すことで、クッキーを削除します。基本的にこれだけです。