like life lives

技術以外のことに興味が寄りすぎな技術ブログ

facebokアカウントでのログイン実装5:CakePHPのAuthコンポーネントでログインする

GraphAPIはあくまでfacebookの情報を取得するためのもので、サイトのログイン機能自体は独自に用意しなくてはなりません。

pukkyuではフレームワークにCakePHP2.1を使用しており、Authコンポーネントでログインシステムを構築しています。

GraphAPIで取得したユーザー情報とサイトの独自のユーザー情報をひもづけ、サイトのユーザー情報でログインを行うことで、あたかもfacebookのアカウントでログインしているように見せることができます。

今回はCakePHPの説明になりますが、facebookアカウントでログインするために必要なAuthコンポーネントの使い方について書きます。


参考:http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html

Authコンポーネントを利用する場合、コントローラの先頭でコンポーネントを宣言します。

  public $components = array(
      'Auth' => array(
          'authenticate' => array (
              'Form' => array(
                  'fields' => array ('username' => 'login_id' ,
                                    'password' => 'password' ),
                  'scope' => array('User.state' => DB_STATE_ALIVE)
                  )
              ),
          'loginAction' => array (
              'controller' => 'users' ,
              'action' => 'form' ,
              'plugin' => false ,
              'admin' => false
              )
       )
       //,
       // 他のコンポーネント 
    );

上記は実際にpukkyuで指定しているAuthコンポーネントの設定です。

Authコンポーネントでログインする場合、通常はユーザーがフォームに入力したメールアドレスとパスワードをコンポーネントに渡し、loginメソッドを呼び出します。

     if ($this->request->is('post')) {
        if ($this->Auth->login()) {
          // 成功
        } else {
          // 失敗

        } 
    }


この方法をそのまま使おうとするとフォーム入力が必要になります。

しかし今回はfacebookのページで認証が完了しているので、あらためてのログイン認証は不要です。

Authコンポーネントで無条件でのログインを実行したい場合、データベースからfindで取得したユーザーデータのオブジェクトを引数に指定し、loginメソッドを実行します。

たとえばデータベースの "user" テーブルにユーザーのログイン情報が格納されており、facebookのユーザーIDがfacebook_idカラムに格納されていると仮定します。

対象のユーザーのfacebookのIDが$xとすると、

       // ログイン情報取得
      $userMainAccount = $this->User->find( 'first',
                    array ('conditions' =>
                              array ('User.facebook_id' => $x)
                    )
               );

       // ユーザー情報をそのままログインに使う
      if ($this-> Auth->login($userMainAccount)) {
          // 必ず成功する
     }

userテーブルにすでにユーザーが登録されていればこれでログインは完了です。

実際には初回ログイン時にuserテーブルにレコードを作成する必要があるので、


       // ログイン情報取得
      $userMainAccount = $this->User->find( 'first',
                    array ('conditions' =>
                              array ('User.facebook_id' => $x)
                    )
               );

      if (isset($userMainAccount) && is_array($userMainAccount) ) {
      // ユーザー情報をそのままログインに使う      
        if ($this-> Auth->login($userMainAccount)) {
          // 必ず成功する
        }
      }
      else {
        // ユーザーが存在しないのでレコードを登録する
      }


という処理になります。

facebookアカウントでログインさせるための実装は、今回で終了です。

次回はこのフローにちょっと関係するCSRFについてです。