Rails 4真实性令牌
当我遇到一些真实性令牌问题时,我正在研究一个新的Rails 4应用程序(在Ruby 2.0.0-p0上)。
在编写响应json的控制器时(使用respond_to
类方法),当我尝试使用curl
创建记录时,我开始获取Action ActionController::InvalidAuthenticityToken
异常的create
动作。
我确定我设置了-H "Content-Type: application/json"
并使用-d "<my data here>"
设置数据,但仍然没有运气。
我尝试使用Rails 3.2编写相同的控制器(在Ruby 1.9.3上),并且我没有任何真实性令牌问题。 我搜索了四周,我发现Rails 4中的真实性令牌发生了一些变化。根据我的理解,它们不再自动插入到表单中了? 我想这会以某种方式影响非HTML内容类型。
有没有什么办法可以解决这个问题,而无需请求一个HTML表单,抢走真实性标记,然后用该标记发出另一个请求? 还是我完全错过了一些完全明显的东西?
编辑:我刚刚尝试使用脚手架在新的Rails 4应用程序中创建新记录而不更改任何内容,而且我遇到了同样的问题,所以我想这不是我所做的。
我想我只是想出了它。 我改变了(新)默认值
protect_from_forgery with: :exception
至
protect_from_forgery with: :null_session
根据ApplicationController
的注释。
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
您可以通过查看request_forgery_protecton.rb
的源代码,或者更具体地看以下几行来查看它们的区别:
在Rails 3.2中:
# This is the method that defines the application behavior when a request is found to be unverified.
# By default, Rails resets the session when it finds an unverified request.
def handle_unverified_request
reset_session
end
在Rails 4中:
def handle_unverified_request
forgery_protection_strategy.new(self).handle_unverified_request
end
这将调用以下内容:
def handle_unverified_request
raise ActionController::InvalidAuthenticityToken
end
不要关闭csrf保护,最好将以下代码行添加到表单中
<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>
如果您使用form_for或form_tag生成表单,则它会自动在表单中添加上面的代码行
将以下行添加到表单为我工作:
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
链接地址: http://www.djcxy.com/p/14251.html