Rails 3 меняет идентификатор сессии на POST из AIR - PullRequest
6 голосов
/ 04 марта 2011

У меня есть REST API в Rails 3, доступ к которому иногда из приложения AIR, а иногда из браузера.

Я думаю это проблема Rails 3, но может быть проблемой Flex / AIR.

Приложение Rails использует omniauth для аутентификации, cancan для авторизации и active_record_store. Я использую модель сеанса для хранения личности пользователя.

(Есть причина, по которой я не использую сеансы cookie, связанные с AIR для Android, OAuth и StageWebView.)

Я использую Чарльза для мониторинга HTTP-трафика.

Большинство запросов работают нормально. Браузер (или клиент AIR) отправляет идентификатор сеанса на сервер, используя HTTP-заголовок Cookie, например:

_session_id=950dee7eca6732aa62b5f91876f66d15

И Rails находит сессию, выясняет, кто пользователь, и делает свое дело.

Но при определенных обстоятельствах Rails генерирует новый сеанс перед отправкой ответа. Он добавляет сеанс в таблицу сеансов и возвращает клиенту заголовок Set-Cookie с новым идентификатором сеанса. Как это:

_session_id=e1489a6b610c0a1d13cec1454228ae47; path=/; HttpOnly

Обстоятельства, при которых это происходит:

  • Запрос поступил от клиента AIR
  • Запрос POST

Это, очевидно, проблема, поскольку при последующих запросах Rails не может найти информацию о пользователе. Он создал новый сеанс без этой информации.

Итак, я просматриваю заголовки HTTP для запроса POST. Вот копия / вставка от Чарльза; Я вставил двоеточие после имени заголовка, чтобы сделать его читаемым.

Host: localhost.seti.hg94.com:3000
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.6
Referer: app:/AndroidApplication.swf
X-Flash-Version: 10,2,152,22
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Cookie: _session_id=950dee7eca6732aa62b5f91876f66d15
Content-Length: 84
Connection: keep-alive

Есть ли у кто-нибудь понимание того, почему Rails будет генерировать новый сеанс в таких условиях? Кажется, это происходит после моего кода контроллера, поскольку у меня есть правильная информация о сеансе в контроллере.

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

1 Ответ

7 голосов
/ 04 марта 2011

Только предположение, но похоже, что вы не передаете токен CSRF, который Rails генерирует для всех запросов на основе POST:

http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf

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