Автор Чираг Арора

Фон

Phyllo — это шлюз данных для доступа к данным авторов с сотен исходных платформ, таких как YouTube, Twitter, TikTok, SubStack, Discord, Twitch, OpenSea, Shopify и других. Phyllo строит базовую инфраструктуру, которая подключается к каждой платформе создателя, поддерживает поток данных в реальном времени в системы, используемые этими платформами для управления данными создателя, и предоставляет нормализованный набор данных, чтобы предприятия могли использовать данные создателя простым, но эффективным способом. .

Разработчики интегрируют Connect SDK от Phyllo в свои веб-приложения, чтобы авторы с разных платформ могли подключаться к аккаунту. Создатели при подключении дают согласие на получение данных с этих платформ, а затем Phyllo синхронизирует данные для каждого создателя с этих платформ и передает их разработчикам.

Этот SDK интегрируется через JS-скрипт, который включается в тег скрипта веб-приложения, обеспечивая загрузку последней версии с быстрой CDN.

Постановка задачи

Когда разработчики интегрировали Phyllo SDK в свое веб-приложение, чтобы разрешить процесс подключения учетной записи для своих пользователей (создателей), поток перенаправлялся на страницу конкретного домена Phyllo с домена веб-сайта разработчиков. После завершения подключения учетной записи поток был перенаправлен обратно на веб-страницу разработчика с информацией о подключенных/отключенных учетных записях через Webhooks с нашего внутреннего сервера.

У этого потока были некоторые проблемы как для наших разработчиков, так и для создателей:

  1. Для конечных пользователей/создателей. Перенаправление из приложения разработчика в Phyllo заставляло создателей немного беспокоиться о подключении своих учетных записей, и у них были сомнения по поводу обмена своими данными.
  2. Для разработчиков . Поток перенаправления приводит к увеличению количества загрузок страниц, кликов, перенаправлений из веб-приложения и т. д., и разработчикам приходится ждать, пока создатель завершит путешествие по Connect SDK, прежде чем они смогут получить информацию. о том, что произошло в SDK. Более того, у разработчиков не было большого контроля над такими сценариями, как обработка ошибок, отображение некоторых сообщений пользовательского интерфейса при сбоях подключения и т. д.

Решение

Изучив некоторые инструменты отраслевых стандартов, справочные материалы и процесс подключения, мы разработали и создали поток проверки подлинности всплывающих окон на основе модального iframe в нашем SDK для подключения к учетной записи.

В этом потоке Phyllo SDK встраивается как модальное окно в веб-приложение разработчика, а подключение учетной записи OAuth к платформам происходит в синхронном всплывающем окне. Мы установили кросс-браузерную связь между модальным и всплывающим окном OAuth, чтобы завершить процесс подключения учетной записи беспроблемным и безопасным способом.

1. Встраивание модального окна: архитектура высокого уровня

Фрагмент кода для добавления модального окна в HTML-код разработчика:

В приведенном ниже коде (в Javascript) используется свойство document, и его можно использовать для присоединения модального окна в веб-приложении. Здесь модальное окно появляется, если пользователь выполняет openModal().

const openModal = (url) => {  
  var modalContainer = document.createElement("div"); // 
  var iFrame = document.createElement("iframe");
  iFrame.src = url;      // URL of Phyllo SDK to open
  iFrame.width = "100%";
  iFrame.height = "100%";
  iFrame.allowtransparency = "true";
  iFrame.style.border = "none";
  // Adding stylesheet for displaying Modal
  var styleSheet = document.createElement("style");
  styleSheet.innerText = `
  {
    position: fixed; /* Stay in place */
    z-index: 2147483647; /* Sit on top */
    /* padding-top: 100px; Location of the box */
    left: 0;
    top: 0;
    width: 100%; /* Full width */
    height: 100%; /* Full height */
    overflow: auto; /* Enable scroll if needed */
  }`;
  document.head.appendChild(styleSheet);   // attaching css stylehseet to head tag of parent div
  modalContainer.appendChild(iFrame);       // attaching iFrame to phyllo's parent div
  document.body.appendChild(modalContainer);// attaching modal to developer's div
  modalContainer.style.display = "block";    
};
openModal(url);

