Как получить бесконечный сеансовый ключ Facebook сразу после предоставления offline_access с помощью Инструментария разработчика Facebook - PullRequest
4 голосов
/ 31 октября 2009

Я использую версию 3.0 Developer Toolkit Facebook для создания приложения MVC iframe для Facebook, и у меня возникают проблемы с получением бесконечного сеансового ключа сразу после его предоставления.

Когда пользователь впервые нажимает на настройки моего приложения View, чтобы установить свои предпочтения, у него просто есть обычный истекающий ключ сеанса от Facebook. Нет проблем.

В зависимости от выбранных предпочтений, я запрашиваю у них расширенное разрешение offline_access, используя клиентскую библиотеку JavaScript JavaScript FB.Connect.showPermissionDialog. Опять без проблем, они дают разрешение.

В этот момент выдается новый не истекающий (бесконечный) сеансовый ключ. Мне нужно сохранить это в моей базе данных для будущего использования. Проблема в том, что я не могу понять, как получить его сразу, когда мне это нужно. Файлы cookie Facebook, содержащие информацию о сеансе, не обновляются до тех пор, пока не произойдет еще несколько обновлений страницы.

Существует открытая ошибка в трекере ошибок Facebook с идентификатором ошибки 6421, связанная с этим, но я ищу решение на стороне сервера, использующее выпуск Facebook Developer Toolkit 3.0. Я бы хотел, чтобы FIT API вышел на Facebook и получил новую сессию.

Я знаю, что новый сеанс установлен на стороне Facebook. На http://www.facebook.com/extern/login_status.php есть контрольный сигнал GET, который появляется на панели Firebug Net сразу после того, как пользователь предоставил разрешение offline_access и получил ответ с некоторым javascript, содержащим новый не истекающий ключ сеанса. И если я продолжу использовать старый истекающий сеансовый ключ, я получу недопустимые ошибки сеанса от Facebook.

В моем контроллере у меня есть код вроде:

[AcceptVerbs(HttpVerbs.Post)]
[FacebookAuthorization(IsFbml = false)]
public ActionResult Index(FormCollection collection)
{
        var api = this.GetApi();
        var userid = api.Session.UserId;
        var key = api.Session.SessionKey;
}

Это старый SessionKey, а не новый, не имеющий срока действия.

У меня нет этой проблемы, если я украшаю свой ActionResult с помощью ExtendedPermissions = "offline_access" на GET, заставляя пользователя предоставлять offline_access до того, как он увидит страницу, но мне не нравится этот пользовательский опыт. Я предпочитаю предлагать использовать javascript только при необходимости, и лайтбокс разрешений javascript гораздо приятнее, чем запрос разрешений на полную ширину страницы, когда я использую ExtendedPermissions = "offline_access".

Я также попытался перехватить вызов моего xd_receiver (который я сделал View, чтобы я мог установить точку останова отладчика в его контроллере и проверить входящий запрос от Facebook). Он получает удар во время предоставления расширенного разрешения, но опять-таки на него ссылается старая информация об истекающем сеансе.

Напомним, что я ищу способ использования инструментария разработчика Facebook для принудительного обновления сеанса из Facebook и получения нового бесконечного сеансового ключа (и секретного).

1 Ответ

5 голосов
/ 20 ноября 2009

Ненавижу отвечать на мой вопрос, но это, безусловно, лучше, чем не иметь решения. Надеюсь, это поможет кому-то еще.

Основная причина проблемы заключается в том, что файлы cookie не обновляются своевременно с новым сеансом или до перезагрузки страницы. Разработчик Facebook говорит, что это проблема браузера. Все клиентские библиотеки Facebook, включая .NET Facebook Developer Toolkit, используют куки для информации о сеансе. Так что это ошибка браузера, или ошибка Facebook, или ошибка в дизайне Facebook, которая ставит такую ​​большую зависимость от куки. См. Facebook ошибка 6421.

К счастью, у Facebook есть новая клиентская библиотека Javascript в альфа-версии, которая работает без файлов cookie.

<div id="fb-root"></div>
<script type="text/javascript"
    src="http://static.ak.fbcdn.net/connect/en_US/core.js">
</script>

<script type="text/javascript" >

    // initialize the library with the API key, set cookie: false
    FB.init({
        apiKey: your_facebook_apikey,
        cookie: false,
    });

    FB.getLoginStatus(function(response) {
        if (response.session) {
            alert(response.session.session_key);
        } else {
            // re-prompt for permissions or do some other exception handling
        }
    }, true); // critical optional parameter to force a refresh

</script>

(для краткости опущены запросы разрешений Facebook и другие материалы)

В моем приложении MVC я запрашиваю разрешения в Javascript. Перед отправкой формы я выполняю вызов getLoginStatus и помещаю сеансовый ключ и секретный ключ в поля формы, чтобы они были отправлены на контроллер.

Новая клиентская библиотека Javascript находится на github по адресу http://github.com/facebook/connect-js

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