Как я могу прекратить отправку предварительного запроса на перенаправление? - PullRequest
0 голосов
/ 26 марта 2019

Я обнаружил, что шесть лет назад предыдущий разработчик прокомментировал эту строку кода (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?

1 Ответ

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

Чтобы избежать предварительного запроса, вы должны удалить заголовок x-required-with, но у вас есть ошибка, потому что расположение ответа в предварительном вызове отличается от источника. Чтобы устранить проблему, обновите свой код, чтобы использовать новый URL-адрес в соответствии с сообщением о перенаправлении, тем самым избегая перенаправления.

...