0

デバッグしてください。これは、アプリの Facebook 権限を処理するための私のサイトの PHP ページです。

問題 - 私のユーザーは: >>私のサイトのリンク(「インストール リンク」)をクリックします。
>>ページに送信されます: Facebook 認証が処理されます。 >>その後、ランディング ページにリダイレクトされます。
install.php
index.php

ユーザーがリンクをクリックすると、元は次のようになります。

http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE

Firefox では、代わりにこれが発生します。ユーザーは、私には理解できない無限ループにリダイレクトされ、決して終了または停止しません。
(私は 3 つのブラウザで試しました: Chrome、Firefox、Safari -これは FIREFOX でのみ発生します)

    http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE&state=df50b9c92366fe3167a561b74b570ab1&code=AQAnWnd4lcDVUhb34F5OTnE4ef9y_H3wqRarcse69ELjf5cWeT_MvAbMkIELaUDeoDCTyyge3FrbLNbhnbInAF0ksk9LREmkOygzXN1WDja_yGdSmZS_z_LfL2JtCfIFZKO72ilIkCUPFy5GmoKyQf_XEEacG1Wxp5jnRD-nJeEdiq8tjVYbK0Q6LpD2r_RIhh2SnFfra_MbZu_rBEOyiHx1#_=_

新しいパラメーターが追加されました:&state=および&code=、およびこれらの新しいパラメーターは、自身を更新して新しい変数を生成することにより、ブラウザーをビジー状態に保ちます。それは終わりのない待ち時間のようなものです。

これはinstall.php処理を行うページです:
(データベース接続が確立され、appId と Secret が適切に入力されていると仮定します)

  require_once('./facebook.php'); // FACEBOOK LIBRARY
  $config = array(
  'appId' => '#',
  'secret' => '#',
  'fileUpload' => true,
  );

  $facebook = new Facebook($config);
  $user_id = $facebook->getUser();

  define('REDIRECT_URI',"http://SITE.COM/covers/index.php?cover=uploaded&id=".$_GET['id']."&title=".$_GET['title']."");

// GET IMAGE FROM URL
  $img = $_GET['cover'];
  $photo = './covers/'.$img.''; // PATH TO THE PHOTO ON THE LOCAL FILESYSTEM
  $caption = 'I found this Cover at <3 http://SITE.COM';

    if($user_id) {

      try {
        // UPLOAD PHOTO TO USER'S PROFILE
        $ret_obj = $facebook->api('/me/photos', 'POST', array(
                                         'source' => '@' . $photo,
                                         'message' => $caption
                                         )
                                      );


        $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI));
        echo ("<script> top.location.href='".$login_url."'</script>");

      } catch(FacebookApiException $e) {
        $login_url = $facebook->getLoginUrl( array(
                       'scope' => 'email,status_update,publish_stream,photo_upload'
                       )); 
        echo '<script> window.location = "' . $login_url . '"; </script>';
        error_log($e->getType());
        error_log($e->getMessage());
      }   
    $api_call = array(
        'method' => 'users.hasAppPermission',
        'uid' => $user_id,
        'ext_perm' => 'publish_stream'
    );
    $can_post = $facebook->api($api_call);
    if ($can_post) {
    $user = $facebook->api('/me');
    $photolink = 'http://graph.facebook.com/'.$user['id'].'/picture';

            # ACTIVE SESSION, CHECK IF THE USER HAS ALREADY REGISTERED
            $query = mysql_query("SELECT * FROM users WHERE account = 'facebook' AND userId = " . $user['id']);
            $result = mysql_fetch_array($query);


            # IF NOT, ADD USER TO DATABASE
            if (empty($result)) {
                $query = mysql_query("INSERT INTO users (oauth_uid, userId, username, first_name, last_name, email, picture, account) VALUES ('facebook', '{$user['id']}', '{$user['name']}', '{$user['first_name']}', '{$user['last_name']}','{$user['email']}', '".$photolink."', 'facebook')");
                $query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());
                $result = mysql_fetch_array($query);
            }




        # NOW POST THIS ON USER'S TIMELINE
        $facebook->api('/' . $user_id . '/feed', 'post', array(
            'message' => 'JUST A TEST!',
            'name' => 'APP TESTING',
            'description' => 'THIS IS A TEST',
            'caption' => 'This is just a TEST! Hooray!',
            'picture' => 'http://test.com/test.jpg',
            'link' => 'http://SITE.COM/'
        ));
        echo 'Posted!';
    } else {
        die('Permissions required!');
    }
      echo '<br /><a href="' . $facebook->getLogoutUrl() . '">logout</a>';
    } else {

      // NOT LOGGED IN
      $login_url = $facebook->getLoginUrl( array( 'scope' => 'email,status_update,publish_stream,photo_upload') );
        echo '<script> window.location = "' . $login_url . '"; </script>';

    }

