CSRF 令牌 session_store 与 ember-simple-auth 一起设计

CSRF token session_store with ember-simple-auth alongside Devise

是否可以在使用ember-simple-auth Devise的同时通过cookie_store实现Rails csrf?

这样的指南 one 总是停用 Rails.application.config.session_store,根据我的理解,这不允许 Rails 跟踪 csrf 令牌,这会导致 Rails 失去对会话的跟踪g .在尝试了许多解决方案后,包括:

  1. require jquery_ujs Rails 宣言。
  2. Rails.application.config.session_store :disabled.
  3. https://github.com/abuiles/rails-csrf.
  4. Changing Ember.js 附加 CSRF 的适配器。

最终结果还是差不多:

无法验证 CSRF 令牌真实性 后跟 Completed 422 Unprocessable Entity 如果 protect_from_forgery 设置为 :exception的:null_session。

示例交易:

部分请求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 is disabled...

更新!

在进一步了解 CSRF 保护和 Ember-Cli-Rails.

后,下面的答案本质上是错误的

这里的想法是有两个存储:一个基于 cookie 的存储,仅用于由 Rails 维护的 csrf 令牌,以及一个由 Ember-simple-auth 维护的本地存储,其中用户真实性令牌、电子邮件和 ID 正在处理,而自定义会话 SessionAccount 继承这些值并在设置将可用于整个 Ember.js.

的用户之前针对服务器验证它们

SessionAccount 的验证是为了检测对 localStorage 的任何篡改。每次 SessionAccount 查询 localStorage(例如页面重新加载)时都会进行验证,因为它通过令牌模型(令牌、电子邮件和 ID)与服务器通信。服务器通过 TokenSerializer 响应 200 或 404,它只呈现电子邮件或验证错误,因此不会公开前端以查看其他 authentication_tokens 除非用户通过需要电子邮件和密码的登录表单登录。

根据我的理解,这种方法中的弱点不太容易被破解,除非:

  • 有人入侵服务器,获取数据库内容。尽管密码是加盐的,但任何拥有数据库转储的人都可以将 localStorage 令牌、电子邮件和 ID 更改为他们想要模拟的人,并且服务器验证将起作用。但是,这可以通过工作人员每 24 小时(或任何其他时间范围)更改未登录用户的身份验证令牌来最小化。代码示例部分目前没有工作人员,因为我还没有了解他们。
  • 有人知道他们想要破解的人的密码和电子邮件...目前我对此无能为力。
  • 有人拦截了通过 JSON API 传递的数据。强大的 SSL 实施应该做得很好。
  • 如果您的 sessionAccount 在 is_Admin 行中有内容,则可以将令牌与 POST 请求一起发送给仅管理员请求,以便进行进一步的后端验证,因为您永远无法信任前端。
  • 还有别的吗?这些是我知道的。

现在进入实用方法:

  1. 设置 Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: falsesession_store.db.
  2. 在 lib 下创建 csrf_cookie_store 并在 application.rb 上使用 require 'csrf_cookie_store' 要求它。
  3. application.rb 上设置 protect_from_forgery with: :exception
  4. 创建一个 TokenController 来处理验证。
  5. TokenSerializer 这样只发回电子邮件。
  6. 更新您的 Devise Session controller 以在登录时更改令牌并在会话销毁时跳过真实性令牌验证。
  7. 检查您的 routes 是否仅创建令牌并进行自定义 Devise 会话。
  8. 创建 Ember.js Token Model
  9. 将你的 SessionAccount 与我创建的相匹配。
  10. 更新您的 Devise Authenticator 以在会话失效时向服务器发送删除请求。
  11. 测试一下。