Токены доступа к Facebook – аутентификация на стороне сервера

Привет, я пытаюсь использовать аутентификацию на стороне сервера facebook, чтобы получить токен доступа, но продолжаю получать ошибки, наложенные на меня.

Я использую рев:

$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 = "https://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."); } 

Идентификатор приложения и APP Secret были удалены, поэтому не беспокойтесь об этой части. Я получаю ошибки в тайм-ауте get_file_contents.

[function.file-get-contents]: не удалось открыть поток: время ожидания подключения

Есть ли другой или лучший способ получить токены доступа?

Bellow – это версия, которую я пробовал, включая идею cURL:

 function get_data_cURL($url) { $ch = curl_init(); $timeout = 5; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $data = curl_exec($ch); curl_close($ch); return $data; } function getAccessToken(){ $app_id = FB_APP_ID; $app_secret = FB_SECRET_ID; $canvas_URL = FB_CANVAS_URL; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_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($canvas_URL) . "&client_secret=" . $app_secret . "&code=" . $code; $returned_content = get_data_cURL($token_url); echo'Well Done! - '.$returned_content; } else { echo("The state does not match. You may be a victim of CSRF."); } } 

Детали:

Настройки приложения – URL холста: http://www.apps.elistone.co.uk/DrawMyFriend/

 FB_APP_ID = The Facebook App ID FB_SECRET_ID = The Facebook Secret ID FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/ 

Даже с этим обновлением я все еще получаю эту ошибку:

Старая ОШИБКА

Отлично сработано! – {"error": {"message": "Ошибка проверки кода подтверждения.", "type": "OAuthException", "code": 100}}

Новая ОШИБКА

Это, по-видимому, вызвано перенаправлением, удаляющим код состояния.

Состояние не соответствует. Вы можете стать жертвой CSRF. – 193c791ddd71c3fd84d411db5554c315 (код состояния)

Я также попытался обходить защиту CSRF, изменив:

 if($_REQUEST['state'] == $_SESSION['state']) 

TO:

  if(!empty($code)) 

Но это все еще дает старую проблему с ошибкой, я слышал, что это вызвано чем-то в ссылке перенаправления, но я не уверен, как ее исправить.

ЗАДАЧА РЕШЕНА

После того, как я попытался сделать это, я привел к использованию PHP SDK, используя ниже, чтобы получить токен доступа пользователя:

 $app_id = FB_APP_ID; $app_secret = FB_SECRET_ID; $canvas_URL = FB_PAGE_URL; $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $canvas_URL . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $facebook->api('oauth/access_token', array( 'client_id' => FB_APP_ID, 'client_secret' => FB_SECRET_ID, 'type' => 'client_cred', 'code' => $code, )); $token = $facebook->getAccessToken(); echo$token; } 

Теперь я собираюсь превратить это в какую-то функцию. Большое вам спасибо за все время и помощь.

Надеюсь, это поможет нуждающимся людям в будущем (если Facebook не изменит все внезапно)

Я рекомендую вам использовать PHP SDK-библиотеку для общения с Facebook API. И просто используйте getAccessToken() или getAccessTokenFromCode() .

ОБНОВИТЬ

Чтобы получить токен доступа пользователя, вы должны отправить запрос oauth перед тем, как получить токен доступа. Подробности в обновлении ответа:

  $facebook->api('oauth/access_token', array( 'client_id' => APP_ID, 'client_secret' => APP_SECRET, 'type' => 'client_cred', 'code' => $code, )); $token = $facebook->getAccessToken(); 

Двумя наиболее вероятными причинами отказа на этом этапе являются:

  • redirect_uri отсутствует конечная '/'
  • redirect_uri в вашем вызове /oauth/access_token не ТОЧНО соответствует перенаправлению, которое вы указали в диалоговом окне oauth

В любом случае проверка кода завершится неудачно, и вы не получите токен,

Ошибка «не удалось открыть поток: время ожидания соединения», вероятно, не связана с этим, хотя обычно это указывает на DNS или сетевую ошибку при попытке получить доступ к graph.facebook.com с вашего сервера