Nano Hash - криптовалюты, майнинг, программирование

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

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

  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>");
}

  • Никогда не показывайте секрет вашего приложения таким образом, если только он не настоящий, и в этом случае я беру его обратно. 19.03.2012

Ответы:


1

Да, ты сильно ошибся.

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

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

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

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

  4. Если пользователь предоставил ваше приложение, он будет перенаправлен на вашу страницу (в главном окне), вам следует заменить код активным токеном доступа, а затем перенаправить пользователя в ваше приложение fb (http(s):// apps.facebook.com/ИМЯ ВАШЕГО ПРИЛОЖЕНИЯ).

  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>");
    }
?>

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


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

Модифицированная версия вашего 2-го фрагмента кода:

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>");
}
18.03.2012
  • спасибо за такой подробный ответ, очень помог, я обновил свой код выше в моем вопросе в соответствии с вашими предложениями, но теперь код застрял в бесконечном цикле, вероятно, он работает echo("<script> top.location.href='" . $dialog_url . "'</script>");'again и снова .. что мне делать теперь? Пожалуйста, помогите. 19.03.2012
  • Я считаю, что это потому, что вы уже авторизовали свое приложение и получаете подписанный запрос, не анализируйте его (поскольку вы никогда не устанавливали токен доступа в сеансе) и переходите прямо к перенаправлению js. Редактирование в моем ответе должно преодолеть это, оно проверяет, имеет ли подписанный запрос токен доступа или сеанс. 19.03.2012

  • 2

    Две вещи:

    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;
    }
    
    19.03.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..