Ошибка FedCM и GSI: форма авторизации закрывается при клике

    При интеграции Google Sign-In (GSI) на сайте разработчики нередко сталкиваются с ситуацией: после инициализации формы любой клик на странице приводит к её закрытию с ошибкой в консоли: The request has been aborted и [GSI_LOGGER]: FedCM get() rejects with AbortError: signal is aborted without reason. Это происходит из-за особенностей работы Federated Credential Management (FedCM) - нового API от Google, который заменил сторонние cookie и iFrame.

    Почему возникает AbortError при клике на странице?

    FedCM использует AbortController для управления запросами к браузеру. Когда пользователь кликает в любом месте документа, браузер может автоматически отменять (abort) активный запрос FedCM, если он считает, что взаимодействие с пользователем завершилось. Это защитный механизм, предотвращающий фоновый сбор данных. В вашем случае проблема усугубляется тем, что скрипт GSI загружается с задержкой (setTimeout), и к моменту его активации контекст страницы уже нестабилен.

    Как исправить интеграцию Google Sign-In?

    1. Уберите динамическую вставку скрипта через setTimeout

    Загрузка GSI через setTimeout с задержкой 1 секунда (в вашем коде) нарушает жизненный цикл FedCM. Лучше подключать скрипт статически в или сразу при загрузке DOM:

    <script src="https://accounts.google.com/gsi/client" async defer></script>

    2. Используйте правильный контейнер для кнопки

    Вместо динамического создания div#g_id_onload лучше разместить элемент заранее в HTML и инициализировать через google.accounts.id.initialize():

    <div id="g_id_onload" data-client_id="YOUR_CLIENT_ID" data-context="signin" data-login_uri="YOUR_URI" data-auto_select="false"></div>

    3. Откажитесь от условной загрузки по cookie

    Проверка checkCookie('Device') может приводить к тому, что GSI инициализируется в неподходящий момент. Рекомендуется всегда подгружать библиотеку, а показывать форму только при необходимости через CSS или JavaScript.

    Дополнительные причины ошибки FedCM

    • Несколько одновременных запросов FedCM: если на странице есть другие вызовы FedCM (например, от других сервисов), они могут конфликтовать.
    • Блокировка браузером: Chrome может блокировать FedCM в режиме инкогнито или при определённых настройках конфиденциальности.
    • Устаревшая версия GSI: используйте последнюю версию библиотеки (актуальная - 1.0.1).

    Пример корректной реализации

    Вставьте следующий код в или перед закрывающим </body>:

    <script src="https://accounts.google.com/gsi/client" async defer></script>
    <div id="g_id_onload" data-client_id="YOUR_CLIENT_ID" data-context="signin" data-login_uri="YOUR_URI" data-auto_select="false"></div>
    <script>
    window.onload = function() {
    google.accounts.id.initialize({
    client_id: 'YOUR_CLIENT_ID',
    callback: handleCredentialResponse
    });
    google.accounts.id.renderButton(
    document.getElementById('buttonDiv'),
    { theme: 'outline', size: 'large' }
    );
    };
    </script>

    Если ошибка сохраняется, проверьте консоль браузера на наличие других предупреждений FedCM и временно отключите расширения, которые могут перехватывать события клика.

    Часто задаваемые вопросы