概要
RailsでAPIを使用するときに、セッション等でCookieを使いたくなる時があると思います。調べるとけっこう記事が出てくると思いますが、何種類か対応方法があるみたいで、今回はRails6でも上手くいった方法を書きます。
対応
【application_controller.rbの設定】
-
ActionController::Cookies
を読み込みます。記事はrails-apiでcookieを使うを参考にしました。
<<2020/7/31追記>>ActionController::Base
を継承する時のみ以下を設定してください、ActionController::API
を継承するときは不要です。
- CSRFトークンチェックを回避したい場合は
skip_before_action :verify_authenticity_token
で回避してください。protect_from_forgery with: :null_session
だとCookieが使えなくなります。なお、[Rails] CSRFトークンチェックでエラーになるのを回避する方法を参考にしています。
application_controller.rb
class ApplicationController < ActionController::Base
include ActionController::Cookies
skip_before_action :verify_authenticity_token
end
【application.rb】
- 今回は
config.api_only
設定はtrueを前提とします。falseにするとCookieは使えるようになりますが、API利用前提とは少し外れるので。 -
ActionDispatch::Cookies
とActionDispatch::Session::CookieStore
を使用します。Rails の API モードでセッションを有効にするを参考にしました。私の環境だとActionDispatch::ContentSecurityPolicy::Middleware
を使わなくてもCookie使えましたが、環境によっては使う必要があるのかもです。
application.rb
# requireの設定は記載省略しています
module WebApi
class Application < Rails::Application
config.load_defaults 6.0
config.api_only = true
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore
end
end