ええやんブログ

ええやないかのええやんブログ

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コンパクトポリシーをコピペするのが流行らないことを祈る | 水無月ばけらのえび日記 P3Pコンパクトポリシーをコピペするのが流行らないことを祈る | 水無月ばけらのえび日記

次はSafari対応について書きたいと思います。