railsをエンドポイントを作成をしていて沼ったところと、どうやってそれを解決したのかを残しておきます
沼ったポイントとしてはrailsのcorsの設定です
railsのcorsの設定
どこで沼ったのか
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS)において、Rails APIではrack-corsというgemを使用していました。
CORSについての詳しい知識はありませんでしたが、
- 許可をしたいAPIを叩く側のドメイン
- 許可をしたいリソースファイル
- 許可をしたいHTTPヘッダー
- 許可をしたいHTTPメソッド
を設定する必要があるということは認識していました。
便利なgemに感謝しつつフロントエンドの実装を進めていたところ、ログイン用のAPIを叩いたときにsession idがcookieに保管されていないことに気がつきました。
どうすれば良かったのか
こちらの記事によると、どうやらcredentials: true
という設定をしないとレスポンスのSet-Cookie
にCookieがセットされないため、フロントがCookieの取得ができないそうです。
よって./config/initializers/cors.rb
は下記のようになります。
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins(['localhost', /localhost:\d+\Z/, /(.+).local.example-dev.com\Z/])
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head],
credentials: true
end
end
credentials: true
の部分を記述していないがために数時間も溶かしてしまいました...
また、railsではありませんが、フロント側でも自身のドメインのCookie値を設定するためにwithCredentials
をtrue
にする必要があるそうです。(ここに書いてあった。
CORSについて全く理解ができていないなと反省しました...
セキュリティに関する知識がないといつかやらかす気がするのでしっかり勉強しようと思います。