2010-02-18 3 views
1

У меня есть Facebook app, который построен как iFrame. Я использую клиент JavaScript API загружается с помощью:Facebook API: FB.Connect.requireSession issues

В моем коде инициализации, я использую метод requireLogin для того, чтобы пользователь разрешил приложение. Я нашел это необходимым, чтобы иметь возможность собирать имя пользователя, аватар и т. Д. Для табло. Вот представитель фрагмент кода:

FB_RequireFeatures(["Connect","Api"], function() { 

    FB.Facebook.init("...API_KEY_HERE...", "xd_receiver.htm"); 

    var api = FB.Facebook.apiClient; 
    api.requireLogin(function() { 
     api.users_getInfo(
      FB.Connect.get_loggedInUser(), 
      ["name", "pic_square", "profile_url"], 
      function(users, ex) { 
       /* use the data here */ 
      }); 
    }); 
}); 

Это приводит к тому, IFRAME перенаправлять в результате чего экран авторизации Facebook, чтобы загрузить в плавающем фрейме моего приложения. Это выглядит неуклюжим и несколько запутанным для пользователя, например. есть два бара Facebook и т. д.

Вопрос 1: Есть ли что-нибудь, что я могу сделать, чтобы очистить это, сохраняя при этом как iFrame, и все еще используя JavaScript API?

Согласно FB API documentation:

FB.ApiClient.requireLogin

Этот метод не рекомендуется - использовать FB.Connect.requireSession вместо этого.

Мой опыт, хотя при замене api.requireLogin с помощью FB.Connect.requireSession он никогда не вызывается. Я предпочел бы рекомендованный способ сделать это, но я боролся и не смог найти способ заставить его работать. Я попытался добавить различные аргументы для других двух параметров, а также, казалось бы, никакого эффекта. Я ожидаю, что этот метод будет загружаться в диалоговом окне внутри моего приложения iFrame с аналогичным сообщением авторизации.

Вопрос 2: Что мне недостает с получением FB.Connect.requireSession, чтобы запросить у пользователя разрешение?

Наконец, в конце игры приложение запрашивает у пользователя возможность опубликовать свой счет в своем потоке через FB.Connect.streamPublish. Что приводит меня к ...

Вопрос 3: Я загружаю правильные функции? Нужны ли мне как «Api», так и «Connect»? Я не хватает других?

+0

** ПРИМЕЧАНИЕ: ** присужденный ответ был тем, который подтолкнул меня в правильном направлении, но мой собственный ответ ниже содержит фрагмент кода, который является решением. – mckamey

ответ

0

Я думаю, что FB.requireSession работает только с FB Connect сайта вне Facebook. Если вы используете приложение, размещенное на apps.facebook.com, используйте вместо этого php api ,

$ facebook = new Facebook ($ appapikey, $ appsecret); $ facebook-> require_login();

или ссылку на страницу входа.

Из этих методов для входа

* Using the PHP client library 
* Directing users to login.php 
* Including the requirelogin attribute in a link or form 
* Using FBML 

только первые 2 доступны для IFrame приложений, размещенных на apps.facebook.com

Я думаю requirelogin и FBML работать только с FBML холст приложений.

см http://wiki.developers.facebook.com/index.php/Authorization_and_Authentication_for_Canvas_Page_Applications_on_Facebook

+0

Я не разрабатываю в PHP, поэтому их клиентская библиотека не приносит мне никакой пользы. Совет по перенаправлению на страницу входа в систему в конечном итоге решил мою проблему. Для других, читающих это, XFBML и API-вызовы отлично работают в приложениях iFrame. – mckamey

0

Вопрос 1: есть все, что я могу сделать, чтобы очистить это все еще реализации как плавающий фрейм, и до сих пор с помощью JavaScript API,?

Вопрос 2: что я упускаю с получать FB.Connect.requireSession к правильно запрашивать у пользователя авторизации?

Please have a look at this. В данной статье рассматривается правильное использование require session и ссылки о том, как осуществить это.И да, вы правы, requireLogin устарел и больше не поможет.

Вопрос 3: Я загружаю правильные функции ? Нужны ли мне как «Api», так и «Connect»? Я не хватает других?

Насколько я знаю, вы можете использовать API и Connect вместе, в основном вы получаете доступ к api facebook с помощью javascript.

Однако, для приложений iframe нет большой поддержки и минимальной поддержки API с некоторыми доступными функциональными возможностями. See this for more info..

Это приводит к тому, IFRAME перенаправлять вызывая экран Facebook авторизации загрузить в плавающем фрейме моего приложения. Это выглядит сумасшедшим и несколько запутывает пользователя, например. Есть два Facebook бары и т.д.

Наконец, и лично я не видел ни одного IFrame приложение, требующий пользователя, чтобы добавить приложение в первую очередь. Это будет создать проблему двух баров, о которых вы упомянули выше.

Ссылка, которую я опубликовал в начале моего ответа, содержит несколько полезных ссылок, чтобы начать работу и решить следующие шаги или, возможно, внести изменения в свои приложения.

Спасибо и надеюсь, что помогает :)

+0

Я пробовал использовать авторизацию FBConnect, но это был странный опыт всплывающих окон и кнопок FBConnect. Этот стиль аутентификации/авторизации работает намного лучше на полностью внешнем сайте. Для iFrames решение в конечном итоге было перенаправлено на URL-адрес входа, который становится URL-адресом авторизации, если они еще не вошли в систему. – mckamey

2

Вот краткое изложение изменений мне нужно сделать, чтобы очистить процесс авторизации. Похоже, что iFrames необходимо полностью перенаправить для правильного авторизации. Я попытался использовать авторизацию FBConnect, но это был странный опыт всплывающих окон и кнопок FBConnect.

В конечном счете эта игрой меня ожидаемый опыт, который я видел с другими приложениями FB:

FB_RequireFeatures(["Connect","Api"], function() { 
    var apiKey = "...", 
     canvasUrl = "http://apps.facebook.com/..."; 

    function authRedirect() { 
     // need to break out of iFrame 
     window.top.location.href = "http://www.facebook.com/login.php?v=1.0&api_key="+encodeURIComponent(apiKey)+"&next="+encodeURIComponent(canvasUrl)+"&canvas="; 
    } 

    FB.Facebook.init(apiKey, "xd_receiver.htm"); 

    FB.ensureInit(function() { 
     FB.Connect.ifUserConnected(
      function() { 
       var uid = FB.Connect.get_loggedInUser(); 
       if (!uid) { 
        authRedirect(); 
        return; 
       } 

       FB.Facebook.apiClient.users_getInfo(
        uid, 
        ["name", "pic_square", "profile_url"], 
        function(users, ex) { 
         /* user the data here */ 
        }); 
      }, 
      authRedirect); 
}); 

Для плавающих фреймов, решение было в конечном счете, для перенаправления на странице входа, который станет URL авторизации, если они не являются уже вошел в систему.

+0

+1 Ваше модифицированное решение было использовано в http://stackoverflow.com/questions/3457620/facebook-login-and-iframe-redirection. –