我一直在使用 REST API 开发 Rails 应用程序,以便从移动应用程序进行访问。
它运作得很好。当用户从移动应用程序登录时,他会得到auth_token
他在将来的 API 请求中使用它。问题是 API 也可以通过路径 /api/v1/... 从 Web 访问,因此,必须保护它免受 CSRF 的影响。
I have BaseApiController
继承自的类ApplicationController
具有protect_from_forgery
“启用”。这是例子:
class Api::V1::BaseApiController < ApplicationController
# ...
end
class ApplicationController < ActionController::Base
protect_from_forgery
# ...
end
现在,当我向 API 发出非 GET 请求时,auth_token
,我的请求成功完成,但在日志中我可以看到著名的WARNING: Can't verify CSRF token authenticity
。如果我删除protect_from_forgery
从我的BaseApiController
,我没有收到任何警告(显然),但是我的 API 很容易受到 CSRF 攻击(我制作了一个简单的 HTML 表单,可以在没有任何情况下成功地跨域更改数据)protect_from_forgery
).
我的问题是:如何确保我的 API 保持安全,同时在执行非 GET 请求时删除警告?
这是我提出的解决方案之一,但它看起来更像是一种黑客并执行一个额外的数据库查询:
class Api::V1::BaseApiController < ApplicationController
# ...
def verified_request?
super || User.where(authentication_token: params['auth_token']).count > 0
end
end
有关该项目的更多详细信息:Rails 3.2.14、Devise、AngularJS。可以找到该项目的源代码here.