Браузер перенаправляется за пределы Facebook вместо перенаправления его внутри iframe

Я только что создал приложение Facebook, это моя первая попытка, и я полностью выполнил документацию разработчика developerWorks, выполняя все, как указано, я застрял в этой странной ситуации:

  1. Во время аутентификации моего приложения приложение перенаправляет мой браузер за пределы Facebook на страницу веб-сайта, на которой размещается мой сайт, а не перенаправляет его внутри iframe. Не удается перенаправить на другую страницу в моем приложении прямо плюс также не использовать страницу пространства имен приложений
  2. Я не могу получить user_id из подписанного параметра запроса

код для landhere.php

<?php include ('src/facebook.php'); $app_id = "*******"; $app_secret = "*********"; $redirect_uri = "http://myweb.com/myapp/landhere.php"; //$redirect_uri = "http://appplatform.info/WFBRU/start.php"; //$redirect_uri = "http://apps.facebook.com/wfbrumapp"; $signed_request = $_REQUEST["signed_request"]; list($encoded_sig, $payload) = explode('.', $signed_request, 2); $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); $id = $data["user_id"]; $authorized_code = $_GET["code"]; $oauth_token = $data["oauth_token"]; $like_status = $data["page"]["liked"]; echo "<br>page id = $id"; echo "<br>page admin = $authorized_code"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; if (empty($authorized_code)) { echo "string"; $_SESSION['state'] = md5(uniqid(rand(), TRUE)); $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); //echo("<script> window.top.location='" . $dialog_url . "'</script>"); } else { $authenticate_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&client_secret=" . $app_secret . "&code=" . $authorized_code . ""; $response = @file_get_contents($authenticate_url); $params = null; parse_str($response, $params); $access_token = $params['access_token']; $userId = $_POST["user_id"]; echo $userId; if ($like_status) { echo "<form method=\"post\" action=\"start.php\" id=\"landingForm\">"; echo "<input type=\"text\" name=\"user_id\" value=" . $id . " style=\"display: none\">"; echo "<input type=\"text\" name=\"oauth_token\" value=" . $oauth_token . " style=\"display: none\">"; echo "</form>"; echo "<script>document.forms['landingForm'].submit()</script>"; } else { echo "<div class=\"likepage\">"; echo("<b class=\"welcome\"></b><br/>"); echo "</div>"; } } ?> 

