Rails - 提交表单(POST)后返回页面,session数据丢失

3

我正在将Liberty Reserve购物车集成到我的Rails应用程序中。使用fork submit调用LR非常完美,LR也在成功发布后重定向回我的页面。但是当应用程序返回时,我的会话却丢失了。

页面的外观如下:

<form action="https://sci.libertyreserve.com/en" method="GET">
<input type="hidden" name="lr_acc" value="XXXXX">
<input type="hidden" name="lr_store" value="XXX">
<input type="hidden" name="lr_merchant_ref" value="1">
<input type="submit" value="Liberty Reserve"/>
</form>

LR的工作方式是,用户成功预订交易后,LR会重定向回我的网页,但是我的身份验证失败了,因为所有的会话变量都消失了。

我认为这与Rails应用程序所需的CSRF-TOKEN有关,但显然LR没有提供它。

我能否为一个特定的页面/操作停用CSRF功能或是否有其他解决方法?

2个回答

7

我正在使用Koala库将Rails应用作为Facebook应用程序启动。在某个地方我读到要关闭“protect from forgery”功能。

对于测试,您可以在您的ApplicationController中注释掉protect_from_forgery,但这只是为了让您看看它是否适用。 class ApplicationController < ActionController::Base #protect_from_forgery

如果这样做有效,您可以尝试为您特定的控制器/操作创建一个异常。 http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

请注意,这可能会增加一个漏洞需要处理。 http://ruby.about.com/od/security/a/forgeryprotect.htm


1
阅读了更多信息后,"诀窍"在于确保"外部"应用程序使用GET而不是POST返回到我的网页,防伪功能仅适用于POST。 - KKK
我完全忽视了你在使用GET的事情。很好,你找到了解决方案。 - vik

2
你是否使用了表单标签?
<%= form_tag do %>
  Form contents
<% end %>

其他视图

<%= form_tag(c_add_path, method: 'post', enctype: 'multipart/form-data', style: 'text-align: left;') do %>
  Form contents
<% end %>

这个标签会生成带有session key的html,这样你就可以在使用POST时不会丢失session。参考链接:http://guides.rubyonrails.org/form_helpers.html

虽然没有解决原帖的问题(原帖作者无法控制渲染表单的代码来处理POST请求),但这对我解决了问题。我在登录挑战期间丢失了会话内容,我的新会话表单是用常规HTML构建的,因此它不包括名称为“authenticity_token”的隐藏输入。在POST中缺少真实性令牌会重置我的会话。改用 form_tag 添加缺少的隐藏输入后,问题得到了解决。感谢 @Andrew - Luke Griffiths

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接