そんな激アツなFacebookとCakePHPを連携してアカウントを作成するコントローラーを作成してみました。
- まずはオフィシャルのphp-sdkを入手
- ゲットしたファイル群をapp/vendorsにfacebookディレクトリを作って丸ごとぶち込む
- FacebookControllerを作成(ユーザ情報のテーブルを扱えるならなんでもいい)
まずはメンバ変数$facebookを宣言して、beforeFilter()でインスタンスを生成します。
var $facebook; function beforeFilter(){ App::import('Vendor', 'facebook/src/facebook'); $this->facebook = new Facebook(array( 'appId' => '123456789123456789', 'secret' => '123456abcdefghijklmnopqrstuvwxyz', 'cookie' => true, )); }appIdとsecretは自分で登録したアプリの情報に置き換えてください。
php-sdkのexampleではFBMLとJavascriptを使ってログインボタンを生成してますが、今回は純粋にFacebookController::index()にアクセスしたらFacebookに飛ばされて初回だけ承認する流れにします。
なぜならphp以外の記述がめんどくさいからです!
では以下のようにindex()を用意します。
function index(){ $this->autoRender = false; $url = $this->facebook->getLoginUrl(array('next' => 'http://localhost/facebook/callback', 'req_perms' => 'email,publish_stream')); $this->redirect($url); }ここで重要なのが$autoRenderにfalseを代入しとかないとリダイレクトしてくれません。ちょっとハマりました。
でgetLoginUrl()メソッドでurlを生成するんですが、引数の連想配列に'req_perms'というキーでアプリからアクセス出来るapiを選べるんです。ユーザ登録に使うのでemailと、あとウォールへ書き込み出来るようにpublish_streamも入れています。ここのページでいろんなapiが確認出来ますよ->Permissions - Facebook開発者
でさらにcallback()を用意します。
function callback(){ $session = $this->facebook->getSession(); $me = null; if ($session) { try { $uid = $this->facebook->getUser(); $me = $this->facebook->api('/me'); } catch (FacebookApiException $e) { error_log($e); } } $access_token = $this->facebook->getAccessToken(); $user_data = array( 'User' => array( 'username' => $me['first_name'].'.'.$me['last_name'], 'password' => $this->Auth->password(mt_rand()), 'email' => $me['email'], 'other_service_id' => array('facebook' => $me['id'], 'token' => $access_token) ) ); }承認して戻って来たユーザの$sessionをとって確認して、api('/me')でユーザ情報の部分を叩けば名前とか、性別、言語等がゲット出来ます。ちなみにgetLoginUrl()のreq_permsで指定したemailも$meの中に入ってるんでpr($me)してみるといいと思います。
ここまでできたら$data['User']作成してユーザ登録、ログイン処理という感じなんですがaccessTokenも一緒にDBに保存しておけば以下のコードでウォールへの投稿もできましたよ。
$attachment = array( 'access_token' => $access_token, 'message' => "This is test.", 'name' => "name test", 'link' => "http://testtesttesttesttest.com", 'description' => "here description", 'picture'=> "http://example.jp/image.jpg" ); $this->facebook->api('/me/feed', 'POST', $attachment);
こんなかんじで簡単にFacebbokConnectをCakePHPで使えました。