Загрузка междоменного iframe в частном браузере выводит пользователя из системы - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю с клиентом, где я делаю небольшой выделенный сайт на поддомене. Они хотят, чтобы я использовал их API, чтобы сделать простой пост-запрос, когда пользователь нажимает кнопку, но клиент не хочет, чтобы пользователь снова входил в систему, а хочет, чтобы он использовал токен доступа с основного сайта. Поэтому я попросил их инженеров добавить ответ на postMessage из моего субдомена с токеном доступа

Структура домена будет такой:

Site1 - https://www.example.com

Site2 - https://sub.example.com

и очень простой пример того, что у меня есть и что у них есть:

//set the src of the iframe
$("#main-site-iframe").attr("src", "https://www.example.com");
//wait for the main site page to open
$("#main-site-iframe")[0].onload = () => {
    //my page posts a message to their site
    $("#my-iframe")[0].contentWindow.postMessage("jwt", "https://www.example.com");  
};
//their site listens for a request
window.addEventListener('message', tokenRequest, false);
function tokenRequest(e) {
    //make sure the request is from the correct subdomain
    if(e.origin == 'https://sub.example.com')
    {
        //respond with the access token
        e.source.postMessage(authJWT, e.origin);
    }
}

Обычно шаги go примерно так:

  • Вход на сайт1
  • Нажмите кнопку, которая загружает сайт2
  • Сайт2 загружает фрейм, в котором есть сайт1
  • Поскольку пользователь уже вошел в Site1, он уже вошел в сайт внутри iframe
  • Site2 делает postMessage для получения jwt
  • Site1 отвечает jwt
  • Все работало правильно, теперь у нас есть jwt, поэтому мы можем использовать API

В обычных условиях это все работает правильно, но по некоторым причинам это не работает в частных браузерах.

  • Вход на сайт1
  • Нажмите кнопку, которая загружает сайт2
  • Сайт2 загружает фрейм, в котором есть сайт1
  • Загруженный сайт1 НЕ имеет пользователь, вошедший в систему
  • Site2 выполняет postMessage и получает ложный ответ, потому что они не вошли в систему
  • Я перенаправляю на экран входа в систему Site1, потому что я предполагаю, что они действительно вышли из системы

Каким-то образом загрузка iframe приводит к тому, что пользователь полностью выходит из системы (переход на домашнюю страницу в другой вкладке показывает, что пользователь фактически вышел из системы)

Странность в том, что это только происходит в первый раз в приватном окне, и если пользователь повторяет первые несколько шагов снова, во второй раз страница работает правильно (если они не закрывают приватный браузер и не запускаются заново). Поэтому, если вы выполните это, он будет работать правильно

  • Вход на сайт1
  • Нажмите кнопку, которая загружает сайт2
  • Сайт2 загружает фрейм, в котором есть сайт1
  • Загруженный сайт1 НЕ работает ave пользователь вошел в систему
  • Site2 выполняет postMessage и получает ложный ответ, потому что они не вошли в систему
  • Я перенаправляю на экран входа в систему Site1, потому что я предполагаю, что он фактически вышел из системы
  • Вход в Site1 СНОВА
  • Нажмите кнопку, которая загружает Site2
  • Site2 загружает фрейм, в котором находится Site1
  • Поскольку пользователь уже вошел в Site1 , они уже зарегистрированы на сайте внутри iframe
  • Site2 делает postMessage для получения jwt
  • Site1 отвечает jwt
  • Все работает правильно

Есть ли что-то, чего мне не хватает в postMessage, о котором я не знаю, или что-то еще? Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2020

Оказывается, что поведение было вызвано некоторыми назад и вперед с http против https. Серверы dev не имеют ssl-сертификата, поэтому это никогда не было проблемой (он всегда использовал http), а промежуточный сервер делает, но он не применяется (поэтому он может переключаться между http и https). производство принудительно применяет https, оно просто не удалось при постановке, потому что https не применяется.

Поскольку браузер обрабатывает http и https как отдельные страницы, токен сеанса не находился в локальном хранилище с другой, в зависимости от того, какая страница вошла первой. Это было примерно так:

Login to Site1 on https
Press a button that loads Site2 on http
Site2 loads an iframe that has Site1 but in http
Loads Site1 in http does NOT have the user logged in
Site2 does a postMessage and gets a response of false because they are not logged in
Redirect to Site1's Login Screen but this time on http
User logs in again on http not https
Press a button that loads Site2 on http
Loads Site1 in http and DOES have the user logged in this time
Everything works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...