0

У меня есть страница на http://localhost:3000, которая содержит iframe, src is http://localhost:3010/login. IFRAME делает следующее:Один iframe случайно не работает XHR

  • Запросы src html.
  • После получения перенаправления 302, он следует за ним http://localhost:3000/oauth/authorize?response_type=code&client_id=1&redirect_uri=http%3A%2F%2Flocalhost%3A3011%2Fauthorization_code&state={state}.
  • IFrame затем перенаправляется обратно в исходное состояние: http://localhost:3010/authorization_code?code={code}&state={state}.
  • Сервер приложения, внедренный iframe, успешно обменивает код авторизации для токена доступа и перенаправляет на http://localhost:3010 с файлом cookie, установленным в OAuth2 access_token.
  • Некоторые JavaScript-код делает XHR равным http://localhost:3010/api/customerInfo.
  • Информация о клиенте возвращается и отображается в iframe с использованием JavaScript.

Так что все это работает отлично.

Однако, когда я добавить второй IFrame встраиваемого приложения со своим собственным происхождением localhost:3020, которая проходит через тот же поток, один из первых XHR приложений будет неудачно со следующей ошибкой:

XMLHttpRequest cannot load http://localhost:3000/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3011%2Fauthorization_code&state=17nCw5o0Tr11Y6z8&client_id=1 . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:3010 ' is therefore not allowed access. The response had HTTP status code 400.

кажется немного странным, потому что он говорит, что не может загрузить URL-адрес через XHR, который он уже загрузил с помощью перенаправления.

Иногда один iframe терпит неудачу, а иногда и другой. Каждый раз и в каждом браузере один iframe может выполнить XHR, другой вызывает эту ошибку. Я даже задерживал исходный XHR iframes в разных количествах, чтобы они не перекрывались, но безрезультатно.

Фрагменты iframe генерируются динамически (через React) и имеют этот атрибут: sandbox='allow-forms allow-scripts allow-same-origin'.

ответ

0

Это связано с тем, что файлы cookie не являются определенными для порта, в отличие от политики того же происхождения, которая считает номер порта частью исходного кода. В этом случае оба фрейма использовали файлы cookie, и оба использовали access_token как имя файла cookie, содержащего токен доступа OAuth. Второй iframe для завершения процесса авторизации перезапишет первый файл cookie iframe access_token, в результате чего последующие вызовы iframe из последнего iframe будут терпеть неудачу. Я исправил это, используя уникальные имена файлов cookie. Альтернативным решением будет использование разных имен хостов и редактирование файла хостов компьютера.

 Смежные вопросы

  • Нет связанных вопросов^_^