モバイル アプリケーションからアクセスするための REST API を使用して Rails アプリを開発しています。
それは非常にうまく機能します。ユーザーがモバイル アプリケーションからログインすると、auth_token
API への今後のリクエストで使用するものを取得します。問題は、パス /api/v1/... に移動することで Web からも API にアクセスできることです。このため、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
、(明らかに) 警告は表示されませんが、API は CSRF 攻撃に対して脆弱です ( protect_from_forgery
.
私の質問は次のとおりです: API が安全であることを保証する方法と、GET 以外のリクエストを実行するときに警告を削除する方法は?
これは私が思いついた解決策の 1 つですが、ハックのように見え、追加の DB クエリを 1 つ実行します。
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。プロジェクトのソース コードはここにあります。