我一直在使用 REST API 开发 Rails 应用程序,以便从移动应用程序访问。
它工作得很好。当用户从移动应用程序登录时,他会得到auth_token
他在未来对 API 的请求中使用的信息。问题是 API 也可以通过访问路径 /api/v1/... 从 Web 访问,因此,它必须受到 CSRF 的保护。
我有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
的protect_from_forgery
.
我的问题是:如何确保我的 API 保持安全,同时在执行非 GET 请求时删除警告?
这是我想出的解决方案之一,但它看起来更像是一种 hack 并执行一个额外的数据库查询:
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。该项目的源代码可以在这里找到。