Как только мы добавили код в сценарий CDN, SDK Phyllo открылся как модальное окно в окне разработчика. Это решило некоторые основные проблемы для нас:

  • SDK открывается в iframe HTML, который ограничивает междоменное взаимодействие. Это означает, что только JS, контролируемый Phyllo, может взаимодействовать с iframe, тем самым снижая риски безопасности и, как следствие, обеспечивая доверительные отношения с конечными пользователями/создателями.
  • Этот поток также позволяет Phyllo Connect SDK генерировать собственные события в режиме реального времени, которые могут использоваться приложением разработчика для отображения соответствующего пользовательского интерфейса и обмена сообщениями с создателями, не дожидаясь веб-перехватчиков, доставленных через серверную часть.
  • С технической точки зрения этот поток также предлагает множество оптимизаций, таких как уменьшение количества сетевых вызовов и загрузок страниц, тем самым уменьшая количество возможных точек отказа.

2. Обработка потока OAuth во всплывающем окне:

Для завершения потока подключения пользователям необходимо подключиться к своим учетным записям через поток OAuth, что необходимо сделать во всплывающем окне/новой вкладке.

Для этого мы открыли окно OAuth с URL-адресом во всплывающем окне или на новой вкладке и включили безопасную межбраузерную связь через «iframe» и всплывающее окно для успешной передачи статуса подключения.

Архитектура: кросс-браузерная связь

Фрагмент кода, обеспечивающий указанный выше поток подключения:

// In Phyllo SDK (opened in iFrame)
const callback = (event) => {
  // code to execute post popup action 
} 
window.addEventListener("message", callback, false);
let windowPopup = window.open(url);// url to open in popup

// In oAuth popup 
// After connection
window.opener.postMessage(statusObject) // for sending the statusObject to the event listener callback
window.close();
                        
// postMessage executes the callback function with the statusObject enabling the cross browser transfer

Проблемы, с которыми столкнулись и решение:

  1. Блокировка всплывающих окон. Мы видели, что многие пользователи и некоторые браузеры не позволяют открывать всплывающие окна; это мешало потоку соединения и приводило к сбоям соединения с учетной записью.

Решение.Мы определили сценарий, в котором браузеры блокировали открытие всплывающего окна, и открыли его в новой вкладке с помощью приведенного ниже фрагмента кода:

let windowPopup = window.open(url); // default behaviour
if (windowPopup === null || windowPopup === "undefined") {
  windowPopup = window.open(url, "_blank"); // "blank" opens the sent url in a new tab always
}

2. Безопасность. Включение межбраузерной связи через iframe и всплывающее окно сделало его уязвимым для атак с использованием межбраузерных сценариев. Например, любой сторонний инструмент может инициировать обратный вызов, выполнив прослушиватель событий ( ​​window.addEventListener("message", callback)). Phyllo SDK может выполнять код, не относящийся к Phyllo, и попадать в некоторые опасные и необработанные сценарии, влияя на поток соединений.

Решение. Добавьте проверку домена в обратный вызов, чтобы убедиться, что триггер события срабатывает только из вашего домена.

Заключение

Использование Phyllo SDK внутри iframe и включение процесса подключения учетной записи через всплывающее окно помогло значительно улучшить взаимодействие с пользователем для наших конечных пользователей/создателей. В целом наши показатели успешного подключения подскочили почти на 37%. Это также решило проблемы для наших разработчиков, интегрировавших Phyllo SDK, теперь мы можем предоставлять им обновления подключения/отключения учетной записи в режиме реального времени в пользовательском интерфейсе через обратные вызовы, которые они могут использовать для визуализации и улучшения общего пользовательского интерфейса для конечных пользователей. .