web-dev-qa-db-ja.com

Rails 5.1 CORS-異なる環境に異なるオリジンを設定する方法

Rail-5.1 APIでrack-cors gemを使用しています。

ドキュメントに従って、次のイニシャライザを持っています。

config/initializers/cors.rb

module Api
  Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
      origins ['http://localhost:4200','https://app.mydomain.com/']

      resource '*',
        headers: :any,
        :expose  => ['access-token', 'expiry', 'token-type', 'uid', 'client'],        
        methods: [:get, :post, :put, :patch, :delete, :options, :head]
    end
  end
end

ただし、これは、本番環境にデプロイすると、私のAPIがすべてのlocalhost:4200起源。

これらの設定をどのように分離して、異なる環境が異なる許可されたオリジンを持つことができますか?

9
rmcsharry

いくつかの異なるオプションがあります。 1つはsecrets.ymlファイル。そこで、環境ごとに異なる値を定義できます。

development:
  allowed_origins:
    - http://localhost:4200

production:
  allowed_origins:
    - http://productionurl1.com
    - http://productionurl2.com

次に、構成ファイルで行うことができます

module Api
  Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
      origins Rails.application.secrets.allowed_origins
    end
  end
end

別のオプション(コメントから取得)は、環境ファイルを使用することです。例:

development.rb

config.allowed_cors_origins = ["http://localhost:4200"]

次に、cors.rbイニシャライザでできること:

Rails.application.config.allowed_cors_origins 

(初期化子は環境設定ファイルの後に呼び出されるため、これは機能するはずです)。

11
Gregory Witek

Rails 5.2、を使用している場合は、secrets.ymlが変更されたため、認証情報を使用する必要があります。これを使用するには、config/credentials.yml.encを編集する必要があります。まず、コマンドEDITOR="atom --wait" Rails credentials:edit(選択したエディターを使用)次に、 受け入れられた回答 が示唆するようにオリジンを追加します。

development:
  allowed_origins:
   - http://localhost:4200

production:
  allowed_origins:
   - http://productionurl1.com
   - http://productionurl2.com

ファイルを保存します。これで、許可されるorigins変数が暗号化されたファイルに含まれます。そして、cors初期化子(私の場合はapplication.rbにありました)

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins Rails.application.credentials[Rails.env.to_sym][:allowed_origins]
    resource '*',
    headers: :any,
    expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],
    methods: [:get, :post, :options, :delete, :put]
  end
end
4
gumlym