2014年7月15日火曜日

fuelphpでFacebook SDK for PHP v4を使って、ログイン処理と情報取得を実装してみた的なお話

  • このエントリーをはてなブックマークに追加

コロコロ仕様が変わって大変面倒なFacebook API。
今までは内部的なところだったりなどして、APIを使うエンジニア側としてはそんなでもなかったけど、
ここにきて遂にFacebookが本気出したのかGraph APIをv2.0にアップデートさせてきた。

これによって何か変わるかというと、/meでやっていたものをv2.0/meにしないといけないみたいな。
もちろんこれだけではないんだけど細々と取り方とかが色々と変わり、
さらにSDKのメジャーアップデートがなされてPHPはv4になったという。

で、PHP SDK v4を使ってログインとか自分のデータを取り出すとかやってみたので、今日はその話をば。
ちなみにちょっと長いので要注意的な。

■大きな変更点

・PHP5.4以上が必要
・namespaceが使える
・$facebook->api()みたいな呼び出し方じゃない
・クラス数が半端ない
・取得した自分の情報はprotectedなobjectなのでasArray()しないといけない
などなど列挙すると切りがない感じ。

諸々かなり面倒なことになっているので気をつけましょう的な。


■fuelphpでとりあえずログインとか情報処理の作業的なコードとか諸々

Facebook SDK for PHP v4のダウンロードはこちらから
githubに上がってる最新版?をダウンロードするとフォルダ構成が違うので、このリンクを推奨的な。

で、ダウンロードしたらfuelphpのいつも通りのvendorフォルダにアップロードし、bootstrap.phpを書き換え。

// APPPATH."bootstrap.php"

Autoloader::register();

require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookSession.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookRedirectLoginHelper.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookRequest.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookResponse.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookSDKException.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookRequestException.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/FacebookAuthorizationException.php";
require APPPATH."vendor/facebook-php-sdk-v4/src/Facebook/GraphObject.php";
require APPPATH."vendor/facebook-php-sdk-v4/autoload.php";
とりあえずAutoloader::register()の下辺りにrequireするためのパスを諸々記述。
// APPPATH."classes/controller/welcome.php"

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\GraphUser;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookAuthorizationException;

class Controller_Welcome extends Controller{
  
  public function before(){
    session_start();
    FacebookSession::setDefaultApplication("appId","appSecret");

    $helper = new FacebookRedirectLoginHelper("http://hogehoge.com/welcome/callback");
    
    try{
      $session = $helper->getSessionFromRedirect();
    }
    catch(FacebookRequestException $e){
      echo $ex->getMessage();exit;
    }
    catch(\Exception $e){
      echo $e->getMessage();exit;
    }

    if(!isset($session)){
      $loginUrl = $helper->getLoginUrl();
      Response::redirect($loginUrl);
    }
  }
  
  public function action_index(){
    return Response::forge(View::forge('welcome/index'));
  }
  
  public function action_callback(){
    session_start();
    FacebookSession::setDefaultApplication("appId","appSecret");

    $helper = new FacebookRedirectLoginHelper("http://hogehoge.com/welcome/callback");
    
    try{
      $session = $helper->getSessionFromRedirect();
    }
    catch(FacebookRequestException $e){
      echo $ex->getMessage();exit;
    }
    catch(\Exception $e){
      echo $e->getMessage();exit;
    }

    if(isset($session)){
      $request = new FacebookRequest($session,'GET','/me');
      $response = $request->execute();
      $graphObject = $response->getGraphObject()->asArray();

      print_r($graphObject);
    }
  }
}
beforeにてFacebookのセッションがあるかどうかを確認。
なかったらログインして/welcome/callbackにリダイレクトをするようにって感じ。
で、/welcome/callbackではFacebookRequestというので自分の情報を取得し、
それがprotectedなobjectで返ってくるのでasArray()というメソッドを使って分解するという。

とりあえずなんとも面倒な感じのものになっちゃったなぁって感じ。
特にnamespaceをuseしまくるのが個人的には好きではなかったり。

注意点としてFacebookRedirectLoginHelperを使う際に、下のようなエラーが出てしまうことがある。
「Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request」
これが発生してしまう原因としては、ドメインルートに戻す場合にスラッシュ(/)が付いていないという感じ。
つまり下記のような感じだけど、ドメインルート以外はついていなくても大丈夫。
×  $helper = new FacebookRedirectLoginHelper("http://hogehoge.com");
○  $helper = new FacebookRedirectLoginHelper("http://hogehoge.com/");
○  $helper = new FacebookRedirectLoginHelper("http://hogehoge.com/welcome/callback");


ってな感じでとりあえずの普通に使うだろうというものを書いてみた。
日本語での情報もほとんどないし、developersに書いてある情報も詳しくなかったりで面倒だけど、
Facebookにしては今回はかなり移り変わるまでに時間をかけてくれそうなので諸々修正しないといけないなぁって感じ。

ちなみに日本語で情報を書いている人もいるけど、ちゃんとasArray()について書いている人はいなかったり。

個人的には前のバージョンの方がさくっと書けたからよかったんだけどなぁって感じ。
そのうち気が向いたらfuelphpで使えるpackageなりを書いてみようかな的なみたいな。

Adsense