Rails 5.2 CORS заблокирован

заранее спасибо всем, кто может помочь мне с этим!!

Я запускаю приложение Rails 5.2 с React и Webpacker, и я хочу отображать значок Gravatar для своих пользователей, когда они вошли в систему, но я продолжаю блокироваться браузером CORB.

Я просмотрел всю документацию Rack CORS и записи Stack Overflow о настройке рельсов с помощью CORS, но до сих пор не могу заставить его работать. Я не вижу allowed-origins в своих заголовках, а запросы к Gravatar.com продолжают блокироваться.

Я настроил свой config/credentials.yml.enc с моими именами хостов, как указано в https://stackoverflow.com/a/56772510/759615:

development:
 allowed_origins:
   - http://localhost:3000
   - http://127.0.0.1:3000

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

application.rb:

  class Application < Rails::Application

    config.load_defaults 5.2

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins Rails.application.credentials[Rails.env.to_sym][:allowed_origins]

        resource '*',
                 headers: :origin,
                 methods: [:get, :post, :options, :put]
      end
    end
  end

Я также попробовал полностью открытую конфигурацию для CORS в application.rb просто для проверки концепции:

...
     allow do
        origins '*'
    ...

а для локальной среды я установил заголовки для dev_server в config/webpacker.yml

      'Access-Control-Allow-Origin': 'http://localhost:3000/'

(где я также пробовал имя хоста Webpacker, 127.0.0.1, безрезультатно)

Есть много переменных, и я, вероятно, что-то пропустил или, что более вероятно, неправильно понял значение в документации, но я действительно надеюсь, что у кого-то есть ответ CORS, который я ищу!


person GLaDOS    schedule 02.09.2019    source источник


Ответы (2)


Я использую Rack::Cors в своем проекте без переменных:

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:5000', /https*:\/\/.*?domain\.(com|org)\/*/, /https:\/\/another_domain\.my_domain\.org/
    resource '*', headers: :any, methods: :any, credentials: true
  end
end

И это работает отлично.

person mechnicov    schedule 02.09.2019
comment
@GLaDOS Вы использовали credentials: true? - person mechnicov; 02.09.2019
comment
@mechincov, да, после вашего комментария я перепробовал все, что у вас было в настройках Rack::Cors, прежде чем ответить. - person GLaDOS; 03.09.2019

При плохой реализации, когда все соединения открыты в промежуточном программном обеспечении (так называемое исходное соединение с подстановочными знаками установлено на « * »), вы можете получить ошибку безопасности:

'initialize': Allowing credentials for wildcard origins is insecure. 
Please specify more restrictive origins or set 'credentials' to false
in your CORS configuration. (Rack::Cors::Resource::CorsMisconfigurationError)

Вы можете использовать регулярное выражение для установки правильных разрешений:

use Rack::Cors do
allow do
  # regular expressions can be used here
  origins 'localhost:3000', '127.0.0.1:3000', /\Ahttp:\/\/192\.168\.0\.\d{1,3}(:\d+)?\z/

  resource '/file/list_all/',
    headers: 'x-domain-token'

  resource '/file/at/*',
    methods: [:get, :post, :delete, :put, :patch, :options, :head],    
    headers: 'x-domain-token',
    # headers to expose  
    expose: ['Some-Custom-Response-Header'],
    max_age: 600
end

Посмотрите документацию rack-cors и найдите другие примеры.

person avivamg    schedule 02.12.2019