Skip to content

Tornadoでの認証周り

Hiroki Nakayama edited this page Jun 30, 2015 · 16 revisions

Tornadoでの認証

Tornadoでの認証周り、具体的にはユーザのログインについて解説する。Tornadoの認証では基本的にはCookieが使われる。

そもそも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を呼び出すことで、クッキーを削除します。基本的にこれだけです。

参考

Clone this wiki locally