Придумать очистку сессий на почте? - PullRequest
0 голосов
/ 03 апреля 2012

У меня настроена аутентификация на основе устройства и всевозможных правил, и в большинстве случаев она работает нормально. После входа в систему я установил current_user и использую before_filter :authenticate_user! Он работает в основном так, как ожидалось. Сессия прилипает даже когда я (вручную) захожу на другие сайты. Когда я возвращаюсь на свой сайт, я все еще вхожу в систему.

Я столкнулся с проблемами при попытке интеграции с поставщиком платежного шлюза.

Я отправляю сообщение формы в платежный шлюз, который выполняет свою функцию, а затем возвращает пользователя обратно на мой сайт, делая сообщение формы. Когда пользователь заходит на мой сайт, файлы cookie удаляются, и аутентификация теряется. Это означает, что current_user теперь равно нулю.

Поток похож на

Order - > Login -> Confirm -> PaymentGateway -> CallBack(MySite) 
   |                 ^
   | -- loggedin --  |
    -----------------

Я провел дальнейшие исследования, используя проверку Firefox, и похоже, что файлы cookie установлены правильно. Например, после того, как я войду в систему, файл cookie будет _session_id:f58b52e6c168178711ba66aa3ac9d637. Когда я вернусь из Платежного шлюза, файл cookie (в соответствии с firefox) будет _session_id:f58b52e6c168178711ba66aa3ac9d637 .. Это заставит меня поверить, что я останусь аутентифицированным. Однако, когда я печатаю current_user, я получаю ноль.

Я также печатаю cookie в моих контроллерах, и это правильно:

In Подтвердить действие, когда я печатаю куки, получаю

Cookies #<ActionDispatch::Cookies::CookieJar:0x000001017c33d0, @set_cookies={}, @delete_cookies={}, @host="localhost", @secure=true, @closed=false, @cookies={"_session_id"=>"f58b52e6c168178711ba66aa3ac9d637"}>

На странице CallBack (MySite), если я печатаю куки, я получаю

Cookies #<ActionDispatch::Cookies::CookieJar:0x0000012b2225f0 @set_cookies={}, @delete_cookies={"remember_user_token"=>{:path=>"/"}}, @host="localhost", @secure=true, @closed=false, @cookies={"_session_id"=>"f58b52e6c168178711ba66aa3ac9d637"}>

Что мне здесь не хватает. Почему разработчики намеренно выходят из меня? И есть ли способ остаться в системе?

Edit:

Я тоже пытался запомнить ... Это тоже не работает и чистит печенье.

In Подтвердить действие, когда я печатаю печенье, которое я получаю

Cookies #<ActionDispatch::Cookies::CookieJar:0x0000012b286fc8 @secret="4ccae7dce24d26dcf98220fb1e54cacf412efe1bf7dc003e1e5315abf50f5c4ep9g6i62b8a9d83cf3501564c7bd70ca7722db85a46015652c3d7fa4f156d4d0b", @set_cookies={}, @delete_cookies={}, @host="localhost", @secure=true, @closed=false, @cookies={"_session_id"=>"f63c3165f807b15e4a4e7de4a615d012", "remember_user_token"=>"BAhbB1sGaQYiIiQyYSQxMCRxVGJoVzEydjJtQ1Y4dndUeTdJMVp1--099213f62d5e317d9f83e758ac5995395e63ce7f"}>

Обратите внимание, что remember_user_token установлен

На странице CallBack (MySite), если я печатаю куки, я получаю

#<ActionDispatch::Cookies::CookieJar:0x0000012b410100 @secret="4ccae7dce24d26dcf98220fb1e54cacf412efe1bf7dc003e1e5315abf50f5c4ep9g6i62b8a9d83cf3501564c7bd70ca7722db85a46015652c3d7fa4f156d4d0b", @set_cookies={}, @delete_cookies={"remember_user_token"=>{:path=>"/"}}, @host="localhost", @secure=true, @closed=false, @cookies={"_session_id"=>"f63c3165f807b15e4a4e7de4a615d012"}>

Таким образом, перед тем, как фильтр удалил cookie remember_user_token, в проверке Firefox я могу подтвердить, что оба cookie отправлены на сайт и на рельсы.

В любом случае, devise выводит меня из системы, когда входящим действием является сообщение с внешнего сайта. Это ожидаемое поведение, могу ли я его изменить.

1 Ответ

3 голосов
/ 03 апреля 2012

Вам необходимо отключить запрос от защиты от подделки, когда внешний веб-сайт публикует (или для этого конкретного действия), в противном случае механизм защиты Rails от CSRF-атак будет (правильно) выходить из системы.

...