最近のいくつかのWebサービスは、twitterのOAuth機能を使って、Allowを押せば会員登録完了、なんてお手軽な仕組みを採用しているものもある。
このようにしてユーザに会員登録してもらうと、Webサービス側としては、ユーザのTwitter ID等を取得することができる。このTwitter IDというのはTwitterにログインしているユーザしか取得できず、TwitterにログインしているということはTwitterのサイト上でIDとパスワードを入力しているはずである。このため、同一のTwitter IDを持っていれば同一のユーザ、異なるTwitter IDを持っていれば異なるユーザとして考えることができる。
ところで、cakePHPにはAuthComponentと呼ばれる非常に便利なアクセス制御のための仕組みが用意されている。通常、AuthComponentの使い方としては、Webページ上で会員登録をしてもらって、ログインフォームからログインを行ってもらう。というものなのだが、TwitterのOAuthを用いて会員登録を行ってもらった場合にもAuthComponentを使えないかと思い、実際に作ってみた。
まず、twitterからのcallbackにて、ユーザの情報をデータベースのテーブルに登録する。パスワードはここで暗号化しておく。IDとパスワードに何を使うかであるか迷うところですが、基本的にユーザからは隠蔽してしまうし、Twitterからのcallbackでしかログインさせない方針であることから、各ユーザのoauth_tokenとoauth_token_secretを用いることにする。
そして、テーブルにユーザのデータを追加後、ユーザを自動的にログインさせる。なお、ログインについてはマニュアルで行うが、このあとの操作に関しては、Authオブジェクトを用いることができるし、ログアウトさせる場合は標準のlogoutアクションを用いることができる。
最後になったけど、実際のコードはこんな感じ。これをTwitterからのcallback関数の中に記述する。
[php] $username = $oauth_token; $password = $this->Auth->password($oauth_token_secret); $data = array( "User" => array( "username" => $username, "password" => $password, ) ); $this->User->save($data);
$user['User']["username"] = $username; $user['User']["password"] = $password;
if ($this->Auth->login($user)) { $this->redirect(array('action' => 'index')); } [/php]
念のためloginアクションが実行された際は、TwitterのoAuthページにリダイレクトしても良いかもしれません。