更新(2015年8月14日):感谢@ EugZol的想法,我已经更新了标题,因为前一个标题具有误导性。
我正在尝试构建一个Rails REST API服务器。
我已经阅读了其他帖子,我可以使用protect_from_forgery with: :null_session
来处理JSON请求中的CSRF问题,尤其是POST请求。我认为这个null_session只会清理会话(对JSON请求没用)。
但是我怎样才能对用户是否登录进行身份验证?我不想在每个请求中发送密码。所以我认为:null_session
可能不安全。
如果你能给我一些想法,我将非常感激:
:null_session
,如何对其进行身份验证检查?authenticate_token
,我应该在哪里将此令牌放入我的JSON响应中?客户应该把它放在哪里?非常感谢。
答案 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