RailsのAPI onlyでOmniAuthがエラる

RailsAPI onlyのアプリケーションだとセッションが無効化されているのでOmniAuthを使おうとするとOmniAuth::NoSessionErrorで落ちる。

READMEに書いてあった。 https://github.com/omniauth/omniauth/blob/650943c16de33c7cdf16708b74766e95ad369610/README.md#integrating-omniauth-into-your-rails-api

config/application.rbとかにこんな感じの設定を足せばよいらしい。

config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies # Required for all session management
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options

OmniAuthがセッションを必要とする理由は、ログイン前のURLとかparamsを保存してcallbackフェーズで復元できるようにしているためっぽいので、これらが必要ない場合はセッション無効でも動くようにしたいなと一瞬思った。

が、omniauth-oauth2はstateというパラメータを保存するのにセッションを使っていて、これはOAuthプロバイダへのリクエストパラメータにstateを渡すことでcallbackにもそのstateを渡してくれ、その値をアプリケーション側でセッションなりに保存しておいて検証することでCSRFを防ぐというものらしい。

https://auth0.com/docs/protocols/oauth2/oauth-state

この検証機構も無効にすることはできるけど、そこまでしてセッションを無効にするモチベーションもないので諦めてAPI onlyでもセッションを有効にすることにした。