Rails 5.1 CORS-如何为不同环境设置不同的起源



我使用的是带有导轨5.1 API的机架cos。

我根据文档具有以下初始化器:

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 Origin的请求。

如何将这些设置分开,以便不同的环境可以具有不同的允许原始?

有一些不同的选项。一种是使用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 

(由于环境配置文件后将调用初始化器,因此应起作用(。

对于使用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

保存文件。现在,允许的原始变量将在加密文件中。然后在CORS Initializer中(在我的情况下是在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

最新更新