使用ember-simple-auth设计时,是否可以通过cookie_store实现Rails csrf?
这样的指南one总是停用Rails.application.config.session_store
,根据我的理解,这不允许Rails跟踪导致Rails失去会话记录的csrf令牌。在尝试了许多解决方案后,包括:
require jquery_ujs
关于Rails宣言。Rails.application.config.session_store :disabled
。最终结果仍然几乎相同:
如果protect_from_forgery设置为:exception而不是:null_session,则无法验证CSRF令牌真实性,然后是已完成422无法处理的实体。
示例交易:
部分请求HEADER:
X-CSRF-Token:1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ==
响应者HEADER
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/plain; charset=utf-8
X-Request-Id: 71e94632-ad98-4b3f-97fb-e274a2ec1c7e
X-Runtime: 0.050747
Content-Length: 74162
The response also attaches the following:
Session dump
_csrf_token: "jFjdzKn/kodNnJM0DXLutMSsemidQxj7U/hrGmsD3DE="
来自 csrf分支的 rails-csrf 响应(分支已被删除)。
beforeModel() {
return this.csrf.fetchToken();
},
Partial dump of the return statement:
_result: Object
param: "authenticity_token"
token: "1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ=="
根据我的理解,所有这些尝试的解决方案都有共同的根:session_store被禁用...
答案 0 :(得分:1)
这里的想法是拥有两个存储:一个基于cookie的存储,仅用于由Rails维护的csrf令牌,以及一个由Ember-simple-auth维护的localStorage,其中正在使用用户真实性令牌,电子邮件和id自定义会话时的关注SessionAccount继承这些值并在设置可用于整个Ember.js的用户之前对服务器进行验证。
SessionAccount的验证是为了检测对localStorage的任何篡改。每当SessionAccount查询localStorage(例如页面重新加载)时,验证就会发生,因为它通过令牌模型(令牌,电子邮件和ID)与服务器通信。服务器通过TokenSerializer以200或404响应,TokenSerializer仅呈现电子邮件或验证错误,因此除非用户通过需要电子邮件和密码的登录表单登录,否则不会透露前端以查看其他authentication_tokens。
根据我的理解,这种方法中的弱点不容易受到如此容易破解的影响,除非:
现在进入实用的方法:
Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: false
。require 'csrf_cookie_store'
的application.rb上要求它。protect_from_forgery with: :exception
。