デバッグしてください。これは、アプリの 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 ライブラリ内をすべてコメントアウトすることで問題を解決しました。
エラーはコードに関連したものではありませんでした。