私はRails APIをhttp専用のクッキーで認証しているので、CSRF保護が必要です。私が知ることから、Railsコミュニティは、クッキーではなくローカルストレージにjwt authトークンを格納するほうが好まれるようです。これにより、CSRFの必要性が回避されますが、XSSに公開されるため、クッキー+ csrfを使用することになりました。Rails 5 APIモードでCSRFを有効にする方法
ローカルストレージのコミュニティ設定が原因で、CSRF保護がデフォルトで無効になっているようです。私はそれを可能にするために努力しています。ここで私はそれを処理しようとしてる方法です:
クライアント側でmodule V1
class ApplicationController < ::ApplicationController
include Concerns::Authentication
include ActionController::RequestForgeryProtection
protect_from_forgery
protected
def handle_unverified_request
raise 'Invalid CSRF token'
end
after_action :set_csrf_cookie
def set_csrf_cookie
if current_user
cookies['X-CSRF-Token'] = form_authenticity_token
end
end
end
end
、私はトークンが戻っクッキーでてくることがわかります。私がリクエストをすると、トークンがX-CSRF-Token
ヘッダーにあることもわかります。これまでのところよく見える。
ただし、verified_request?
メソッドはfalseを返します。したがってhandle_unverified_request
が呼び出されます。 Railsのコードを実行すると、自分のトークンがrequest.x_csrf_token
に存在することがわかりますが、session
と照合したときにトークンの検証に失敗したようです。私がここで思っていることの1つは、セッション管理がAPIモードでデフォルトになっていないことを理解しているので、session
を正しく動作させるために何かを有効にする必要があるかどうかです。しかし、そのような場合は、session
オブジェクトにアクセスしようとすると予想されるようになるでしょうし、そうではないので、わかりません。
私はエラーを起こしましたか、それともオンにする必要がある他のミドルウェアがありますか?あるいは、このスキームでCSRFを有効にするためには、別のアプローチが必要ですか?