【问题标题】:Rails REST API Server: protect_from_forgery option and where to put authentication tokenRails REST API 服务器:protect_from_forgery 选项以及放置身份验证令牌的位置
【发布时间】:2015-08-14 11:40:26
【问题描述】:

更新(2015 年 8 月 14 日):感谢 @EugZol 的想法,我更新了标题,因为之前的标题具有误导性。

我现在正在尝试构建 Rails REST API 服务器。

我已经阅读了其他人的帖子,我可以使用protect_from_forgery with: :null_session 来处理 JSON 请求的 CSRF 问题,尤其是 POST 请求。我认为这个 null_session 只会清理会话(这对 JSON 请求没用)。

但是我怎样才能对用户是否登录进行身份验证呢?我不想在每个请求中都发送密码。所以我认为:null_session 可能不安全。

如果您能提供一些关于以下方面的想法,我将不胜感激:

  1. 如果指定了:null_session,如何对 REST API 服务器进行身份验证检查?
  2. 如果解决方案是使用authenticate_token,我应该将此令牌放在我的 JSON 响应中的什么位置?客户应该把它放在哪里?
  3. 按照上一个:我需要在数据库中保存该令牌的摘要吗?我认为现在不会使用会话...

非常感谢。

【问题讨论】:

    标签: ruby-on-rails json rest


    【解决方案1】:

    如果您不使用 cookie 来授权您的客户端,则无法完成 CSRF。它之所以有效,只是因为浏览器会自动将 cookie 添加到请求中。例如。当你打开以下图片时:

    <img src="my.bank/withdraw_funds?to=john_doe">
    

    您的浏览器将向my.bank 发出请求并附加cookie,授权转移。

    但是,如果您使用某些 API 令牌(作为请求参数或标头),则无法制作恶意图像/表单来将该令牌添加到请求中(因为攻击者不知道令牌)。

    而且,是的,您应该将此令牌放入数据库。 Rails 的 session 使用 cookie,如前所述,API 服务器不应依赖它们。

    您的身份验证方法(可能在 ApplicationController 中的某处)如下所示:

    before_action :authenticate
    
    def authenticate
      @user = User.where(token: params.require(:token)).first
    end
    

    然后您可以在您的操作中使用@user。在客户端,您只需将?token=... 添加到您的请求参数中。

    如果您使用标头(更好,至少因为您不应该担心在执行 GET 请求时令牌会保存在代理服务器的日志中),您将 X-Authentication-Token: ... 标头添加到您的请求中,然后修改您的ApplicationController 这样:

    before_action :authenticate
    
    def authenticate
      @user = User.where(token: request.headers['HTTP_X_AUTHENTICATION_TOKEN']).first
    end
    

    【讨论】:

    • 感谢您的回复!这真的很有帮助!我认为您对为什么我们应该将令牌放在标题中的解释非常清楚!再次感谢:)
    • 好吧,如果您对每个请求都强制执行 SSL(无论如何这是个好主意),您可能会对请求参数中的令牌感到安全。不客气!如果你喜欢,也考虑支持我的回答:)
    • 我当然会,但我的声望在 15 岁以下:-if :null_session, how to authenticate
    • 您可以将其更改为类似“Rails 作为 API 服务器:protect_from_forgery 选项以及放置身份验证令牌的位置”,即反映所讨论的两个主题。
    • 嗨@EugZol,如果你有空,可以看看这个problem :)
    猜你喜欢
    • 2019-04-07
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多