我已经设置了基于设计和基于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。
当传入的操作是来自外部站点的帖子时,无论哪种方式设计都会将我注销。这是预期的行为,我可以改变吗?
答案 0 :(得分:3)
您需要在外部网站发布时(或针对该特定操作)禁用伪造保护请求,否则Rails针对CSRF攻击的保护机制将(正确)将您注销。