Facebook auto re-login от cookie php - программирование

Facebook auto re-login от cookie php

Мой сайт использует 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'];
    }
4b9b3361

Ответ 1

Я выяснил, как это сделать. Для iframe следующую страницу на всех страницах.

Когда токен доступа, предоставленный 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>

Ответ 2

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

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

Ответ 3

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

$facebook = new Facebook(...);

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

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


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

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

$isvalid;

try { 
  $facebook->api('/me');
  $isvalid = true;
} catch (FacebookApiException $e) {
  $isvalid = false;
}