Привет, я пытаюсь использовать аутентификацию на стороне сервера 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 с вашего сервера