Я использую PHP SDK версии 3.1.1, чтобы сделать простой вызов Graph API. Я запускаю его локально по адресу http: //local.fb-sandbox . В настройках приложения facebook указан URL-адрес сайта : http: //local.fb-sandbox/ .
Я перенаправлен на страницу входа в facebook, а затем на страницу с запросом моего разрешения, когда я перехожу к http: //local.fb-sandbox, но приложение затем переходит в цикл переадресации между URL-адресом, например:
http://local.fb-sandbox/?state=e9c091bb61afe08139af4e3b153a1e9e&code=AQBDJ4yMWVOIrukx6nRkxhNbnPH9nX6OvuqOWhVJEAgLkq6Lz27iq_-B6AIAGQ_cOpBIZktCPLLs_G5Hpt8QO5PRhDUN8l-Yu3JuT0YTzwVQiAqBlgutgia60lRT-ZzE3IHguStHq4gtuPQYJh423TBer-mB8BsqERvNsoF1L4NNe90WAWU8--MFAU3Oc4eeXyI#_=_
а также
https://www.facebook.com/dialog/oauth?client_id=375741229103324&redirect_uri=http%3A%2F%2Flocal.fb-sandbox%2F%3Fstate%3Dccd13778febb68d3eb1f4763a99b2ace%26code%3DAQBFegtkch4m34-2F9KMKgScrPhWzI0qeKJlvnM6uAD81BYm2xakv0S7DEbUrNwlECrgth5-YHdT8IR_vCBzW29QMh3ecOiiEk7P03wQG2V2gaxAUsMqOOZvTl_Oq3SefiLn9BvBAPQSGXQdRSZBVdsUqDT1aZ430Lcx8Ic6axaHSyHwlkkNK5EjRhYdkjYYz0YmENk64kRf4tvmX4WrH6f4&state=19a3862962dd0422628eb7c28a832380&scope=email%2Cread_stream%2Cpublish_stream%2Cuser_photos%2Cuser_videos&fbconnect=1#_=_
У меня есть вызов session_start () в верхней части моего скрипта и попробовал как с, так и без него. PHP cookie настроен отлично.
Я видел много подобных вопросов здесь относительно этого цикла перенаправления, но ни один из предложенных ответов не разрешил его, и они все довольно старые. Должно ли это работать на localhost? AM Я пропустил настройку приложения в настройках приложения на Facebook?
ОБНОВИТЬ
Поэтому кажется, что если вы используете код здесь: http://developers.facebook.com/docs/authentication/, то он работает. Пример php-sdk в github полностью игнорирует это и не включает в себя тот факт, что вам нужно проверить, установлен ли «код» и сгенерировать собственный токен CSRF. Затем вам нужно сделать вызов, чтобы захватить токен доступа, прежде чем сможете позвонить в Graph API.
Кроме того, метод getLoginURL () SDK возвращает URL-адрес https: //, который, похоже, не работает. Если я создаю свой собственный URL-адрес, тогда он будет работать.
РАБОЧИЙ КОД:
if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); $login_url_params = array( 'scope' => 'email,read_stream,publish_stream,user_photos,user_videos', 'fbconnect' => 1, 'redirect_uri' => 'http://local.fb-sandbox/', 'state'=>$_SESSION['state'] ); //using this array via the sdk does not work $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state']; //this url works //var_dump($dialog_url);echo "<br />"; $login_url = $facebook->getLoginUrl(); //var_dump($login_url); header("Location:{$dialog_url}");//works //header("Location:{$login_url}");//does not work exit; } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $aContext = array( 'http' => array( 'proxy' => 'tcp://xxxx0:80', 'request_fulluri' => true, ), ); $cxContext = stream_context_create($aContext); $response = file_get_contents($token_url, FALSE, $cxContext); $params = null; parse_str($response, $params); $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; $user = json_decode(file_get_contents($graph_url, FALSE, $cxContext)); //var_dump($user);exit; } //var_dump($user);exit; return $app->render('test.html',array('myvar', $user)); exit();
Обратите внимание, что я прохожу через прокси, поэтому нужно установить контекст для вызовов file_get_contents ().
Если кто-то может конвертировать мой код, чтобы использовать надлежащие методы SDK и заставить его работать (имея в виду, что мне нужно, чтобы он работал за прокси-сервером), вы получите щедрость.
Многие из различных серверных SDK на стороне сервера не обрабатывают аутентификацию в соответствии с документацией и рекомендациями, которыми Facebook делился в течение последних 3 или 4 месяцев. Вы нашли один хороший пример этого в том, как PHP SDK использует (или не использует) параметр кода. Существуют и другие примеры таких SDK, непосредственно читающих куки-файлы Facebook, что-то, что инженеры-разработчики Google рассказывают разработчикам, которых они не должны делать, поскольку куки-файлы – это всего лишь «деталь реализации», а не разработчики вне Facebook должны создавать зависимости.
Я не уверен, где вы получили этот код в примере вашего рабочего кода, но я не мог найти поддержки для включения таких параметров, как fbconnect=1
Поэтому, учитывая, что SDK не выполняет аутентификацию в соответствии с рекомендациями и документацией Facebook, и что Facebook предоставил полную версию PHP в своей документации, я рекомендую вам просто использовать версию Facebook, скопировать и вставить здесь для справки с этой страницы http : //developers.facebook.com/docs/authentication/ :
<?php $app_id = "YOUR_APP_ID"; $app_secret = "YOUR_APP_SECRET"; $my_url = "YOUR_URL"; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = @file_get_contents($token_url); $params = null; parse_str($response, $params); $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; $user = json_decode(file_get_contents($graph_url)); echo("Hello " . $user->name); } else { echo("The state does not match. You may be a victim of CSRF."); } ?>
С этим связано несколько проблем.
Ваш redirect_uri должен выглядеть как http: //local.fb-sandbox/ . В конце должна быть конечная косая черта – как в коде, так и в настройках приложения facebook в developers.facebook.com.
Вы должны использовать uurlencode для redirect_uri.
Не используйте $ _SERVER ['REQUEST_URI'] в redirect_uri. Найдите способ добавления любых параметров, которые вам нужны, обрабатывая app_data или добавляя их в зависимости от вашего пользовательского пути.
В качестве начала замените эту строку:
'redirect_uri' => urlencode('http://local.fb-sandbox/'),
и эксперимент с добавлением параметров позже.