Я обнаружил, что шесть лет назад предыдущий разработчик прокомментировал эту строку кода (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
. Но я не знаю, как решить эту проблему.
EATA:
Many JavaScript frameworks such as JQuery will automatically send this header along with any AJAX requests. This header cannot be sent cross-domain:
Полагаю, мой единственный вариант - выяснить, как переписать это без AJAX?