Rails CSRF 保護 + Angular.js: protect_from_forgery により POST 時にログアウトする 質問する

Rails CSRF 保護 + Angular.js: protect_from_forgery により POST 時にログアウトする 質問する

オプションが 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

おすすめ記事