застрял в бесконечном цикле:

 if (!empty($_SESSION['access_token'])) { $signed_request = $_REQUEST["signed_request"]; list($encoded_sig, $payload) = explode('.', $signed_request, 2); $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); $id = $data["user_id"]; $authorized_code = $_GET["code"]; $oauth_token = $data["oauth_token"]; $like_status = $data["page"]["liked"]; echo "<br>page id = $id"; echo "<br>page admin = $authorized_code"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; if ($data["page"]["liked"]) { echo "<form method=\"post\" action=\"start.php\" id=\"landhereForm\">"; echo "<input type=\"text\" name=\"user_id\" value=" . $id . " style=\"display: none\">"; echo "<input type=\"text\" name=\"oauth_token\" value=" . $oauth_token . " style=\"display: none\">"; echo "</form>"; echo "<script>document.forms['landhereForm'].submit()</script>"; } else { echo "<div class=\"likepage\">"; echo("<b class=\"welcome\"></b><br/>"); echo "</div>"; } } else if (!empty($_GET["error"])) { echo "user hasn't authorized your app"; }else if (!empty($_GET["code"])) { $authorized_code = $_GET["code"]; $authenticate_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&client_secret=" . $app_secret . "&code=" . $authorized_code . ""; $response = @file_get_contents($authenticate_url); $params = null; parse_str($response, $params); $access_token = $params['access_token']; $_SESSION['access_token'] = $access_token; //header('Location: http://apps.facebook.com/myapp'); header('Location: http://www.facebook.com/mypage/app_***********'); } else { echo "string"; echo "<br>page id = $id"; echo "<br>page admin = $authorized_code"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; $_SESSION['state'] = md5(uniqid(rand(), TRUE)); $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); //echo("<script> window.top.location='" . $dialog_url . "'</script>"); } 

Да, у тебя это плохое.

Вы должны следовать руководству по аутентификации , он описывает все этапы:

  1. Если пользователь не аутентифицирован, вы отправляете его в диалог auth через скрипт js, как вы писали.

  2. Facebook перенаправляет обратно на вашу страницу, а не в iframe, это перенаправление в главном окне.

  3. Если пользователь отклонил приложение, у вас будут «ошибки», «error_reason» и «error_description» в данных GET, помните, что в то время вы не находитесь в facebook.

  4. Если пользователь предоставил ваше приложение, переадресовывается на вашу страницу (в главном окне), вы должны обмениваться кодом с токеном доступа, а затем перенаправлять пользователя в свое приложение fb ( http (s): //apps.facebook .com / YOUR-APP-NAME ).

  5. Когда загрузка в facebook загрузит ваше приложение внутри iframe, вы получите подписанный запрос, и вы можете показать свою холст-страницу.

Вот измененная версия вашего php-кода, некоторые из них псевдо, так как я не очень-то программист php.

 <?php include ('src/facebook.php'); $app_id = "******"; $app_secret = "******"; if (access_token in session) { $signed_request = $_REQUEST["signed_request"]; list($encoded_sig, $payload) = explode('.', $signed_request, 2); $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); $id = $data["user_id"]; $oauth_token = $data["oauth_token"]; $like_status = $data["page"]["liked"]; echo "<br>page id = $id"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; } else if (error in get_data) { // user hasn't authorized your app } else if (code in get_data) { $authorized_code = $_GET["code"]; $authenticate_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&client_secret=" . $app_secret . "&code=" . $authorized_code . ""; $response = @file_get_contents($authenticate_url); $params = null; parse_str($response, $params); $access_token = $params['access_token']; $_SESSION['access_token'] = $access_token; header('Location: http://apps.facebook.com/APP_NAME'); } else { $redirect_uri = "http://myweb.com/myapp/landhere.php"; echo "string"; $_SESSION['state'] = md5(uniqid(rand(), TRUE)); $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } ?> 

Это не проверено или что-то еще, это просто дать вам толчок в правильном направлении. Надеюсь это поможет.


редактировать

Модифицированная версия вашей второй части кода:

 list($encoded_sig, $payload) = explode('.', $_REQUEST["signed_request"], 2); $signed_request = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); $access_token = null; if (!empty($_SESSION['access_token'])) { $access_token = $_SESSION['access_token']; } else if (!empty($signed_request['oauth_token'])) { $access_token = $signed_request['oauth_token']; } if ($access_token != null) { $id = $access_token["user_id"]; $authorized_code = $_GET["code"]; $oauth_token = $access_token["oauth_token"]; $like_status = $access_token["page"]["liked"]; echo "<br>page id = $id"; echo "<br>page admin = $authorized_code"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; if ($data["page"]["liked"]) { echo "<form method=\"post\" action=\"start.php\" id=\"landhereForm\">"; echo "<input type=\"text\" name=\"user_id\" value=" . $id . " style=\"display: none\">"; echo "<input type=\"text\" name=\"oauth_token\" value=" . $access_token . " style=\"display: none\">"; echo "</form>"; echo "<script>document.forms['landhereForm'].submit()</script>"; } else { echo "<div class=\"likepage\">"; echo("<b class=\"welcome\"></b><br/>"); echo "</div>"; } } else if (!empty($_GET["error"])) { echo "user hasn't authorized your app"; }else if (!empty($_GET["code"])) { $authorized_code = $_GET["code"]; $authenticate_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&client_secret=" . $app_secret . "&code=" . $authorized_code . ""; $response = @file_get_contents($authenticate_url); $params = null; parse_str($response, $params); $access_token = $params['access_token']; $_SESSION['access_token'] = $access_token; //header('Location: http://apps.facebook.com/myapp'); header('Location: http://www.facebook.com/mypage/app_***********'); } else { echo "string"; echo "<br>page id = $id"; echo "<br>page admin = $authorized_code"; echo "<br>like status = $like_status"; echo "<br>country = $oauth_token"; $_SESSION['state'] = md5(uniqid(rand(), TRUE)); $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $redirect_uri . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); //echo("<script> window.top.location='" . $dialog_url . "'</script>"); } 

Две вещи:

1) $ redirect_uri должен указывать на ваше приложение facebook, а не на ваш сайт

2) в javascript, вы должны проверить, находится ли «apps.facebook.com» в URL верхнего ранга, если нет, то выполните перенаправление

 if(top.location.href.indexOf("apps.facebook.com") > 0){ top.location.href = YOUR_FACEBOOK_CANVAS_APP_URL; }