Я использую версию 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 и получения нового бесконечного сеансового ключа (и секретного).