Диалоговое окно аутентификации Facebook не отображается на вкладке страницы

Диалоговое окно аутентификации Facebook не будет отображаться при просмотре приложения на вкладке страницы (iframe). Однако он отлично работает при просмотре внешнего приложения.

Настройки моего приложения Facebook:

Site URL: http://domain.com/test
Canvas URL: http://domain.com/test/
Secure Canvas URL: https://domain.com/test/
Page Tab URL: http://domain.com/test/
Secure Page Tab URL: https://domain.com/test/

Я добавил приложение на вкладку страницы по ссылке: https://www.facebook.com/dialog/pagetab?app_id=[MY_APP_ID]&next=https://domain.com/test/

Я использую php SDK. И мой код в //domain.com/test/index.php выглядит так:

<?php
require 'facebook-php-sdk/src/facebook.php';

$facebook = new Facebook(array(
   'appId'  => '[MY_APP_ID]',
   'secret' => '[MY_APP_SECRET]',
   ));

// Get User ID
$user = $facebook->getUser();

if ($user) {
   $logoutUrl = $facebook->getLogoutUrl();
} else {
   $loginUrl = $facebook->getLoginUrl();
}

if ($user) {
   try {
      // Proceed knowing you have a logged in user who's authenticated.
      $user_profile = $facebook->api('/me');
   } catch (FacebookApiException $e) {
   error_log($e);
   $user = null;
   }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Facebook test</title>
</head>

<body>
<p>
<?php if($user) : ?>
   <a href="<?php echo $logoutUrl;?>">Logout</a>
<?php else: ?>
   <a href="<?php echo $loginUrl;?>">Login</a>
<?php endif; ?>
</p>
</body>
</html>

Буду благодарен за любую помощь!!


person dannepanne    schedule 31.05.2012    source источник


Ответы (2)


Вы не можете использовать диалоговое окно авторизации в iframe (почему? см. здесь: http://facebook.stackoverflow.com/a/10831018/1427878). Добавьте target="_blank" к своим ссылкам, и все должно работать. Или просто вставьте JavaScript SDK и используйте FB.login, если вам нужно всплывающее окно без дополнительных затрат.

person CBroe    schedule 31.05.2012
comment
Большое спасибо за ваше решение! Прекрасный! - person dannepanne; 31.05.2012
comment
К сожалению, не работает в Firefox. Появится диалоговое окно авторизации, но добавление _blank не приведет к надлежащей перезагрузке страницы в Firefox. Я также пытался использовать JS SDK, но перезагрузка страницы с помощью window.location.reload() после авторизации дает мне сообщение. Чтобы отобразить эту страницу, Firefox должен отправить информацию, которая будет повторять любое действие... - сообщение и не будет правильной перезагрузки. - person dannepanne; 01.06.2012
comment
Facebook вызывает ваше приложение через POST при загрузке его в iframe, поэтому сообщение нормальное. Вам приходится перезагружать страницу, когда пользователь авторизует ваше приложение? Если это так, то, возможно, просто добавьте фактическую метку времени (объект JS Date) в location.href, что сделает его «новым» ресурсом для вашего браузера. - person CBroe; 01.06.2012
comment
У меня получилось что-то вроде этого: <?php $server = $_SERVER["SERVER_NAME"]; $uri = $_SERVER["REQUEST_URI"]; ?> window.location.href = '//<?php echo $server . $uri ?>';Некрасиво, но работает. Можете ли вы дать мне пример кода с вашей временной меткой? - person dannepanne; 04.06.2012

Попробуйте создать функцию JS, которая изменяет родительский URL-адрес iframe.

function RedirectTo(installURL){
     window.top.location.href = installURL;
}

и вызовите эту функцию в событии onClick текста входа

<?php else: ?>
   <a href="#" onclick='RedirectTo("<?php echo $loginUrl;?>")'>Login</a>
<?php endif; ?>

Убедитесь, что RedirectURI переменной $loginUrl является URL-адресом вашего приложения.

Затем вам нужно будет изменить эти настройки в своем приложении facebook (https://developers.facebook.com/apps).

Домены приложений: facebook.com

Веб-сайт с входом через Facebook: URL-адрес вашего приложения Facebook (например: https://www.facebook.com/{FanPageUsername}?sk=app_{appID})

person miguelglz    schedule 03.06.2012
comment
Спасибо, тоже интересное решение. Я попробую. - person dannepanne; 04.06.2012