(スクリプトは、Chrome と Safari で期待どおりに機能します。)

これをテストしているのは私だけなので、「ユーザー」と言うときは、実際には自分自身を指しています。;o)
私の Cookie は無効になっていないので、それだけではないと思います。

誰が何が起きているのか理解できますか?お時間をいただき、ありがとうございます。


Facebook にアプリをインストールしていない場合、実際には次の URL を使用してoauth ダイアログ ページに移動します。

https://www.facebook.com/dialog/oauth?client_id=225230310923314&redirect_uri=http%3A%2F%2FWWW.SITE.COM%2Fcovers%2Finstall.php%3Fcover%3D685970AG58759_1338938036.jpg%26id%3D151%26title%3DZoidberg%2Bof%2BFuturama&state=f4bb3c13a2392fe0e24c3dc539e18aae&scope=email%2Cpublish_stream%2Cphoto_upload

続行すると、次の URL で追加のアクセス許可が要求されます。

https://www.facebook.com/dialog/permissions.request

少なくとも、そこまで行くことはわかっています...このページでは、「許可
」 をクリックするのが怖いです。避けられないリダイレクトが発生するからです。

とにかく、許して...

奇妙なことに、BACK to install.php... にリダイレクトされます。今に向かうはずなのにindex.php。ループするのも不思議ではありません!しかし問題は、それを修正する方法がわからないということです。@_@

追加'redirect_uri' => 'INDEX.PHP'すると、Chrome と Safari で動作しなくなります (リダイレクトは正しく行われますが、画像は投稿されません)。また、Firefox のリダイレクトのバグは修正されますが、スクリプトで指定されたアクションは実行されません (例:投稿、アップロードなど)、1 つのブラウザーが台無しになるのではなく、3 つになりました。

したがって、それは明らかに解決策ではありません。


編集-すべてを試した後、この問題を抱えているのは私だけであり、他の人でも機能することに気付きました。だから、イェイ!


編集: 解決策- これを更新して、無限リダイレクト ループの原因となった問題を実際に発見したすべての人に公開します。

これの原因は、Facebook ライブラリがエラー (APP 内のプライバシー ポリシーの欠落) を吐き出していたことであり、これが発生するたびに、ユーザーを最後のページ (具体的には install.php ページ) に戻していました。 、しかし、私のスクリプトはユーザーを Facebook に送信するため、それが無限ループに陥った理由です。Facebook はユーザーを送り返し続けますが、私のスクリプトはユーザーを Facebook に送り続けます。

// throw $e;エラーを抑制するために、Facebook ライブラリ内をすべてコメントアウトすることで問題を解決しました。

エラーはコードに関連したものではありませんでした。

4

3 に答える 3

3

私のクッキーは無効になっていないので、それだけではないと思います。

推測しないでください-チェックしてください…!

リダイレクトと組み合わせて設定された Cookie は、扱いにくい場合があります。おそらく、Cookie に依存せず、代わりにサーバー側の認証を本来の方法で実装する方がよいでしょう。

于 2012-06-07T20:35:26.007 に答える
1

解決策:これを更新して、私が実際に FIND THE PROBLEM を実行した結果、無限のリダイレクト ループが発生したことを皆さんにお知らせします。(これもかなり遅い更新です。数年遅れのようですが、とにかく...)

これの原因は、Facebook ライブラリがエラー (APP 内のプライバシー ポリシーの欠落/ すべての APP に対する Facebook の要件)を吐き出し、これが発生するたびに、ユーザーを最後のページに戻していたという事実でした (特にinstall.phpページ)、しかし、私のスクリプトはユーザーを Facebook に送信するため、無限ループに陥りました。
Facebook はユーザーを送り返し続けますが、私のスクリプトはユーザーを Facebook に送り続けます。

throw $e;エラーを抑制するために、Facebook ライブラリ内をすべてコメントアウトすることで問題を解決しました。プライバシーポリシーが欠落しており、コードに関連するものがないためだけだったので、そうしても問題ないと感じました.

エラーはコードに関連したものではありませんでした。

于 2013-06-06T09:20:18.303 に答える
0

私は同じ問題を抱えていました。コードを数回確認しましたが、すべて問題ないようです。すべてを行った後、アプリ ID とシークレットを確認し、(愚かな私) 構成配列のシークレットが間違っていることに気付きました。シークレットを変更すると、更新の問題がなくなります。この問題が IE でのみ発生している場合はheader('P3P: CP="CAO PSA OUR"');、ページの上部に配置してみてください。

于 2012-06-11T22:51:48.173 に答える