Расширение токена авторизации без обновления страницы - PullRequest
2 голосов
/ 16 сентября 2011

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

Лучшим решением будет как-то "переустановить" и получить новыйтокен без обновления страницы.Возможно ли это?

Ответы [ 9 ]

3 голосов
/ 19 сентября 2011

Я бы подписался на триггер истечения срока действия (я думаю, что это authResponseChange), а затем автоматизировал еще одну проверку входа в систему.Это не будет идеальным решением, поскольку оно может автоматически вызывать всплывающее окно (если они вышли из системы), которое может блокировать множество браузеров.Вместо этого вы можете, когда токен истечет, проверить, нужно ли ему завершить всплывающее окно, и отобразить где-нибудь на своей странице уведомление, говорящее «Facebook требует вашего внимания, чтобы продолжить», а затем запустить только всплывающее окно из их ответа, чтоостановить всплывающее окно заблокировано.

FB.Event.subscribe('auth.authResponseChange', function(response) {
  // do something with response
  FB.login(){
    // refresh their session - or use JS to display a notification they can 
    // click to prevent pop up issues
  }
});
2 голосов
/ 25 сентября 2011

Алгоритм тренировки на этом

  1. Запросить разрешение у пользователя
  2. Сохранить токен
  3. Периодически проверять, не истек ли токен доступа или нет
  4. Если срок действия истекает, вставьте фиктивный iframe, который перенаправляет на домашнюю страницу facebook. - Расширение токена авторизации без обновления страницы
  5. Это должно обновить токен. Вам может понадобиться сгенерировать другой токен или продолжить с тем же. Что бы ни потребовалось, это можно сделать без обновления страницы.
1 голос
/ 23 сентября 2011

Полагаю, это невозможно, архитектура FB этого не допустит. И почему offline_access является такой проблемой !!!!!! ... в любом случае offline_access - лучшее оптимальное решение, я думаю ....

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

Попробуйте получить токены с разрешением offline_access.

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

Думал ли ты об использовании ajax? Через два часа вы проверите, активен ли пользователь. Если это так, вы отправляете запрос axax на URL, где будет обновляться информация о его сеансе. Пример:

$(document).ready(function(){
    setInterval('update_session()', 5500000);
})
update_session(){
    $.post({
        URL: ..., // script to update session on server
        data:{ /* username, password */ },
    })
}

и серверная сторона просто берет имя пользователя и пароль из записи или запускает relogin.

0 голосов
/ 12 марта 2012

Посмотрите на https://developers.facebook.com/docs/offline-access-deprecation/#extend_token

в основном вы расширяете токен с помощью

https://graph.facebook.com/oauth/access_token?             
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN 

, который даст вам новый токен с новым временем истечения (он должен быть 60d, но я замечаю похожую ошибку, описанную здесь https://developers.facebook.com/bugs/347831145255847/?browse=search_4f5b6e51b18170786854060)

0 голосов
/ 22 сентября 2011

Я предполагаю, что вы используете параметр iframe signed_request для получения вашего токена доступа. Один из способов достижения того, что вам требуется, - это использование метода oAuth 2.0 для получения токена доступа. Это более продолжительно в первом случае; ваш сервер и Facebook должны обмениваться учетными данными, которые могут быть медленными, но это означает, что вам будет предоставлен code, который можно регулярно обменивать на токен доступа, что означает, что ваш сервер может периодически поддерживать сеанс (возможно, из-за вызова ajax из клиент). Затем вы должны передать этот новый access_token клиенту и использовать его в диалоговом вызове для ваших запросов (подарков).

Надеюсь, это поможет.

Spabby

0 голосов
/ 22 сентября 2011

Если вы получите access_token без указания срока их действия, он не истечет. по крайней мере, пока пользователь не изменит свои учетные данные Fb или не зарегистрирует ваше приложение.

0 голосов
/ 19 сентября 2011

К сожалению, я считаю, что это невозможно по замыслу (если вы хотите, чтобы это происходило без вмешательства пользователя).Если пользователь все еще вошел в Facebook, вы можете перенаправить страницу верхнего уровня в Facebook, и она вернет вас обратно с новым кодом (как кажется, вы уже делаете), но это возможно только из-за Facebookпеченье, что он может проверить.Если вы попытаетесь что-либо сделать с вашего сервера, он будет отклонен, поскольку этот файл cookie не будет сопровождать запрос.То же самое относится и к попытке позвонить на facebook из javascript - поскольку ваш код работает в другом домене, cookie не будет сопровождать вызов, и Facebook отклонит его.Единственный способ, которым Facebook может даже узнать, кто пользователь и что он все еще вошел в систему, - это просмотреть этот файл cookie.И единственный способ, который может произойти, - это если сам браузер перенаправлен на домен facebook.com.

Стоит также упомянуть, что Facebook заблокировал единственный логический обходной путь, то есть загрузку URL-адреса oauth в iframe.Если вы попробуете это, вы увидите, что они обнаруживают, что страница загружается в iframe, и выводят страницу со ссылкой на нее, которая выполняет перенаправление верхнего уровня, чтобы выйти из фрейма.Таким образом, этот подход не только не работает, но и ясно, что Facebook определенно сделал это невозможным в рамках своей архитектуры.

Редактировать: Если то, что вы хотите сделать, это вовсе не избегать обновления, а просто сделать это автоматическикогда нужен новый токен, вы можете сделать что-то вроде этого:

$status=0;
$data=@file_get_contents("https://graph.facebook.com/me?access_token=$token");
foreach ($http_response_header as $rh) if (substr($rh, 0, 4)=='HTTP') list(,$status,)=explode(' ', $rh, 3);
if ($status==200)
  {
  //token is good, proceed
  }
else
  {
  //token is expired, get new one
  $fburl="http://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=".urlencode('http://apps.facebook.com/yourapp/thispage.php');
  echo "<html>\n<body>\n<script>top.location='$fburl';</script>\n</body>\n</html>\n";
  exit;
  }

Это предполагает, что у вас есть что-то перед этим кодом, которое обработает параметр Sign_request, если он присутствует, и присвоит значение $ token (либо явный собственный код, либо соответствующие записи в SDK).Показанный код затем можно использовать везде, где вам нужно проверить, если $ token все еще действителен, прежде чем продолжить.

...