FB.login с API PHP

Я создал страницу Canvas, которая является FB.login при нажатии кнопки отправки формы. Во время следующего запроса он пытается получить доступ к данным пользователей через $ facebook-> api ('/ me') (последняя версия API от Github). Он работает в Firefox и Chrome, но не в Safari и IE, где API терпит неудачу с «требуемым токеном аутентификации». У кого-то уже была эта проблема или у нее возникла идея, что может вызвать ее?

BR Philipp

редактировать:

Я вызываю FB.login внутри события click формы формы отправки:

$('.form-submit', this).click(function() { FB.getLoginStatus(function(response) { if (response.session) { form.submit(); } else { FB.login(function(response) { if(response.session && (permissions == '' || response.perms)) { form.submit(); } else { } },{perms:permissions}); } }); return false; }); 

На стороне сервера просто создайте объект php-api и попытайтесь получить пользовательские данные:

 $facebook = new Facebook(array( 'appId' => $appid, 'secret' => $appsecret, 'cookie' => TRUE, )); if ($facebook) { try { $me = $api->api('/me'); } catch (Exception $exc) { // Failure in Safari and IE due to invalid auth token } } 

Сигнал signed_request передается внутри скрытого элемента формы.

У меня было много проблем с файлом входа в JS FB. Я рекомендую использовать более простой переадресации с помощью oauth и функции getLoginUrl из php fb api.

Таким образом, в основном вы делаете это с PHP, вы проверяете, есть ли у вас сеанс, если вы не используете getLoginUrl и перенаправляетесь на эту страницу, ваше использование будет перенаправлено на ваше приложение / сайт с действительным сеансом (если он примет).

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

У меня была та же проблема, и я включил решение ниже.

Я считаю, что причина этого в том, что при попытке входа в Javascript ваш сервер никогда не получает токенов доступа. Javascript передает только данные между вашим браузером и Facebook.com, поэтому ваш сервер не знает, что такое статус аутентификации. Если страница обновляется, ваш сервер будет получать новые токены доступа; это то, где facebook передает токены доступа.

Это мое решение. После успешного входа в систему через FB.login вы получите объект ответа, а внутри него будет access_token. Все, что вам нужно сделать, это передать этот токен доступа в ваш скрипт каким-то образом. Вот пример:

 // Hold the access token var js_access_token = ""; // Connect to facebook FB.login(function(response) { if (response.session) { if (response.perms) { // user is logged in and granted some permissions. // Save the access token js_access_token = response.session.access_token; // Do stuff on login } } }); 

Затем вы включаете токен доступа вместе с любыми запросами. Я выбрал пример ajax.

 // Communication back to server. $.ajax({ url: 'myurl.php', data: { js_access_token: js_access_token // Including the js_access_token }, success: function(data) { console.log(data); } }); 

Внутри вашего PHP вы должны иметь что-то похожее на это:

 $facebook = new Facebook(array( 'appId' => $appid, 'secret' => $appsecret, 'cookie' => TRUE, )); if ($facebook) { // If we get the access token from javascript use it instead if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) { $facebook->setAccessToken($_REQUEST['js_access_token']); } try { $me = $api->api('/me'); } catch (Exception $exc) { // Failure in Safari and IE due to invalid auth token } } 

Надеюсь это поможет

Мне понравился ответ Конора, поскольку я должен был передать токен доступа с клиентской стороны на сервер, поскольку он не работал в Safari (проблемы с файлами cookie, которые я предполагаю). Но это старый вопрос, поэтому некоторые вещи должны были измениться. Теперь вары разные, и, как отметил Олиланд, мы не должны посылать токены доступа в качестве параметров GET.

Во всяком случае, вот что я получил, если это кому-то помогает

 <a id="start-button" href="#">Start</a> <form id="entry-form" action="nextpageurl" method="post"> <input type="hidden" name="access_token" /> </form> <script> $(document).ready(function() { $('#start-button').click(function(e) { e.preventDefault(); FB.login(function (response) { if (response.authResponse) { $('#entry-form input').val(response.authResponse.accessToken); $('#entry-form').submit(); } else { alert('Permissions required'); } }, {}); }); }); </script> 

а затем в PHP, почти так же, как и ответ Конора, но получая маркер из $ _POST var.