Как отобразить диалоговое окно расширенных разрешений в FB с помощью нового Graph API?

#facebook #authentication #oauth

#Facebook #аутентификация #oauth

Вопрос:

Раньше я использовал старый rest api для отображения диалогового окна разрешений в Facebook. Что я могу сделать теперь, с новым graph API? (Я в приложениях IFrame).

Я знаю, что могу обмануть и отобразить разрешение в отдельном окне:

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

вот так .. снова вызовите FB.login (допустим, я хочу, чтобы люди нажимали на другую кнопку и запускали диалоговое окно расширенного разрешения)

Однако это выглядит некрасиво и не похоже на диалоговое окно.

Есть ли способ сгенерировать диалоговое окно? Я пытаюсь выяснить, может ли FB.ui помочь, но информации об этом очень мало.

Кроме того, я не думаю, что обратный вызов ‘response’ когда-либо выполнялся. Ни один из нажатий «Не разрешать» или «разрешить» не вызовет обратного вызова. есть идеи?

приветик .. кто-нибудь может мне помочь?

Ответ №1:

Наконец. найдите решение на другом веб-сайте. Первый. после FB.init( … ); сделайте это:

 FB.provide("UIServer.Methods",
    { 'permissions.request' : { size : {width: 575, height: 300}, 
    url: 'connect/uiserver.php',
    transform : FB.UIServer.genericTransform }
    } );
  

Затем, всякий раз, когда вам нужно вызвать диалоговое окно permssion, делайте это:

 FB.ui({method: "permissions.request", "perms": 'email,offline_access'}, 
    callBack);
  

Мне потребовалось так много времени, чтобы разобраться, посмотрев на объект FB и обнаружив, что там есть UIServer с разрешениями.затем, исходя из этого, я продолжаю поиск и нахожу это решение. и FB.ui ничего не говорит об этом .. и FB.provide не документирован. СПАСИБО facebook.

Комментарии:

1. На момент написания этой статьи FB.provide() FB.ui(), как описано выше, ничего не делают, что неудивительно, поскольку при этом используются преимущества недокументированных функций.

2. Многие функции Facebook недокументированы. Слава богу за ЭТО.

Ответ №2:

Для этого не нужно использовать javascript или какой-либо SDK, хотя это упростило бы задачу. Вам нужно только перенаправить пользователя на URL, подобный этому:

 https://graph.facebook.com/oauth/authorize?
    client_id=...amp;
    redirect_uri=http://www.example.com/callbackamp;
    scope=user_photos,user_videos,publish_stream
  

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

 window.top.location = <login_url> or <a href=<login_url> target="_top">Login</a>
  

Если вы используете PHP SDK или C # SDK, вы могли бы попросить sdk сгенерировать URL для вас, но процесс тот же.

Кроме того, не обязательно, чтобы redirect_uri находился в том же домене, что и URL вашего приложения iFrame. Это приведет к тому, что Facebook перенаправит вашего пользователя за пределы Facebook на ваш веб-сайт, затем вы должны перенаправить пользователя обратно в приложение внутри facebook. Например:

  1. Пользователь нажимает войти
  2. пользователь переходит на страницу входа Facebook
  3. Пользователь нажимает разрешить
  4. Facebook перенаправляет пользователя на http://www.example.com/callback
  5. Ваше приложение перенаправляет пользователя на http://apps.facebook.com/myapp/loggedin

Комментарии:

1. Я знаю о ссылке и php. но мое требование — использовать JS и сделать так, чтобы оно выглядело так же, как диалоговое окно FBML. Спасибо за ответ, хотя. 🙂

2. также перенаправление не работает при использовании Facebook Canvas apps.

Ответ №3:

В одном из ответов предлагается взлом, при котором вы вызываете, FB.provide() а затем FB.ui() открываете диалоговое окно расширенных разрешений. Это решение у меня не работает, но теперь есть документированное решение, которое работает. Просто позвоните FB.login() , чтобы получить необходимые разрешения.

 FB.login(function(response){
    if (response.authResponse) {
        alert('success!');
    } else {
        alert('fail!');
    }
    },{scope: 'email'});
  

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