Facebook JS SDK: проверка прав доступа перед входом - PullRequest
4 голосов
/ 29 октября 2010

Я хочу проверить разрешения вошедшего в систему пользователя, прежде чем представлять логин iframe для запроса расширенных разрешений, но всплывающее окно iframe блокируется браузером (ff, chrome проверено). Я хочу избежать этого, и я уверен, что это потому, что результаты функций js «вложены» - мой ум js ограничен, поэтому извините.

Я предполагаю, что если я смогу сохранить все в исходной функции, не передавая результаты, браузеры все равно увидят iframe для входа в систему как "инициированный пользователем", а не как блок.

Но я не могу этого сделать - например, почему следующий результат в data = undefined.

var data = FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 });
alert(data); // = undefined

Мой полный текущий код:

<button id="myButton" >Test Publish Event</button>

<script>

$('#myButton').bind('click', function() {

FB.getLoginStatus(function(response) {

if (response.session) {
// logged in and connected user, someone you know

FB.api(
  {
    method: 'fql.query',
    query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
  },
  function(response) {
        if(response[0].create_event == 1) {
                alert('permission granted');
        } else {
            alert('permission absent');

    FB.login(  function(response) {if (response.session) {
        handleSessionResponse(response);
        if (response.perms) {
          // user is logged in and granted some permissions.
          // perms is a comma separated list of granted permissions
          alert(response.perms);
            } else {
          // user is logged in, but did not grant any permissions       
        }
      } else {
        // user is not logged in
      }
    }, {perms:'create_event,rsvp_event'});

    }
  }
);
</script>

Ответы [ 2 ]

8 голосов
/ 23 сентября 2011

ДЕНЬ!Та же самая проблема проблемы (ну, не та же проблема, но та же желаемая функциональность) очень беспокоила меня, но, наконец, после ЧАСОВ по различным источникам я нашел решение !!

1st

var data = FB.api(

это неправильно!Поскольку все запросы fb выполняются асинхронно, и единственный способ получить значения данных находится внутри этого запроса после его выполнения.ex

FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 },function(response){
This function will run after the request is finished and ONLY inside here you can read the results data
ex  alert(response.data);
});         
  }
});

2nd Ваше всплывающее окно запроса на разрешение заблокировано chrome по соображениям безопасности (firefox позволяет другим браузерам запрашивать разрешение или нет)

"Можно разрешить только одно всплывающее окноесли она открыта из события пользовательского действия, такого как .onclick "Таким образом, вы можете прикрепить функцию к событию .onclick, которое будет разрешено.

3-е Мое решение для проверки, имеет ли пользователь необходимые разрешения для использования вашегоПриложение:

 FB.getLoginStatus(function(response) {
 if (response.status.toString().indexOf("connected")>-1) {
    initAll();
  } else {

requestPermisions proceedure
 }

Эта функция проверяет, подключен ли пользователь и предоставил ли он разрешения вашему приложению другим способом. response.status = "unknown" возвращается.

Сейчас ....

Проблема с блокировкой всплывающих окон имеет два решения.

1-е решение = присоединить функцию FB.login () к событию onclick кнопки. Пример.

     ifUserNotgrandedPermisions{document.getElementByid("aLogInButton").onclick = function(){
 FB.login(....blah blah blah);
 };

2-е решение, которое я реализовал, - это перенаправление iFrame на страницу разрешения запроса, а не всплывающее окно

Ниже приведено полное решение, которое проверяет, вошел ли пользователь в систему и получил ли он разрешения ...если нет, то просит пользователяВойдите в систему, а затем запросите разрешения (если вы вошли в систему, просто спросите perms) (если она есть, просто войдите в систему)

    FB.init({appId: 'YourAPPID', status: true, cookie: true, xfbml: true, oauth : true});
    FB.getLoginStatus(function(response) {
   if (response.status.toString().indexOf("connected")>-1) {
     initAll(); //User is connected and granted perms Good to go!
   } else { 

// top.location изменяет URL браузера, а НЕ URL iframe

// Этот URL-адрес специально сформирован для запроса разрешения для вашего приложения.Вы изменяете разрешения и свой appID

// redirect_uri = Измените это на страницу холста вашего приложения

          top.location=window.location="http://www.facebook.com/dialog/oauth/?scope=read_stream,publish_stream,friends_photos,friends_activities&client_id="yourAPPID(nobrackets)"&redirect_uri=http://apps.facebook.com/filtered_feed/&response_type=code";}});};
1 голос
/ 06 января 2012
FB.init({
   appId: 'YOUR APP ID', 
   status: true, 
   cookie: true,
   xfbml: true,
   oauth : true
});
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    /*var uid = response.authResponse.userID; //FACEBOOK_ID
    var accessToken = response.authResponse.accessToken;*/ //ACCESS TOKEN
    FB.Canvas.setAutoResize();
    if (response.authResponse) {
        // logged in and connected user, someone you know. 
        //  YOUR SUCCESS CODE HERE
    }
  }else {
      attemptLogin();
  }
 });

Функция открытия всплывающего окна для входа в Facebook и авторизации.

function attemptLogin(){
   FB.login(function(response) {
      if (response.authResponse) {
          login();
        } else {
          //if user didn't logged in or didn't authorize your application
      }
  }, {scope: 'offline_access,publish_stream,manage_pages'}); //YOUR PERMISSION
}
...