0

PHP Facebook SDK に問題があります。同じ種類の問題 (アクセス トークンが無効、リダイレクト ループなど) について話している多くの投稿を読みましたが、どれも役に立ちませんでした。

簡単に言えば、私のプロジェクトの設計方法:

これは、Facebook にログインしているユーザーのみが実行することを意図した Facebook アプリケーションです。Yii フレームワークを使用して、ページが読み込まれるたびに呼び出されるフィルターを作成し、Facebook にログインしているユーザーだけがコンテンツを表示できるようにします。これは、Facebook のアプリケーション BranchOut とまったく同じように動作する必要があります。

私の問題とそれを再現する方法:

  • Facebook からの一般的なログイン プロセス (OAuth、アクセス トークン) を使用して、アプリケーションにログオンします。
  • Facebook ページで手動でログアウトし、アプリケーションで新しいアクションを実行しようとしています
  • フィルターは、私が Facebook にログインしているかどうかをチェックします。ログインしていないため、Facebook のログイン ページにリダイレクトされます。
  • Facebook に再度ログインすると、Facebook とアプリケーションのフィルターの間で典型的な無限ループが発生します。

これが私のフィルターのコードです:

$fb_logged = false;
try
{
    $user = Yii::app()->facebook->getUser();
    $me = Yii::app()->facebook->api('/me');
    $fb_id = $me['id'];
    $fb_logged = true;
}
catch (Exception $e)
{
    $fb_logged = false;
}

if($fb_logged)
{
    print_r($fb_id. ' has logged');
    /* Check if user exists on MyApp 
     ... */
}
// If user NOT logged on FB, send him to the FB login page
else
{
    $loginUrl = Yii::app()->facebook->getLoginUrl(array(
                'redirect_uri' => Yii::app()->getRequest()->getUrl() // I have tried many things here.
        ));
    echo("<script> top.location.href='" . $loginUrl . "'</script>");
    Yii::app()->end();
}

正確に何が起こっているかというと、FB にログインした後、同じ URL へのリクエストが行われるため、Filter が再度呼び出されます。その時点で、api('/me') を呼び出すと、有効なアクセス トークンが見つからないため、例外が生成され、ループが開始されます。

Facebook のアプリ設定に従って、すべての URL とドメイン名を確認しました。また、新しい特定の URL にリダイレクトするなど、多くのことを試しましたが、これがまだ同じユーザーであることを確認したい (または、ユーザーが変更された場合はその結果として行動したい) ため、フィルターも使用する必要があります。

機能する唯一の方法は、ユーザーをフィルターのないページにリダイレクトすることです (api("/me") への呼び出しは行われません)。次に、アプリケーション内の新しいリンクを手でクリックすると、アクセス トークンが見つかります。そして、これは私が望む動作ではありません。

誰かが私を助けてくれることを本当に願っています!

前もって感謝します。

4

2 に答える 2

1

新しいログイン試行の後、リダイレクト先の URL で新しいコードを取得する必要があります。そのコード パラメータを探して、そこにある場合は、新しいアクセス トークンと交換します。

于 2012-06-07T17:19:08.630 に答える
0

yiiauth拡張機能も見てください。今日投稿されたばかりで、Facebook、OpenID、Google、Twitter、Yahoo など、29 の異なるプロバイダーでログインできます。

HybridAuthライブラリと AFAICT を使用して、認証を非常に簡単にします。

于 2012-06-11T13:03:24.300 に答える