IEでFacebookアプリが動かない
こんにちは、こんばんわ。eeyanaikaですー。
前回作ったCodeigniterを使ったFacebookアプリですが、IEで動きません。わお。
というわけで、まずは現象を。
前回のソースのコンストラクタ部分でログイン中のUser IDを取得しようとするが、なぜか初回のみしか取得できない。
二回目以降のアクセスではPHP SDKの getUser() の戻り値が必ず0になってしまうので、アプリで次のページに遷移しようとすると、
User IDがない→もう一度認証画面へ→認証が成功している→設定されているキャンバスURL(TOPページ)に遷移
という感じでループしてしまいます。
<?php function __construct() { parent::__construct(); require_once APPPATH."third_party/Facebook/facebook.php"; // Facebookクラスのインスタンス生成 $this->facebook = new Facebook(array( "appId" => アプリID, "secret" => アプリシークレットコード, "cookie" => true )); try { // 現在ログイン中のユーザー情報を取得する $this->user_id = $this->facebook->getUser(); } catch (FacebookApiException $e) { // // エラー処理 // } if (!$this->user_id) { // ログインURLを生成 $url = $this->facebook->getLoginUrl(array( "redirect_uri" => "http://apps.facebook.com/".アプリ名, "scope" => "publish_stream" )); // アプリ未登録ユーザーなら facebook の認証ページへ遷移 echo "<script type='text/javascript'>top.location.href = '{$url}';</script>"; exit; } }
で、調べてみるとすぐ見つかりました。
Facebookのアプリはiframe上で表示されるので、アプリ自体のドメインはFacebookのドメインと違うので(そりゃそうだ)、IEではクッキーが有効にならないんですね。
どうすればいいかというと、コンストラクタの最初でP3Pでポリシーを宣言すればいいとのこと。
<?php function __construct() { parent::__construct(); $ua = $_SERVER['HTTP_USER_AGENT']; // IEのcookieを許可する if (strpos($ua, 'MSIE') !== FALSE) { header('p3p: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'); }
ただ、P3Pのポリシー宣言は理解して使いましょう。ええ。
P3Pコンパクトポリシーをコピペするのが流行らないことを祈る | 水無月ばけらのえび日記
次はSafari対応について書きたいと思います。