Сеанс приложения Rails не распознан для iOS NSURLRequests

У меня есть простое приложение rails с одним контроллером. У меня есть «фильтр перед» для некоторых методов моего контроллера, где я проверяю, вошел ли пользователь в систему, просматривая объект сеанса:

@user = User.where(:id => session[:user_id]) if session[:user_id]

В методе входа в систему моего контроллера я делаю:

session[:user_id] = user.id

Довольно обычные вещи. Если я получаю доступ к своему приложению из веб-браузера (Chrome), все работает нормально. Однако, когда я использую NSURLRequest из своего приложения iOS для доступа к моему приложению rails, сервер всегда создает новый сеанс для каждого запроса. Похоже, он никогда не сможет идентифицировать существующий сеанс, даже если запрос отправляет файл cookie с правильным идентификатором сеанса. На самом деле, если я посмотрю на объект cookie в моем приложении rails, я увижу, что он содержит идентификатор сеанса. Однако объект сеанса всегда пуст! Не уверен, почему сервер не может получить сеанс. Я использую Пассажирский Phusion. Какие-либо предложения?


person DarezGhost    schedule 07.10.2012    source источник
comment
Вы уверены, что объект cookies в приложении rails содержит идентификатор сеанса, а не просто идентификатор сеанса a? Если приложение отправляет запрос без него, первое, что сделает сервер rails, — это выделит новый идентификатор сеанса и установит его в файле cookie. Таким образом, вы всегда будете видеть идентификатор сеанса. Нужно проверить, что он не меняется при каждом запросе.   -  person aroth    schedule 07.10.2012
comment
первый запрос iOS — войти в систему. Этот запрос без каких-либо файлов cookie. Сервер создает новый сеанс и отправляет идентификатор обратно в файле cookie. Затем второй запрос iOS отправляет файл cookie в приложение rails с идентификатором сеанса, возвращенным из предыдущего запроса. Я убедился, что это ТОЧНО тот же идентификатор, который был возвращен сервером после первого запроса. Однако сервер просто возвращает еще один идентификатор сеанса для второго запроса.   -  person DarezGhost    schedule 07.10.2012


Ответы (1)


Если вы POST переходите на свою страницу входа, а сообщение не включает токен CSRF, соответствующий токену в сеансе, то Rails отклонит запрос и аннулирует/сбросит сеанс в качестве меры безопасности.

Чтобы исправить это, просто прочитайте токен CSRF из сеанса и включите его в свой запрос или отключите проверку токена CSRF, вы можете поместить skip_before_filter :verify_authenticity_token в свой контроллер, чтобы пропустить проверки защиты CSRF. Обратите внимание, что последний подход открывает потенциальные дыры в безопасности, поэтому рекомендуется включать токены и проверять их, если это вообще жизнеспособно.

person Chris Heald    schedule 07.10.2012
comment
и это было! Большое спасибо! ;) - person DarezGhost; 07.10.2012