Rails REST API服务器:protect_from_forgery选项以及放置身份验证令牌的位置

时间:2015-08-14 11:40:27

标签: ruby-on-rails json rest

  

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

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

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

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

如果你能给我一些想法,我将非常感激:

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

1 个答案:

答案 0 :(得分:1)

如果您不使用cookie来授权您的客户,则无法完成CSRF。它的工作原理只是因为浏览器会自动为请求添加cookie。例如。当你打开下面的图片时:

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

您的浏览器会向附加了Cookie的my.bank发出请求,授权转移。

但是如果您使用某些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