У меня был этот код, и он работал отлично в течение нескольких месяцев. Внезапно перестала работать производственная среда, где $helper->getSessionFromRedirect()
теперь всегда возвращает NULL
значение.
страница формы входа (Index.php)
require 'vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
FacebookSession::setDefaultApplication(123456, 'a1b2c3d4e5');
$helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');
$scope = array('email');
$loginUrl = $helper->getLoginUrl($scope);
echo '<a href="'.$loginUrl.'">Login</a>';
обработка логина (Login.php)
require 'vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
FacebookSession::setDefaultApplication(123456,'a1b2c3d4e5');
$helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');
try {
# success
$session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
# when Facebook returns an error
} catch(\Exception $ex) {
# when validation fails or other local issues
}
if($session) {
# do something with user data
$me = (new FacebookRequest($session, 'GET', '/me'))->execute()->getGraphObject(GraphUser::className());
# redirect to user profile page
header('Location: http://domain.com/profile.php');
exit();
} else {
# $session is always NULL with this code :(
}
это является работает над моим тестовым приложением, но это не работает с моим производственным идентификатором приложения. Разница между ними, конечно же, заключается в значениях идентификатора приложения и секретного идентификатора. Я уже убедился, что я следую Инструкции в фейсбуке. Также я пользуюсь Facebook PHP SDK 4Последняя версия
После долгого диагноза я обнаружил, что было расхождение. Так как я использовал функцию SSL Cloudflare, оригинал $helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');
запрос был сделан с http: 80, но 2-й $helper = new FacebookRedirectLoginHelper('http://domain.com/login.php');
был сделан с https: 443 … это возвращает тип подписи не совпадающий с Facebook, что приводит к значению NULL в $session
переменная.
TL; DR не смешивайте http и https при отправке запросов на fb.
Других решений пока нет …