【发布时间】:2017-08-05 08:06:17
【问题描述】:
我有一个 Rails 5 API 应用程序 (ApplicationController < ActionController::API)。需要为此 API 的一个端点添加一个简单的 GUI 表单。
最初,当我尝试渲染表单时,我收到了ActionView::Template::Error undefined method protect_against_forgery?。我将include ActionController::RequestForgeryProtection 和protect_from_forgery with:exception 添加到该端点。正如预期的那样解决了这个问题。
但是,当我尝试提交此表单时,我得到:422Unprocessable EntityActionController::InvalidAuthenticityToken。我添加了<%= csrf_meta_tags %> 并验证了meta: csrf-param 和meta: csrf-token 存在于我的标题中,并且authenticity_token 存在于我的表单中。 (令牌本身彼此不同。)
我试过了,protect_from_forgery prepend: true, with:exception,没有效果。我可以通过注释掉“解决”这个问题:protect_from_forgery with:exception。但我的理解是,这会关闭我表单上的 CSRF 保护。 (我想要 CSRF 保护。)
我错过了什么?
更新:
为了澄清这一点,这个应用程序的 99% 是纯 JSON RESTful API。需要向这个应用程序添加一个 HTML 视图和表单。所以对于一个控制器我想启用完整的 CSRF 保护。应用的其余部分不需要 CSRF,可以保持不变。
更新 2:
我只是将这个应用程序的 HTML 表单和 Header 的页面源与我编写的另一个常规 Rails 5 应用程序进行了比较。 Header 中的 authenticity_token 和表单中的 authenticity_token相同。在我遇到问题的 API 应用程序中,它们是不同的。也许是这样?
更新 3:
好的,我不认为不匹配是问题所在。然而,在工作应用程序和非工作应用程序之间的进一步比较中,我注意到网络 > Cookies 中没有任何内容。我在工作应用的 cookie 中看到了很多类似 _my_app-session 的东西。
【问题讨论】:
标签: ruby-on-rails security csrf ruby-on-rails-5