Как я могу принудительно перенаправить обратно на вкладку Facebook, если пользователь просматривает вне Facebook? - PullRequest
0 голосов
/ 17 ноября 2011

Что-то не так с моей вкладкой страницы - я получил уведомление на Facebook о том, что кто-то прокомментировал в поле для комментариев на вкладке моей страницы, StackOverflow нажал на ссылку, и меня перенаправили на страницу на моем сайте напрямую:

Вот URL, который привел меня туда:

http://sehabitat.com/Facebook/index.PHP?Facebook_comment_id=Facebookc_10150365133961604_19446706_10150373950271604&ref=notif&notif_t=open_graph_comment#f27DB40044

Как я могу это исправить, StackOverflow, URL которого пользователь нажимает в своем уведомлении Facebook, будет принимать их здесь вместо: http://www.Facebook.com/SEHabitat?sk=app_175821802509443

Ответы [ 4 ]

2 голосов
/ 17 ноября 2011

Если пользователь просматривает страницу напрямую, вы увидите запрос GET.

Если он просматривает вкладку через Facebook, ваша страница будет загружена с POST (некоторые параметры «подписаны»).через Facebook, используя ваше приложение в секрете, но обман перенаправления, вероятно, не является проблемой безопасности, поэтому вам не нужно об этом беспокоиться).

1 голос
/ 17 ноября 2011

Вы можете проверить, откуда пользователь был перенаправлен, и, если он не был перенаправлен, на вкладке facebook (URL, начинающийся со static.facebook, если я правильно помню), вы перенаправите его на страницу. как то так:

  $ref=$_SERVER['HTTP_REFERER'];
  if ($ref != "static.facebook...") {
      Header ('Location: http://www.facebook.com/SEHabitat?sk=app_175821802509443');
  }
0 голосов
/ 19 июня 2012

Я использую сочетание серверных и клиентских сценариев для достижения того, о чем вы просили. Предполагая, что PHP является вашим языком на стороне сервера, в большинстве случаев должно работать что-то вроде ниже:

<?php
$app_id = "<your app id>";
$page_url = "<your page url>";
// if your app requires extended permissions
$app_scope = "user_interests,publish_actions,publish_stream"; //etc.

// depending on your requirement you may use the oauth authentication
// or you may simply redirect to your page url instead
$auth_url = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($page_url)
        . "&scope=" . $app_scope;

// this is passed only when your page is pulled by facebook
if (!isset($_REQUEST["signed_request"])) {
    // we are sure that the page is not accessed within facebook
    // so we may redirect
    header ('Location: ' . $auth_url); // or $page_url
    die();
}

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

// we can check this and redirect later
$user_id = $data["user_id"];

// other details are also avialable
$user = $data["user"];
$algorithm = $data["algorithm"];
$issued_at = $data["issued_at"];
$oauth_token = $data["oauth_token"];
$expires = $data["expires"];

// passed only when the app is loaded inside a page tab
// can be checked for and if empty we can redirect
$app_data = $data["app_data"];

// signed_request algorithm's signature verification
// is omitted here for simplicity sake. you may perform
// that to ensure the authenticity of the request

// other initial setups
?>

Теперь вы можете поместить следующий скрипт внутри тега <head> </head> на своей странице:

<script type="text/javascript">
    <?php if (empty($user_id)): // or as may the need be, you may want to check $app_data instead ?>
        top.location.href="<?php echo $auth_url; // or you may want to use $page_url instead ?>";
</script>
0 голосов
/ 20 ноября 2011

Ответ Даниэля Цыганка - решение на стороне сервера, хорошее и защищенное от взлома.

Однако, если у вас есть люди за прокси, которые убирают поле HTTP referer, менее безопасный способ - использовать JavaScript.

<script type="text/javascript">
    if (self==top)
        location = "//www.facebook.com/SEHabitat?sk=app_175821802509443";
</script>
...