オプションが application_controller に記載されている場合はprotect_from_forgery
、ログインして GET リクエストを実行できますが、最初の POST リクエストで Rails がセッションをリセットし、ログアウトしてしまいます。
一時的にオプションをオフにしましたprotect_from_forgery
が、Angular.js で使用したいと思います。何か方法はありますか?
ベストアンサー1
DOM から CSRF 値を読み取ることは良い解決策ではなく、単なる回避策だと思います。
ここにAngularJS公式サイトのドキュメントがありますhttp://docs.angularjs.org/api/ng.$http:
ドメイン上で実行されている JavaScript のみが Cookie を読み取ることができるため、サーバーは XHR がドメイン上で実行されている JavaScript から取得されたことを確信できます。
これ(CSRF保護)を利用するには、サーバーは最初のHTTP GETリクエストで、XSRF-TOKENと呼ばれるJavaScript読み取り可能なセッションCookieにトークンを設定する必要があります。後続の非GETリクエストでは、サーバーはCookieがX-XSRF-TOKEN HTTPヘッダーと一致することを確認できます。
これらの指示に基づいた私の解決策は次のとおりです。
まず、Cookie を設定します。
# app/controllers/application_controller.rb
# Turn on request forgery protection
protect_from_forgery
after_action :set_csrf_cookie
def set_csrf_cookie
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
次に、GET 以外のリクエストごとにトークンを検証する必要があります。Rails
はすでに同様のメソッドでビルドされているため、それをオーバーライドしてロジックを追加するだけです。
# app/controllers/application_controller.rb
protected
# In Rails 4.2 and above
def verified_request?
super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
end
# In Rails 4.1 and below
def verified_request?
super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
end