$ Facebook-> GetUser (); Все еще возвращаясь 0 - PullRequest
2 голосов
/ 16 ноября 2011

Я вижу, что здесь много спрашивали, но мне еще предстоит найти решение. Мне нужно получить идентификатор пользователя, чтобы определить, заполнили ли они уже форму в моем приложении. Вот мой код ..

require_once('facebook.php');  
$facebook = new Facebook(array(  
'appId'  => 'xxxxxxxxxx',  
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',  
'cookie' => false,  
)); 

$signed_request = $facebook->getSignedRequest();
$page_id = "fb" . $signed_request['page']['id'];
$user_id = $facebook->getUser(); 

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

Кто-нибудь знает, в чем здесь проблема?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Я предполагаю, что большинство сообщений о проблемах с $facebook->getUser() связано с CSRF (межсайтовая подделка запросов) защитой, которая встроена в PHP SDK Facebook и реализована несколько неловко.

Что делает защита CSRF, так это чтобы убедиться, что запрос на получение данных пользователя должен исходить с того же сервера. Это делается путем хранения случайного хэша в сеансе. Если вы вызываете getUser () без установленного значения, getUser () всегда будет возвращать 0.

Таким образом, пользователю необходимо сначала посетить ваш сайт, токен CSRF будет сгенерирован и сохранен в сеансе, и только на после запросов вы можете успешно вызвать getUser ()

Если вы посмотрите на исходный код PHP SDK, то заметите, что способ генерирования этого токена CSRF - это вызов защищенного метода с именем establishCSRFTokenState(). Вы не можете вызвать этот метод извне, и единственный способ вызвать его - это вызов $facebook->getLoginUrl(...)

Итак, измените источник SDK, чтобы изменить это поведение (или сделайте establishCSRFTokenState() общедоступным), или просто позвоните getLoginUrl(...), когда пользователь впервые заходит на ваш сайт. Убедитесь, что у вас включена поддержка сеанса.

Я думаю, что это не очень хорошо спроектировано и документировано еще хуже. И это не помогает защитить сайт от CSRF-атак в большинстве случаев, если люди не понимают, как правильно его использовать.

0 голосов
/ 16 ноября 2011

У меня тоже есть эта проблема, единственное решение было использовать oauth раньше с запросом разрешения "User_about_me". Поскольку FB использует oauth 2.0, большинство пользовательских значений скрыты, и вы должны запросить все это ш * т: (

...