$ Facebook-> GetUser(); Все еще возвращаясь 0

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

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 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам