Как настроить React API-прокси в любом месте кода - PullRequest
1 голос
/ 19 марта 2019

У меня проблемы с настройкой CORS с моим Rails API в CloudAnywhere.

Я пытаюсь настроить интерфейс React и сервер Rails в двух отдельных контейнерах CloudAnywhere.(Давайте назовем их rails.codeanyapp.com и react.codeanyapp.com.)

Для внешнего интерфейса React настроен прокси-сервер для Rails (т. Е. "proxy": "https://rails.codeanyapp.com" in package.json).

Серверная часть Rails имеет следующий код в config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://react.codeanyapp.com/'

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

GET-запросы работают нормально.Однако, когда я делаю POST, я получаю следующую ошибку в Rails

Started POST "/authors.json" for 104.42.117.130 at 2019-03-19 13:05:52 -0400
Cannot render console from 104.42.117.130! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by AuthorsController#create as JSON
  Parameters: {"fname"=>"James", "lname"=>"madison", "email"=>"james@madison.com", "author"=>{"fname"=>"James", "lname"=>"madison", "email"=>"james@madison.com"}}
HTTP Origin header (https://rails.codeanyapp.com) didn't match request.base_url (https://react.codeanyapp.com)
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

Обратите внимание, что CodeAnywhere настроен так, что общедоступный URL-адрес равен https://rails.codeanyapp.com, даже если сервер фактически работает на порте 3000. Яподозреваю, что проблема на стороне Rails, когда входящий порт "переадресован" до 3000;но я не думаю, что у меня есть привилегии для изменения этого поведения.

Обратите также внимание, что как Origin, так и base являются https.(Большинство других сообщений об этой проблеме, когда один http, а другой https.)

1 Ответ

0 голосов
/ 20 марта 2019

Основная проблема в том, что я стал ленивым и попытался просто выбросить json рендеринг в существующий контроллер. (В частности, я добавил блок respond_to к существующему контроллеру, который является подклассом ApplicationController.) Проблема в том, что по умолчанию Rails добавляет CSRF и другое промежуточное ПО, которое не применяется так чисто к API ,

Правильным решением является создание отдельного контроллера, который наследуется от ApplicationController::API Объединение API и веб-представлений в Rails 5

Быстрое и грязное решение состояло в том, чтобы отключить CSRF для вызовов API, добавив protect_from_forgery unless: -> { request.format.json? } к application_controller.rb

...