4
class Example extends CI_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {

        $this->load->library('facebooklib');

        $user = $this->facebooklib->getUser();

        if ($user) {
            try {
                $data['user_profile'] = $this->facebooklib->api('/me');
            } catch (FacebookApiException $e) {
                $user = null;
            }
        }

        var_dump($_REQUEST);

        if ($user) {
            $data['logout_url'] = $this->facebooklib->getLogoutUrl();
        } else {
            $data['login_url'] = $this->facebooklib->getLoginUrl();
        }

        $this->load->view('view',$data);
    }
}

ログイン リンクをクリックすると、Facebook のアクセス許可ページに移動し、同意すると、データのない同じページに戻ります。

array(3) {
  ["/example"]=>
  string(0) ""
  ["PHPSESSID"]=>
  string(32) "33a446883d4fb1877fb6dcff6d70799a"
  ["ci_session"]=>
  string(311) "a:4:{s:10:"session_id";s:32:"d8bb3926550e3ec1b9d075b456708e9b";s:10:"ip_address";s:9:"127.0.0.1";s:10:"user_agent";s:120:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19";s:13:"last_activity";i:1336011855;}c874fb95984396f04ab6cc17217102d7"
}

私の $_REQUEST ダンプには実際には signed_request が表示されません。これが問題です。

4

3 に答える 3

5

すべての反対票にもかかわらず、CodeIgniterを使用したFacebookPHP-SDKで見つかったこの非常に深刻なバグの解決策を見つけることができました。

したがって、CIフォーラムで見つかったソリューションは次のとおりです。http://codeigniter.com/forums/viewthread/202370/#986781

    // Stop cache
    $this->ci->output->set_header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
    $this->ci->output->set_header("Pragma: no-cache");

    // IE Fix
    if(strpos($this->ci->agent->agent_string(), 'MSIE') !== FALSE) {
        $this->ci->output->set_header('p3p: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"');
    }

    // Repopulate _REQUEST ... Facebook needs it.
    $request_uri = $_SERVER['REQUEST_URI'];
    $request_uri = explode('?',$request_uri);
    if(count($request_uri) > 1) {
        parse_str($request_uri[1], $_REQUEST);
    }

何らかの理由で、新しいPHPSDKはCodeIgniterを介して$_REQUESTを渡しません。キャッシュに関する問題もあり、IEには適切なヘッダーがありません。

したがって、これは$ _SERVER['REQUEST_URI']から$_REQUESTを構築し、Facebookクラスを適切に通過して、適切なデータを正常に返します。

于 2012-05-03T06:56:57.230 に答える
0

この指示を使用すると、これが役立つ場合があります

$signed_request = isset($_REQUEST['signed_request']) ? $_REQUEST['signed_request'] : $this->modelfacebook->signRequest();
于 2012-05-03T05:25:45.407 に答える
0

この投稿の回答の 1 つによると、CodeIgniterはセキュリティ上の理由から $_REQUEST 変数を削除しますCodeigniter Manual hereで説明されている自動入力フィルタリングに関連していると思いますが、特に言及されていません。設定するか迷っています

 $config['global_xss_filtering'] = TRUE;

config.php では、影響を受けるかどうかはわかりませんが (私の場合は TRUE に設定しています)、少なくとも $_REQUEST 変数が使用できない理由がわかります。

興味深いことに、CIApplication/libraries/ フォルダーに FB SDK ライブラリがあり、ビューやコントローラーではなく、$_REQUEST 変数に問題なくアクセスしているようです。

この投稿に出くわしたとき、同じ質問への回答を探していました-そして、あなたの質問も完全に有効で、良い質問です!

乾杯マット

于 2012-09-16T06:32:16.283 に答える