1

ユーザーページを取得しようとしています:

<?php
try {
    $pages = $facebook->api('/me/accounts?fields=id,name');
    if (isset($pages['data'])) {
        $this->assign('pages', $pages['data']);
        $this->pages = $pages['data'];
    }
} catch (\FacebookApiException $e) {
    $loginUrl = $facebook->getLoginUrl(
        array(
            'redirect_uri' => $this->container->getParameter('home_url'),
            'scope'        => 'email,manage_pages'
        )
    );
    echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>';
    exit;
}

しかし、私は無限のリダイレクトループに飛び込みます。getAccessTokenFromCodeいくつかの調査の結果、PHP SDK がメソッド内の API からエラーを取得することがわかりました。$access_token_response変数は次のとおりです。

{"error":{"message":"This authorization code has expired.","type":"OAuthException","code":100}}

PHP SDK はcodeCOOKIE から値を取得します。問題は、fbsr_{app_id}フラッシュされず、同じコードが含まれていることです。そしてそれが無限ループの理由です。

この問題を克服するにはどうすればよいですか。Cookieを削除しようと考えてfbsr_{app_id}いましたが、どうもおかしいようです。SDK がこれを処理しないのはなぜですか?

4

2 に答える 2

0

PHP 5.4を使用している場合、私もこの問題に遭遇しました。この問題を解決する方法についてのチュートリアルを作成しました。その理由は、PHPSDKがコードを正しく取得していなかったためです。

例外が受信された場合は、セッション(session_destroy()または同等のフレームワーク)を破棄するか、Cookie()を手動でクリアすることもできます。setcookie ("cookie_name", "", time() - 3600);

編集

アプリのアプリIDとアプリシークレットも正しいことを確認してください。をデコードするために使用されるため、誤ったアプリシークレットが問題になることがありsigned_requestます。

また、問題がIEに固有の場合は、コードに次のヘッダーを追加してみてください。

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT');

IEのセキュリティ設定により、Cookieがiframeに設定されない場合があります。上記のヘッダーが役立つはずです。

于 2013-02-20T13:19:55.707 に答える
0

OK、回避策を見つけたと思います。PHP SDK と JS SDK の両方を使用しています。リダイレクトには次のコードを使用しました。

echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>';
exit;

しかし、JS SDK を追加したところ、問題は発生しなくなりました。

echo "
<div id=\"fb-root\"></div>
<script type=\"text/javascript\">
  window.fbAsyncInit = function() {
    FB.init({appId: ".$app_id.", status: true, cookie: true, xfbml: true, oauth: true});
    FB.getLoginStatus(function(response) {
        top.location.href = '".$loginUrl."';
    });
  };
  (function() {
    var e = document.createElement('script'); e.async = true;
    e.src = document.location.protocol +
      '//connect.facebook.net/en_US/all.js';
    document.getElementById('fb-root').appendChild(e);
  }());
</script>
";
exit;

JS SDK/PHP SDK のバグでないかどうかはわかりません。

于 2013-02-20T14:26:43.217 に答える