2012-04-18 3 views
0

Искал вокруг Google и StackOverflow, все имеют практически одинаковые советы, чтобы сделать:FB.login порождает новое окно и не может получить доступ токенов

FB.login(function(response) { 
    if (response.authResponse) { 
     var accessToken = response.authResponse.accessToken; 
    } 
}); 

У меня есть «доля» кнопку на странице, и когда щелкните Я просто хочу сделать сообщение в профиле пользователя и собираюсь использовать вызов https://graph.facebook.com/me/feed, чтобы сделать это. Для того, чтобы быть в состоянии сделать это, мне нужно access_token от Facebook, так что я сделал:

(после вызова FB.init(), а также добавление all.js)

FB.login(function (response) { 
    console.log('response.authResponse: ' + response.authResponse); 
    if (response.authResponse) { 
       var access_token = FB.getAuthResponse()['accessToken']; 
       console.log('Access Token = ' + access_token); 
       FB.api('/me', function (response) { 
        console.log('Good to see you, ' + response.name + '.'); 
       }); 
    } else { 
       console.log('User cancelled login or did not fully authorize.'); 
    } 
    }, { scope: 'user_about_me' }); 

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

Но происходит то, что он открывает новое окно браузера в facebook с диалогом входа в систему, после входа пользователя в систему страница переходит на страницу новостей пользователя, и мой обратный вызов выше никогда не вызывается. Таким образом, в основном управление уходит и переносится в новое окно браузера как обычный просмотр в facebook для пользователя. Однако, когда я закрываю это новое окно, он запускает «User cancel login» в моем протоколе.

Что мне здесь не хватает? Все ресурсы просто предлагают вызвать FB.login, и это то, что я уже делаю, но я не могу получить токен доступа для пользователя.

Заранее благодарен!

EDIT: Полный код и больше комментариев

<script type="text/javascript" language="javascript"> 
    window.fbAsyncInit = function() 
    { 
     FB.init(
     { 
      appId: '<%= this.ApplicationId %>', // App ID 
      channelURL: '<%= this.ChannelFileUrl %>', // Channel File 
      status: true, // check login status 
      cookie: true, // enable cookies to allow the server to access the session 
      oauth: true, // enable OAuth 2.0 
      xfbml: true // parse XFBML 
     }); 

     // Additional initialization code here 
    }; 

    // Load the SDK Asynchronously 
    (function (d) 
    { 
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; } 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/<%= this.LocaleCode %>/all.js"; 
     d.getElementsByTagName('head')[0].appendChild(js); 
    } (document)); 
</script> 

, а затем в некоторых JS-файл, вызывающий эту функцию (параметры не используются, потому что еще не на самом деле сделать пост)

function postToFacebook(name, caption, description, link, picture, id) { 

var accessToken = ""; 

console.log('fb event subscribe'); 
FB.Event.subscribe('auth.login', function() { 
    console.log('facebook event auth.login'); 
}); 

console.log('fb login'); 

FB.login(function (response) { 
     console.log('response.authResponse: ' + response.authResponse); 
     if (response.authResponse) { 
      var access_token = FB.getAuthResponse()['accessToken']; 
      console.log('Access Token = ' + access_token); 
     } else { 
      console.log('User cancelled login or did not fully authorize.'); 
     } 
}, {}); 

}

и последовательность того, что произойдет это:

  1. распечатаны «событие фб подписаться»
  2. распечатаны «фб Войти»
  3. код попадает FB.login -> открывает новое окно браузера на Facebook, после того, как пользователь Логин фокус остается в этом новом окне, он никогда не идет в функцию обратного вызова в FB.login
  4. Если я закрою окно, порожденное на шаге 3 выше, тогда вызывается функция обратного вызова и «Пользователь отменен логин или не полностью авторизуется». печатается («response.authResponse:» дает нуль)

Шаг 1 и 2, как ожидается, шаг 3 является проблемой, а также окно, которое откроется имеет URL https://www.facebook.com/home.php?_rdr

ответ

0

В документации к FB.login метод он ясно говорит:

Вызов результатов FB.login в JS SDK, пытавшихся открыть всплывающее окно . Таким образом, этот метод следует вызывать только после того, как пользователь нажмет событие, иначе всплывающее окно будет заблокировано большинством браузеров.

Если вы хотите придерживаться потока на стороне клиента, то опции, доступные для этого, упоминаются в этом уроке: Client-Side Authentication.

tsOverflow редактировать: на основе обсуждения чата с Nitzan Томер, выяснили вопрос с моей работой над:

  1. AppId, который был использован зарегистрирован на Facebook, чтобы другой URL сайта, так даже при тестировании на местном уровне, необходимо убедиться, что AppId имеет тот же домен URL
  2. channel.html отсутствовало
+0

Я следовал примеры по этой ссылке, а также - но они также используют FB. login() - так что все равно откроется новая страница. Единственный способ напрямую ударить uraut-url и не использовать js SDK? Когда я пытаюсь ударить по URL-адресу oauth, я получаю сообщение «Ошибка произошел, пожалуйста, попробуйте еще раз позже», не объяснив, что пошло не так. –

+0

Что именно вы подразумеваете под «прямым ударом uraut-url»? Кроме того, вы используете устаревшую кнопку «share»? –

+0

не используя кнопку совместного доступа из виджета fb, я ударил oauth, как при создании запроса GET или запроса JSONP на https://www.facebook.com/dialog/oauth? –

 Смежные вопросы

  • Нет связанных вопросов^_^