Facebook автоматический повторный вход из cookie php - PullRequest
3 голосов
/ 25 мая 2011

Мой веб-сайт использует Facebook-соединение для входа в систему, а продолжительность сеанса на моем сервере составляет 3600.

Я использую Поток на стороне клиента (javascript) для перенаправления на login.php, а login.php извлекает файлы cookie (установленные javascript) для получения токена доступа.

Однако, если пользователь простаивает более 3600 секунд, сеанс на моем сервере истекает. ($ _SESSION ['uid'] не существует.) Как мой login.php может проверить, что пользователь уже вошел в Facebook (не мое приложение) или нет?

Решение, которое я использую, состоит в том, чтобы перенаправить пользователя на мою страницу javascript, и «функция onStatus» будет автоматически активирована Facebook.

Я ищу решение, которое можно сделать с помощью login.php для автоматической повторной регистрации моего веб-сайта, если он или она вошли в Facebook (без перенаправления на страницу javascript). Возможно ли это?

JavaScript:

FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true});

FB.getLoginStatus(function(response) {
    onStatus(response);
    FB.Event.subscribe('auth.statusChange', onStatus);
    FB.Event.subscribe('auth.login', reloadPage);
});

function onStatus(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}

function reloadPage(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}

PHP (для входа в систему):

function get_facebook_cookie($app_id, $app_secret) {
  $args = array();
  if(!isset($_COOKIE['fbs_' . $app_id]))
      return false;
  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 false;
  }
  return $args;
}

$cookie = get_facebook_cookie(MY_APP_ID, MY_APP_SECRET);

if($cookie){
    if($result = @file_get_contents("https://graph.facebook.com/me/?access_token=".$cookie['access_token'])){
        $result = json_decode($result, true);
        $_SESSION['uid'] = $result['id'];
    }

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Я нашел способ сделать это.Чтобы встроить следующую страницу во все страницы.

Когда срок действия маркера доступа, предоставленного Facebook через cookie, истекает, страница в автоматическом обновлении iframe.И FB.init () установит новый токен доступа (cookie) для моего приложения.

В моих файлах php просто проверяйте файлы cookie при первом подключении.

fb_keepalive.html:

<div id="fb-root"></div>
<script type="text/javascript" src="https://connect.facebook.net/zh_TW/all.js"></script>
<script type="text/javascript">
FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true});
FB.getLoginStatus(function(response) {
    onStatus(response);
});

function onStatus(response) {
    if (response.session) {
        var timestamp = new Date().getTime();
        var expires = response['session']['expires'] * 1000;
        if(expires - timestamp >= 0){
            setTimeout(function(){window.location.reload();}, expires - timestamp);
        }
    }
}
</script>
0 голосов
/ 27 мая 2011

Сохраняя поток на стороне клиента, вы можете использовать Facebook PHP SDK ( см. На github ) для работы с пользовательским сеансом.

$facebook = new Facebook(...);

// Get the User ID
$user = $facebook->getUser(); 

$user не означает NULLчто пользователь вошел в Facebook и прошел проверку подлинности.Вам больше не нужен PHP, который вы дали здесь (get_facebook_cookie и прочее): все это включено в Facebook PHP SDK.Это должно быть достаточно для вас.


Пойдем дальше: если вы хотите совершать вызовы API для этого пользователя.

$user не нуль не означает, что у вас есть действительный токен доступа для этого пользователя.Один из способов проверить, есть ли у вас действующий токен доступа, - попытаться выполнить вызов API:

$isvalid;

try { 
  $facebook->api('/me');
  $isvalid = true;
} catch (FacebookApiException $e) {
  $isvalid = false;
}
0 голосов
/ 25 мая 2011

Я все еще новичок в соединении с FB и весь этот процесс, но я хотел положить свои 2 цента. Я видел несколько сайтов, основанных исключительно на пользователях, имеющих FB, поэтому их вход в систему или нет в FB относится к конкретным сайтам. Я упоминаю. Я заметил, что если я вошел в FB и подключался к этим сайтам в прошлом, то я автоматически возвращаюсь на ту же логику, что и на сайте, если я не вошел в систему.

Тем не менее, я предполагаю, что это означает, что FB имеет распознаваемый куки-файл, который может быть обнаружен где-то, где, если он обнаружен, вы, вероятно, можете использовать его в своем скрипте, чтобы заставить пользователей автоматически регистрироваться после этой отметки 3600. Я знаю из твиттера и linkedin, что у них есть пользовательские токены авторизации, которые идентифицируют каждого пользователя, который в конечном итоге может быть сохранен в БД и использован повторно позже. Поэтому я думаю, что, возможно, вам захочется немного подробнее разобраться с FB, так как я уверен, что быть в случае с FB также. Где вы храните этот токен, связанный с пользователем, где вы можете обнаружить, что, если ранее упомянутый cookie был найден, проверьте этот токен аутентификации. Извините, если это не имеет особого смысла. Я здесь работаю на парах. Если бы мне было лучше с FB, я бы постарался предложить больше помощи, но я нахожусь на самых базовых этапах понимания того, как я могу взаимодействовать с FB и сайтом, не принадлежащим FB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...