Пример потока на стороне сервера - PullRequest
1 голос
/ 08 сентября 2011

Внизу приведен рабочий пример потока на стороне сервера. Это файл fb_server_side_flow.php, который я подготовил по шаблону, найденному на сайте developers.facebook.com. Мой первый вопрос: что такое $ code = $ _REQUEST ["code"]; делать? Получает ли он cookie от Facebook? Если да, то как $ code = $ _REQUEST ["code"]; отличается от кода прямо ниже? Действительно ли необходимо использовать session_start в верхней части fb_server_side_flow.php?

В основном я пытаюсь внедрить систему, которая дает моему пользователю ВАРИАНТ для входа через Facebook, но вход через Facebook не требуется. Есть ли документация по реализации входа через Facebook OPTION, в отличие от обязательной регистрации через Facebook?

Спасибо!

....
function get_facebook_cookie($app_id, $app_secret) {
  $args = array();
  parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
  ksort($args);
  $payload = '';
  foreach ($args as $key => $value) {
    if ($key != 'sig') {
      $payload .= $key . '=' . $value;
    }
  }
  if (md5($payload . $app_secret) != $args['sig']) {
    return null;
  }
  return $args;
}

$cookie = get_facebook_cookie(YOUR_APP_ID, YOUR_APP_SECRET);
....

fb_server_side_flow.php
<?php 

   $app_id = "****";
   $app_secret = "****";
   $my_url = "http://www.sepserver.net/dsg/fb_server_side_flow.php";

   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.");
   }

 ?>

1 Ответ

1 голос
/ 08 сентября 2011

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

Второй блок кода предназначен для того, чтобы позволить пользователю авторизовать ваше приложение (oauth) И для получения маркера access_token, который ваше приложение может использовать для выполнения вызовов API (FB Graph) от имени пользователя.

$ _ REQUEST относится к параметрам POST или GET, а не к файлам cookie. Если вы проверите документы в потоке аутентификации , вы увидите, что Facebook перенаправляет пользователя на http://your_redirect_uri? Code = 1234abcd после того, как пользователь одобрил вашу заявку. Вы должны захватить этот параметр кода и использовать его для повторного вызова graph.facebook.com для получения access_token пользователя.

Цель session_start () - подготовить массив $ _SESSION, чтобы $ _SESSION ['state'] сохранялся при перезагрузке страницы. Если ваш фреймворк уже имеет код обработки сеанса, вы можете его пропустить. Он используется только для защитного бита CSRF.

Дополнительный вход в систему довольно прост. Если вы используете новый PHP SDK, вы можете проверить возвращаемое значение $facebook->getUser(); - если оно равно 0, пользователь не вошел в систему (и вы можете показывать контент как обычно, возможно, с дополнительной ссылкой на fb_server_side_flow.php начать процедуру авторизации.)

...