Access-Control-Allow-Origin на одном маршруте Rails

ruby-on-rails ruby-on-rails-4 cors

3416 просмотра

3 ответа

В моем приложении на Rails я создаю функцию, которая позволяет пользователям вставлять данные из приложения на другие сайты с использованием фрагмента Javascript.

Мой фрагмент JavaScript делает запрос GET к маршруту в моем приложении rails, которое возвращает необработанный JSON. Когда сниппет и JSON совместно используют один и тот же домен, все работает хорошо, но у меня возникают проблемы с CORS, когда я встраиваю сниппет в другой сайт.

Используя найденное здесь решение , я начал настраивать приложение Rails для CORS.

По моему application_controller.rb:

before_filter :add_allow_credentials_headers

def add_allow_credentials_headers
    response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'   
    response.headers['Access-Control-Allow-Credentials'] = 'true'
end 

def options
    head :status => 200, :'Access-Control-Allow-Headers' => 'accept, content-type'
end

По моему routes.rb:

get 'embed_json' => 'application#options', :via => [:options]

Однако, когда я нажимаю на вышеуказанный маршрут в своем браузере, приложение больше не возвращает объект JSON - просто пустой экран.

Похоже, существует ряд противоречивых подходов к тому, как лучше всего обрабатывать CORS на одном маршруте Rails. Есть ли способ Rails для удовлетворения этого требования?

Автор: Cameron Scott Источник Размещён: 08.11.2019 11:28

Ответы (3)


2 плюса

Решение

Вызов headне вернет JSON по определению . Хэш параметров, когда вы вызываете его, headбудет преобразован в заголовки.

Попробуйте вместо этого, optionsвызов при необходимости даст заголовки с пустым телом ответа. Вызов indexдолжен отображать JSON вместе с заголовками, установленными в add_allow_credentials_headersфильтре.

def add_allow_credentials_headers
  response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'   
  response.headers['Access-Control-Allow-Credentials'] = 'true'
  response.headers['Access-Control-Allow-Headers'] = 'accept, content-type'
end 

def options
  head :ok
end

def index
  # do something here that renders a JSON response
end

Кроме того, другой вариант для включения CORS в вашем приложении rails - это стеллажи , которые могут делать то, что вам нужно, без лишних хлопот.

Автор: Jeff Wigal Размещён: 23.08.2016 03:30

1 плюс

Добавьте status: :okк сырому JSON, который вы возвращаете. Если вы возвращаете пустое тело, добавьте, head :okчтобы вернуть статус 200

Чтобы включить только optionsметод CORS для метода, вы можете сделать следующее:

before_filter :add_allow_credentials_headers, only: [:options]

def add_allow_credentials_headers
  response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*' # the domain you're making the request from
  response.headers['Access-Control-Allow-Credentials'] = 'true'
  response.headers['Access-Control-Allow-Headers'] = 'accept, content-type'
end 

def options
  # your json response here or just 'head :ok' if empty 200 response
end
Автор: tekina Размещён: 23.08.2016 07:13

1 плюс

Установите этот драгоценный камень:

gem 'rack-cors', :require => 'rack/cors'

Затем добавьте это в файл config / application.rb.

module YourApp
  class Application < Rails::Application

    # ...

    # Rails 3/4

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

    # Rails 5

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

  end
end

это сделает трюк подробнее. Корс

Автор: Alex Onozor Размещён: 29.08.2016 12:07
Вопросы из категории :
32x32