RailsでCORS設定をしてみる!

Ruby on Rails
クローバー
クローバー

access-control-allow-originっていうエラーが出た。。。

RailsをAPIとして利用する場合に、「access-control-allow-origin」というエラーが出てきました。

「access-control-allow-origin」を解消するためには、CORSを設定しないとダメだということで、その設定方法について今回は紹介していきます。

CORSとは?

オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。ウェブアプリケーションは、自分とは異なるオリジン (ドメイン、プロトコル、ポート番号) にあるリソースをリクエストするとき、オリジン間 HTTP リクエストを実行します。

https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

簡単に説明すると、違うリソースから通信を投げたときに対応するかどうかって感じです。

例えば、RailsをAPI、frontをVueに設定しているとします。

お互い違うリソースであるため、通常はVueからRailsにGET通信を投げても「access-control-allow-origin」とエラーが出てしまいます。

しかし、CORS設定を行っておくと、VueからRailsにGET通信を行うときエラーが出ることなく、レスポンスを返すことができるようになるのです。

CORSの設定方法

CORSはRails側で設定します。

gemの導入

便利なgemがあるので、それを使いましょう。

gem 'rack-cors'

cors.rbの設定

gemを入れると自動で、config/initializersにcors.rbというファイルが出来るので、そこにとりあえず以下のコードを貼り付けてみましょう

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "*"

    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

上記のコードはすべてのオリジンからのリクエストを受け付けるという設定です。

特定のオリジンだけ(‘localhost:8080’と’https://www.sample.com’から)にしたいという場合は、以下のように設定してあげましょう。

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:8080','https://www.sample.com'


    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

あとは、Dockerを利用している場合はコンテナを起動し直せば適用されるかと思います。

クローバー
クローバー

これで通信はバッチリだ!

参考サイト

オリジン間リソース共有 (CORS) - HTTP | MDN
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアク...
CORSがよくわからないので解説してみた&Rails APIでのCORS設定 - Qiita
##はじめにRailsでAPIを作っていますが、CORSの設定を行う必要がありました。そもそもCORSについてわかっていなかったので、CORSについてと、RailsでのCORS設定について説明して…

コメント

  1. Robertbleah より:

    Thanks for the complete information. You helped me.