Выйдите из системы / переключите пользователя на Facebook после отказа от разрешения автономного доступа

С фейсбукомосуждает разрешения автономного доступа 1 мая веб-приложения могут легко продлить срок действия маркера доступа OAuth (на 60 дней).

Но если приложение находится в Интернете и хочет предоставить"Switch user" вариант, чаще всегоlogout -> login, тогда токен доступа становится недействительным, и офлайн-доступ больше не заменяется.

Question: есть ли способ сохранить действительные токены доступа (в течение 60 дней), но при этом разрешить выходу из системы или нескольким пользователям входить в систему в одном браузере или способ «принудительного входа в систему»? при запросе входа в систему (чтобы Facebook предложил переключить пользователя на странице входа в систему)?

Или мы не рекомендуем больше выходить из системы?

 Nitzan Tomer09 апр. 2012 г., 18:07
Позвольте мне спросить вас: что вы делаете, если пользователь не работал с вашим приложением в течение 60 дней, а срок действия токена истек? Я понимаю, что вам рекомендуется использовать токены, которые вы получаете при взаимодействии с пользователем.
 Nicolas Grasset09 апр. 2012 г., 18:11
Конечно, мы просто считаем, что пользователь больше не активен, если токен истекает. Но в сценарии, который я подчеркиваю, переключение пользователя может привести к истечению срока действия токена через несколько минут, в то время как пользователь хочет выйти из сеанса в своем браузере.

Ответы на вопрос(2)

это не сработает по соображениям безопасности, но пытались ли вы создать URL для выхода из системы без указания токена доступа? То есть, например:

If you're using the PHP SDK, either write your own version of the getLogoutUrl(...) method or just pass in an empty access_token like $facebook->getLogoutUrl(array('access_token' => ''));

If you're using the JS SDK, you will not be able to use FB.logout(), which requires an access token. Instead, you could provide your own:

FB.provide('UIServer.Methods', {
    'auth.logout': {
        url: 'logout.php',
        transform: function(a) {
            var xdRelation = FB.UIServer.getXdRelation(a.params);
            a.params.next = FB.UIServer._xdResult(a.cb, a.id, xdRelation, true);
            return a;
        }
    }
});

Если вы выполните приведенный выше код, теоретически он должен изменить поведение FB.logout, чтобы он больше не передавал access_token. Справедливое предупреждение: я сам не проверял. В противном случае просто отправьте пользователя наhttp://facebook.com/logout.php?next=SOME_URL и посмотрите, работает ли это без access_token.

 Nicolas Grasset14 апр. 2012 г., 21:48
Благодарю.http://facebook.com/logout.php?next=SOME_URLне работает.

и похоже, что независимо от того, как я получаю токен доступа, поток на стороне сервера или поток на стороне клиента, даже если у меня есть два токена (из обоих потоков), когда я вызываюFB.logout() (Я предполагаю, что именно так вы выходите из системы) все токены становятся недействительными.

Мне кажется, что вам придется выбирать, какую функциональность вы предпочитаете иметь, переключать пользователя или долгоживущий действующий токен, если, конечно, я что-то упускаю.

Однако я могу предложить вам обходной путь, он не идеален, как большинство обходных путей, но он может позволить вам наслаждаться обоими мирами: В вашем пользовательском интерфейсе, где вы предоставляете пользователю возможность выйти из системы, чтобы переключать пользователей, просто скажите ему, чтобы выйти из Facebook вручную, а затем, когда он щелкнет по вашему выходу из системы, просто выйдите из системы, не используяFB.logout. That way the access tokens you have for that user won't get invalidated and a different user will be able to log in.

 Nicolas Grasset10 апр. 2012 г., 12:30
Конечно, еще раз, спасибо за ответ. Наверное, лучшее, что я когда-либо получу. Но у Facebook есть push-API и т. Д., Поэтому он, очевидно, создан для сферы действия, немного превышающей интерактивное взаимодействие с пользователем. Надеюсь, не недавнее изменение стратегии, я надеюсь!
 10 апр. 2012 г., 02:32
Удачи в этом, я буду следовать этому вопросу в случае, если есть лучшее решение, которое я пропустил, но я верю, что Facebook просто не хочет, чтобы вы запрашивали их график, если это не в контексте взаимодействия пользователя с вашим приложение.
 25 янв. 2013 г., 10:04
Это меня тоже мучает. Мы используем долгосрочные токены доступа (60 дней) с Facebook, чтобы использовать API графа в автономном режиме (по запросу пользователя), и мы полагаемся на логин Facebook для аутентификации на нашем сайте. Я хотел бы предложить ссылку для выхода из системы, но, поскольку это делает наши токены недействительными, на самом деле не существует достойного решения. В настоящее время наша ссылка для выхода из системы уничтожает наш сеанс на стороне сервера, но на самом деле это мало что дает, поскольку мы автоматически снова регистрируем пользователя, используя javascript SDK, если они возвращаются на наш сайт с действительным сеансом facebook.
 Nicolas Grasset10 апр. 2012 г., 00:04
Спасибо за ответ. Вот как я планировал «решить». это, если нет лучшего решения ... Я думаю, что кто-то в Facebook должен забрать это

Ваш ответ на вопрос