Я предполагаю, что большинство сообщений о проблемах с $facebook->getUser()
связано с CSRF (межсайтовая подделка запросов) защитой, которая встроена в PHP SDK Facebook и реализована несколько неловко.
Что делает защита CSRF, так это чтобы убедиться, что запрос на получение данных пользователя должен исходить с того же сервера. Это делается путем хранения случайного хэша в сеансе. Если вы вызываете getUser () без установленного значения, getUser () всегда будет возвращать 0.
Таким образом, пользователю необходимо сначала посетить ваш сайт, токен CSRF будет сгенерирован и сохранен в сеансе, и только на после запросов вы можете успешно вызвать getUser ()
Если вы посмотрите на исходный код PHP SDK, то заметите, что способ генерирования этого токена CSRF - это вызов защищенного метода с именем establishCSRFTokenState()
. Вы не можете вызвать этот метод извне, и единственный способ вызвать его - это вызов $facebook->getLoginUrl(...)
Итак, измените источник SDK, чтобы изменить это поведение (или сделайте establishCSRFTokenState()
общедоступным), или просто позвоните getLoginUrl(...)
, когда пользователь впервые заходит на ваш сайт. Убедитесь, что у вас включена поддержка сеанса.
Я думаю, что это не очень хорошо спроектировано и документировано еще хуже. И это не помогает защитить сайт от CSRF-атак в большинстве случаев, если люди не понимают, как правильно его использовать.