Я обнаружил, что шесть лет назад предыдущий разработчик закомментировал эту строку кода (Ruby, Rails):
#protect_from_forgery
Я заменил его на значение по умолчанию:
protect_from_forgery with: :exception
и теперь я загадочным образом получаю следующую ошибку, когда пытаюсь добавить товары в корзину, не выходя из системы:
Access to XMLHttpRequest at 'https://id.foo-staging.com/openid/checklogin?return_to=http%3A%2F%2Flocalhost.foo-staging.com%3A3000%2Fcart%2Fitems' (redirected from 'http://localhost.foo-staging.com:3000/cart/items') from origin 'http://localhost.foo-staging.com:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
Я определил, что это происходит из-за следующих строк:
def get_user_identity_from_open_id_server
redirect_to "#{OPEN_ID_PROVIDER_URL}/openid/checklogin?return_to=#{Rack::Utils.escape(request.url)}"
end
def open_id_authentication
#stuff
get_user_identity_from_open_id_server
end
before_filter :open_id_authentication
Я понимаю, что вызывает предварительный запрос на очень высоком уровне, благодаря документации. Но я не думаю, что делаю что-то из этого.
* the request method is anything other than GET, HEAD, or POST
* you’ve set custom request headers other than Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, or Width
* the Content-Type request header has a value other than application/x-www-form-urlencoded, multipart/form-data, or text/plain
Итак, мой первоначальный вопрос заключается в том, как определить, что вызывает предварительный запрос, а затем, возможно, я смогу выяснить, как предотвратить это. Могу ли я изменить эту ситуацию со своей стороны, или нужно что-то изменить на id.foo-staging.com (к которому у меня нет доступа, но, вероятно, я мог бы попросить нужного человека исправить это для меня).
Я гуглил весь день, и мне кажется, что ничего не имеет смысла, особенно потому, что я не могу точно определить, что не так.
Я могу решить проблему с помощью этого кода:
skip_before_filter :open_id_authentication, :only => [:create], :if => :current_user and :anonymous_cart
Но я должен предположить, что это небезопасно с точки зрения безопасности?
ETA: вот что я вижу на вкладке Network для этого запроса:
Общий:
Request URL: https://id.foo-staging.com/openid/checklogin?return_to=http%3A%2F%2Flocalhost.foo-staging.com%3A3000%2Fcart%2Fitems
Referrer Policy: no-referrer-when-downgrade
Заголовки запроса:
Provisional headers are shown
Access-Control-Request-Headers: x-requested-with
Access-Control-Request-Method: GET
Origin: http://localhost.foo-staging.com:3000
Referer: http://localhost.foo-staging.com:3000/p/Product0/1?id=1&slug=Product0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Параметры строки запроса:
return_to: http://localhost.foo-staging.com:3000/cart/items
Я предполагаю, что проблема в заголовке запроса x-requested-with. Но я не знаю, как это решить.
ЕАТА:
Many JavaScript frameworks such as JQuery will automatically send this header along with any AJAX requests. This header cannot be sent cross-domain:
Я предполагаю, что мой единственный вариант - выяснить, как переписать это без AJAX?





Чтобы избежать предварительного запроса, вы должны удалить заголовок x-requested-with, но ошибка, которая у вас есть, связана с тем, что местоположение ответа в предварительном вызове отличается от источника. Чтобы решить эту проблему, обновите свой код, чтобы использовать новый URL-адрес, указанный в перенаправлении, тем самым избегая перенаправления.
Как он может использовать URL-адрес перенаправления, если браузеры не позволяют использовать ответ?
Чтобы определить, что запускает предварительный запрос, используйте панель «Сеть» в инструментах разработки браузера, чтобы изучить запрос OPTIONS и посмотреть значение заголовка запроса Access-Control-Request-Headers.