在Post上设计擦洗会话?

时间:2012-04-03 10:46:58

标签: ruby ruby-on-rails-3 devise ruby-on-rails-plugins

我已经设置了基于设计和基于omniauth的身份验证,并且它在大多数情况下都运行良好。登录后,我设置了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,这是正确的:

在我打印饼干时的确认操作中

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

在CallBack(MySite)页面中,如果我打印cookie,我会

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

我在这里缺少什么。为什么设计故意让我退出。有没有办法让我保持登录状态?

编辑:

我也尝试过记忆......这也不起作用并擦洗cookie。

在我打印饼干时的确认操作中

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)页面中,如果我打印cookie,我会

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

所以前一个过滤器删除了remember_user_token cookie,在firefox的检查中,我可以确认两个cookie都被发送到站点和rails。

当传入的操作是来自外部站点的帖子时,无论哪种方式设计都会将我注销。这是预期的行为,我可以改变吗?

1 个答案:

答案 0 :(得分:3)

您需要在外部网站发布时(或针对该特定操作)禁用伪造保护请求,否则Rails针对CSRF攻击的保护机制将(正确)将您注销。