$ 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-атак в большинстве случаев, если люди не понимают, как правильно его использовать.