2009-10-30 2 views
4

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

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

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

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

Обнаружена ошибка в блоге отслеживания ошибок в Facebook по ошибке 6421, связанная с этим, но я ищу решение на стороне сервера с помощью выпуска Facebook Developer Toolkit 3.0. Мне хотелось бы узнать, как FDT api выйдет на Facebook и получит новую сессию.

Я знаю, что новая сессия установлена ​​на стороне Facebook. Существует контрольный GET на http://www.facebook.com/extern/login_status.php, который отображается на панели 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 (который я создал, чтобы я мог ударить точку останова отладчика в своем контроллере и проверить входящий запрос от Facebook). Он попадает во время предоставления расширенного разрешения, но опять же имеет устаревшую информацию о завершающем сеансе.

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

+0

Хотя я предпочел бы решение с использованием API-интерфейс FDT, подход, который я буду стараться, чтобы выполнить GET на http://www.facebook.com /extern/login_status.php в моем контроллере. У меня не было этого, чтобы работать в прошлом, но я думаю, может быть, мне нужно передать все файлы cookie, которые, как я вижу, отправляются, когда я вижу, что GET происходит в Firebug. Если это не всплывает, я рассматриваю какой-то уродливый метод грубой силы, например, принудительное обновление страницы после получения разрешений offline_access, пока я не получу ключ сеанса с expires == 0, но это будет последний канал подход. –

+0

Я пробовал использовать свой собственный колл для имени пользователя login_status.php, но, к сожалению, он работает только при передаче файлов cookie, которые находятся в домене facebook.com. Я считаю, что это невозможно, поскольку по соображениям безопасности я не могу получить эти данные ... правильно? Для целей тестирования я просто копировал/вставлял значения cookie в свой код, чтобы выполнить вызов, и он работает некоторое время, пока значения cookie не изменятся. И, конечно, я не могу получить данные программно. Увеличивает ли эта новая информация какие-либо другие возможности, которые, по вашему мнению, я должен попробовать? –

+0

Это все больше похоже на ошибку в API Facebook для обработки состояния сеанса и их зависимости от файлов cookie. См. Ошибку в блоге 6421. Я использую новую клиентскую библиотеку Facebook alpha javascript, которая поддерживает управление состоянием сеанса без cookie. Если/когда я его решаю ... Я буду держать этот вопрос в курсе. –

ответ

5

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

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

К счастью, у 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 и помещаю sessionkey и секрет в поля формы, чтобы они были отправлены на контроллер.

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

Смежные вопросы