2015-04-11 3 views
2

У меня есть контроллер, который пытается принимать входные данные формы, задавать значения в файле cookie, а затем перенаправлять страницу, которая будет извлекаться из этого файла cookie.Rails 4: Как настроить файлы cookie при перенаправлении?

Проблема в том, что файл cookie никогда не устанавливается в заголовках переадресации.

Примечания: Я тестировал в Chrome и FF. Версия Rails - 4.0.13. Настройка cookie без перенаправления работает как ожидалось.

Вот код контроллера:

def create 
    request.cookies[:foo] = "bar" 

    # also tried: 
    # cookies[:foo]="bar" 
    # cookies.signed[:foo]="bar" 
    # cookies[:foo] = { 
    #  value: "bar", 
    #  expires: 1.month.from_now, 
    #  domain: ".myapplicationhostname.com" 
    # } 

    redirect_to root_url 
end 

Заголовок ответа на редиректе не содержит атрибут Set-Cookie и как таковые, значения куков не доступны в контроллере/действии в перенаправленном путь.

Я нашел contradictory evidence, что некоторые браузеры не принимают файлы cookie в переадресации, но похоже, что это уже не так? И вообще, ни FF, ни Chrome не показывают Set-Cookie в заголовке ответа, поэтому он не отображается, это проблема с браузером.

Вот ответ заголовка из локона, обратите внимание на отсутствие Set-Cookie:

HTTP/1.1 302 Moved Temporarily 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
X-Content-Type-Options: nosniff 
X-UA-Compatible: chrome=1 
Location: http://app.mydomain.com:3000/ 
Content-Type: text/html; charset=utf-8 
Cache-Control: no-cache 
X-Request-Id: 1fc1c7e5-7489-4720-bb70-28588f3abcb6 
X-Runtime: 4.688166 
Connection: close 
Server: thin 1.6.2 codename Doc Brown 

Как получить рельсы установить кук (или, по крайней мере, установить заголовок) на переадресовываешь?

+0

Что проблема с заголовками? 'request.headers [" foo "] =" bar "' – RAJ

+0

Переадресовываете ли вы в тот же домен? – Alexander

+0

Я пытаюсь установить cookies на стороне сервера, и это обычно делается с помощью HTTP-заголовка Set-Cookie. Предположим, я могу попробовать настроить этот заголовок вручную, но это кажется взломанным. –

ответ

5

Похоже, что причиной этого является защита от CSRF. Контроллер создал экземпляр NullCookieJar, который предотвращает написание файлов cookie, когда есть потенциально поддельный POST.

Это связано с тем, что мой контроллер настраивался для ответа на форму вне площадки, таким образом, не было доступа к токену CSRF.

Итак, если вы работаете с этим при отправке формы вне сайта в приложение Rails, вам необходимо отключить проверку CSRF или написать собственный метод проверки, как описано в ответе на вопрос SO: "Receive POST from External Form".

Обобщенная здесь:

Отключение Проверьте

skip_before_filter :verify_authenticity_token, only: :my_action 

заказ Проверить

skip_before_filter :verify_authenticity_token, :only => :my_action 
before_filter :verify_custom_authenticity_token, :only => :my_action 

def verify_custom_authenticity_token 
    # checks whether the request comes from a trusted source 
end 
+0

Это не будет доступ к CSRF, даже если вы пытаетесь в том же домене? –

+0

Я не пробовал в том же домене. Это создавалось как виджет формы, предназначенный для сторонних сайтов, которые будут размещаться в моем приложении. –

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