facebook auto re-login от cookie php

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

Я использую Client-Side Flow (javascript) redirect для 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']; } 

Я выяснил, как это сделать. В 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> 

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

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

Поддерживая поток клиентской стороны, вы можете использовать PHP PHP SDK ( см. 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; }