Плагин HybridAuth V3.13 для Cotonti CMF

HybridAuth — это плагин 2026 года для Cotonti Siena/Verona, который позволяет пользователям регистрироваться и входить на сайт, используя аккаунты популярных социальных сетей и мессенджеров Google, Facebook, Telegram

Опубликовано в: Модули и Плагины для Cotonti

Плагин HybridAuth для Cotonti CMF: социальная аутентификация  version 3.1-3.13.0

HybridAuth — это плагин для Cotonti Siena/Verona, который позволяет пользователям регистрироваться и входить на сайт, используя аккаунты популярных социальных сетей и мессенджеров (Google, Facebook, Telegram, Twitter и любых других провайдеров, поддерживающих OAuth 2.0 / OpenID Connect). Вся авторизация происходит напрямую между сайтом и выбранным сервисом, без участия посредников — ваши данные остаются под вашим контролем.

Cotonti Compatibility PHP MySQL Bootstrap v5.3.8 License

hybridauth-cotonti-by-webitproff

Плагин базируется на релизе v3.13.0 проверенной библиотеке Hybridauth 3.x и адаптирован для Cotonti, повторяя логику оригинального плагина, но с исправлением ошибок и добавлением современных провайдеров (Telegram через OIDC). Исходный код доступен в репозитории: https://github.com/webitproff/hybridauth-cotonti.


Оглавление

  1. Возможности плагина
  2. Как это работает
  3. Установка
  4. Настройка провайдеров
  5. Конфигурация плагина
  6. Интеграция с темой оформления
  7. Авторегистрация и привязка аккаунтов
  8. Логирование и отладка
  9. Структура файлов и хуки
  10. Заключение и ссылки

Возможности плагина

  • Вход / Регистрация через соцсети — одним кликом пользователь попадает на сайт, система автоматически создаёт учётную запись, заполняя профиль данными из социального аккаунта (имя, email, аватар, дата рождения и т.д.).
  • Привязка нескольких провайдеров — в личном кабинете можно подключить несколько соцсетей к одной учётной записи, чтобы входить любым из привязанных способов.
  • Гибкая конфигурация — каждый провайдер включается/отключается отдельно, задаются ключи и область видимости (scope) индивидуально.
  • Авторегистрация (опционально) — при первом входе автоматически создаётся новый пользователь; можно также заблокировать ручную регистрацию и оставить только социальный вход.
  • Совместимость с темами — через шаблонные теги выводятся кнопки входа и панель управления привязанными аккаунтами; легко стилизуется под Bootstrap 5.
  • Генерация читаемого логина — на основе имени из соцсети создаётся чистый URL‑безопасный никнейм (пробелы и спецсимволы удаляются).
  • Поддержка аватаров — аватар из соцсети сохраняется как внешний URL (не загружается на сервер), что экономит дисковое пространство.
  • Инструмент синхронизации — в админке можно проверить и автоматически добавить недостающие поля в таблицу пользователей для выбранных провайдеров.
  • Логирование — запись основных событий в файл помогает при отладке.

Как это работает

Плагин подключает библиотеку Hybridauth 3.x, которая реализует стандартные протоколы OAuth 2.0 / OpenID Connect для более чем 40 провайдеров. При клике на кнопку «Войти через …» пользователь перенаправляется на сайт провайдера, где подтверждает доступ. После успешной аутентификации провайдер возвращает на сайт специальный код, по которому библиотека получает токен доступа и загружает профиль пользователя.

Далее плагин ищет в базе данных запись с таким же идентификатором провайдера. Если находит — выполняет вход. Если нет и включена авторегистрация — создаёт нового пользователя, заполняя стандартные поля (user_name, user_email, user_avatar и др.). После этого пользователь автоматически авторизуется в Cotonti.


Установка

  1. Скачайте ZIP-архив плагина из репозитория hybridauth-cotonti или клонируйте его.
  2. Скопируйте папку hybridauth из архива в директорию plugins/ вашего сайта.
    Внутри папки lib/Hybridauth/ уже находится готовая библиотека Hybridauth 3.x — ничего дополнительно качать не нужно.
  3. Зайдите в панель администратора Cotonti («Конфигурация → Плагины») и нажмите «Установить» напротив HybridAuth.
  4. После установки откройте настройки плагина и сохраните их (даже без изменений) — это создаст в таблице users необходимые колонки для хранения ID и URL‑профилей соцсетей (например, user_google_id, user_telegram_url).
  5. Настройте провайдеров (см. раздел «Настройка провайдеров»).

Работа плагина требует установленного и настроенного URL Editor, а именно доступности сайта провайдерам по ссылке https://yourproject.com/hybridauth смотреть plugins/hybridauth/conf/hybridauth.config.php 'callback' => $cfg['mainurl'] . '/' . 'hybridauth',


Настройка провайдеров

Список поддерживаемых и руководство по настройке провайдеров для плагина HybridAuth в Cotonti.

Перечислены только те провайдеры, которые указаны в официальной таблице поддерживаемых провайдеров Hybridauth 3.

Поддерживаемые провайдеры и их возможности

Таблица основана исключительно на официальном списке поддерживаемых провайдеров Hybridauth 3. Для каждого провайдера указаны поддерживаемые им возможности: аутентификация, получение профиля пользователя, контактов, статусов и ленты активности.
Именно эти возможности реализованы в соответствующих адаптерах библиотеки.

ПровайдерПротоколАутентификацияПрофиль пользователяКонтактыСтатусыЛента активности
GoogleOAuth2  
FacebookOAuth2 
TelegramHybrid   
TwitterOAuth1
GitHubOAuth2   
DiscordOAuth2   
LinkedInOAuth2  
MicrosoftOAuth2  
AppleOAuth2   
SteamHybrid   
SlackOAuth2   
SpotifyOAuth2   

Примечание: В таблице перечислены далеко не все, но только те провайдеры, чьи адаптеры входят в официальную поставку Hybridauth 3. Полный список см. на hybridauth.github.io/providers.html.
Для работы любого OAuth-провайдера требуется предварительная регистрация приложения и получение client id/secret.


Конфигурация провайдеров: файл hybridauth.config.php

Настройка провайдеров выполняется не через админ-панель Cotonti, а непосредственно в файле plugins/hybridauth/conf/hybridauth.config.php.
Этот файл является основным конфигурационным файлом плагина и содержит:

  • Глобальный callback-адрес — единый URL для всех провайдеров.
  • Список провайдеров с параметрами:
    • enabled — включён (true) или выключен (false);
    • keys — идентификатор приложения (id) и секретный ключ (secret);
    • scope — права доступа (какие данные запрашивать у пользователя).

Пример структуры файла (только Google и Telegram, которые уже настроены в вашем плагине)

<?php
defined('COT_CODE') or die('Wrong URL');

global $cfg;

return [
    'callback' => $cfg['mainurl'] . '/hybridauth',

    'providers' => [
        'Google' => [
            'enabled' => true,
            'keys' => [
                'id'     => 'ВАШ_CLIENT_ID.apps.googleusercontent.com',
                'secret' => 'ВАШ_CLIENT_SECRET'
            ],
            'scope' => 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email',
        ],
        'Telegram' => [
            'enabled' => true,
            'keys' => [
                'id'     => '8911989645',          // числовой Client ID
                'secret' => 'ВАШ_CLIENT_SECRET'
            ],
            'scope' => 'openid profile',
        ],
    ],
];

Для добавления любого другого провайдера достаточно добавить новый блок в секцию providers, указав его ключи и scope, полученные при регистрации приложения.


Как конфигурационный файл подключается и участвует в логике плагина

1. Загрузка конфигурации

Файл hybridauth.config.php подключается в inc/hybridauth.functions.php на самой ранней стадии — до определения всех функций:

global $hybridauth_config;
$hybridauth_config = include __DIR__ . '/../conf/hybridauth.config.php';

После этого содержимое конфигурации доступно через глобальную переменную $hybridauth_config во всех файлах плагина.

2. Использование в контроллере hybridauth.php

Главный скрипт плагина (hybridauth.php) целиком опирается на этот конфигурационный массив:

  • Инициализация библиотеки:

    $hybridauth = new Hybridauth\Hybridauth($hybridauth_config);
    
  • Проверка доступности провайдера:

    if (empty($hybridauth_config['providers'][$provider]['enabled'])) {
        cot_die_message(403);
    }
    
  • Обработка callback и повторная аутентификация:
    При возврате пользователя от провайдера скрипт снова обращается к $hybridauth_config, чтобы получить правильное название и параметры провайдера.

3. Хуки, использующие конфигурацию

  • hybridauth.login.php — проверяет, что запрос пришёл от соцсети, и формирует условие для поиска пользователя по ID провайдера.
  • hybridauth.usertags.php — для каждого включённого провайдера добавляет теги {GOOGLE_ID}, {GOOGLE_URL} и т.п. в шаблоны.
  • hybridauth_login() и hybridauth_accounts() — перебирают providers и генерируют кнопки входа или панель управления привязками.

Таким образом, единожды заполненный файл hybridauth.config.php становится центральным источником данных для всего плагина. Любые изменения — добавление нового провайдера, смена ключей, включение/отключение — сразу подхватываются всей системой без необходимости редактировать другие файлы.


Важно помнить и отличать настройки плагина от настройки провайдеров!

  • Конфигурация провайдеров выполняется только в файле plugins/hybridauth/conf/hybridauth.config.php.
  • Файл загружается в inc/hybridauth.functions.php и становится глобальной переменной $hybridauth_config.
  • Контроллер hybridauth.php и все хуки используют этот массив для инициализации библиотеки, проверки провайдеров и генерации виджетов.
  • Для каждого провайдера достаточно получить id и secret в его панели разработчика и прописать их в конфиге — после этого он сразу становится доступен для пользователей (при enabled = true).

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

Все провайдеры настраиваются в файле plugins/hybridauth/conf/hybridauth.config.php. Для каждого указывается enabled (вкл/выкл), keys (id и secret) и опционально scope.

Google

  1. Перейдите в Google Cloud Console.
  2. Создайте проект (или выберите существующий).
  3. В разделе APIs & Services → Credentials нажмите + Create Credentials → OAuth client ID.
  4. Выберите тип приложения Web application.
  5. В поле Authorized redirect URIs укажите:

    https://ваш-сайт.com/hybridauth
    

    (адрес должен точно совпадать с параметром callback в конфиге плагина, без языкового префикса).

  6. После создания скопируйте Client ID и Client Secret.

Пример конфигурации:

'Google' => [
    'enabled' => true,
    'keys' => [
        'id'     => 'ВАШ_CLIENT_ID.apps.googleusercontent.com',
        'secret' => 'ВАШ_CLIENT_SECRET'
    ],
    'scope' => 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email',
],

Telegram

Современный провайдер Telegram использует протокол OpenID Connect (OIDC). Для его настройки:

  1. Создайте бота через @BotFather (команда /newbot).
  2. В чате с BotFather нажмите кнопку «Open» (запуск мини‑приложения), перейдите в Bot Settings → Web Login.
  3. Нажмите Configure и укажите тот же самый callback URL:

    https://ваш-сайт.com/hybridauth
    
  4. Получите Client ID (числовой) и Client Secret (длинная строка).

Конфигурация:

'Telegram' => [
    'enabled' => true,
    'keys' => [
        'id'     => '123456789',                         // числовой Client ID
        'secret' => 'AbCdEfGhIjKlMnOpQrStUvWxYz123456789' // Client Secret
    ],
    'scope' => 'openid profile',   // можно добавить 'phone' для получения номера телефона
],

Другие провайдеры

Библиотека Hybridauth поддерживает множество провайдеров: Facebook, Twitter (X), GitHub, VK, Одноклассники, Яндекс и др. Для их добавления достаточно:

  • создать приложение в соответствующей платформе,
  • получить id/secret,
  • прописать секцию в providers, указав необходимый scope.

Для многих провайдеров уже есть готовые адаптеры в папке lib/Hybridauth/Provider/. Если нужный провайдер отсутствует, можно добавить его по документации Hybridauth.


Конфигурация плагина

Файл plugins/hybridauth/conf/hybridauth.config.php содержит общие настройки:

return [
    'callback'   => $cfg['mainurl'] . '/hybridauth',   // единый callback для всех провайдеров
    'providers'  => [ /* … */ ],
    'debug_mode' => true,                               // включить подробное логирование
    'debug_file' => $cfg['plugins_dir'] . '/hybridauth/log/hybridauth_debug.log',
];

Параметр callback должен указывать на файл hybridauth.php в корне плагина. Он же используется всеми провайдерами. Важно, чтобы этот URL был абсолютным и совпадал с тем, что прописано в настройках приложений у провайдеров.

В административной панели доступны опции:

  • Авто-регистрация — если включена, при первом входе через соцсеть автоматически создаётся новый пользователь.
  • Блокировать ручную регистрацию — скрывает стандартную форму регистрации, оставляя только социальный вход (полезно для закрытых сообществ).

Поведение плагина в зависимости от настроек autoreg и block_manual_registration

Все настройки хранятся в $cfg['plugin']['hybridauth'] и задаются через админ-панель (файл hybridauth.setup.php).
Основная логика обрабатывается в файлах hybridauth.php, hybridauth.register.add.php, hybridauth.register.form.php.


1. Настройка autoreg = 0 (авторегистрация выключена)

Где применяется: hybridauth.php, строка } elseif ($cfg['plugin']['hybridauth']['autoreg']) — код не выполняется при autoreg = 0.
Что делает плагин:

  • Пользователь кликает «Войти через Google/Telegram».
  • После успешной аутентификации и получения профиля плагин проверяет, существует ли запись с таким же user_{provider}_id.
  • Если пользователь найден – выполняется вход (как обычно).
  • Если пользователь НЕ найден – плагин НЕ создаёт нового пользователя. Вместо этого:
    • Устанавливается сообщение hybridauth_no_linked_account («Не обнаружено учётных записей…»).
    • Браузер перенаправляется на страницу ручной регистрации (/users?m=register).
  • На странице регистрации, если в сессии есть cot_hybridauth, хук hybridauth.register.form.php предзаполняет поля данными из соцсети (имя, email, аватар и т.д.).
  • Пользователь может вручную завершить регистрацию, после чего аккаунт будет создан, а провайдер автоматически привязан к новой учётной записи.
  • При этом блокировка ручной регистрации (block_manual_registration) может дополнительно влиять (см. пункты 3 и 4).

Итог: без авторегистрации плагин только связывает уже существующие аккаунты с соцсетями, но не создаёт новые автоматически. Пользователю предлагается обычная форма регистрации с уже заполненными полями.


2. Настройка autoreg = 1 (авторегистрация включена)

Где применяется: hybridauth.php, в блоке } elseif ($cfg['plugin']['hybridauth']['autoreg']).
Что делает плагин:

  • После аутентификации и получения профиля, если пользователь не найден по user_{provider}_id, плагин автоматически создаёт новую учётную запись.
    • Вызывается функция hybridauth_complete_profile(), которая заполняет поля user_name, user_email, user_avatar, user_firstname и т.д. на основе данных соцсети.
    • Генерируется случайный пароль (пользователь всё равно будет входить через соцсеть).
    • Выполняется cot_add_user(), активация принудительно отключается ($cfg['users']['regnoactivation'] = true).
    • Сразу после создания происходит автоматический вход (редирект на login?a=check&...&provider=...).
  • Если пользователь уже существует (найден по ID провайдера), то выполняется обычный вход без создания дубликата.
  • Проверка на существующий email: перед созданием нового пользователя плагин проверяет, нет ли в базе записи с таким же email. Если email уже используется, но провайдер к ней не привязан, плагин выводит предупреждение и перенаправляет на страницу входа, чтобы пользователь мог сначала войти и привязать соцсеть в профиле.

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


3. Настройка block_manual_registration = 0 (ручная регистрация разрешена)

Где применяется: hybridauth.register.add.php, строка if ($cfg['plugin']['hybridauth']['block_manual_registration']) — код не выполняется.
Что делает плагин:

  • Никак не ограничивает стандартную регистрацию Cotonti.
  • Пользователь может зарегистрироваться через обычную форму (/users?m=register), даже если у него нет соцсетей.
  • Если при этом в сессии есть cot_hybridauth (пользователь пришёл после неудачной авторегистрации), плагин всё равно дополнит данные регистрации из соцсети (через хук hybridauth.register.add.php).

Итог: обычная регистрация работает без изменений, плагин лишь помогает заполнить поля, когда это уместно.


4. Настройка block_manual_registration = 1 (ручная регистрация заблокирована)

Где применяется: hybridauth.register.add.php.
Что делает плагин:

  • При отправке формы ручной регистрации (POST на users?m=register) хук hybridauth.register.add.php проверяет флаг block_manual_registration.
  • Если флаг установлен в true, выполняется cot_error('hybridauth_autoreg_inaction'); — это вызывает ошибку валидации, и форма регистрации не будет принята.
  • В результате пользователь видит сообщение об ошибке «Ручная регистрация отключена. Войдите с помощью вашего аккаунта социальной сети.» и не может создать учётную запись обычным способом.
  • Исключение: если вместе с запросом пришла активная сессия cot_hybridauth (т.е. пользователь был перенаправлен на регистрацию после соцсети) и при этом cot_error_found() возвращает false, то блокировка не применяется — регистрация с данными из соцсети всё равно будет выполнена (заполнение $ruser и отключение активации). Это позволяет завершить ручную регистрацию, когда авторегистрация выключена, но пользователь уже аутентифицирован через провайдера.
  • Страница с формой регистрации сама по себе остаётся доступной, но при попытке отправить данные без соцсети будет выдана ошибка.

Итог: включение этой опции превращает сайт в «закрытое» сообщество, где создание аккаунта возможно только через социальные сети (если autoreg=1) или через ручную регистрацию с данными из соцсети (если autoreg=0). Обычная регистрация по логину/паролю полностью отключается.

Примечание о термине «ручная регистрация». В контексте этого плагина под ручной регистрацией понимается штатная форма регистрации Cotonti, доступная по адресу /users?m=register, где пользователь вводит логин, пароль, email и другие поля и создаёт учётную запись стандартными средствами движка. Плагин не заменяет этот механизм, а лишь может заблокировать его или предзаполнить поля данными из социальной сети. Это важно понимать, так как термин «ручная» может сбивать с толку — он означает просто «не автоматическая через соцсеть», а не какой-то особый процесс. Именно эту форму вы видите, когда переходите на /users?m=register и заполняете поля вручную. Все остальные упоминания «ручной регистрации» в этой статье относятся именно к ней.


Сводная таблица поведения

autoregblock_manual_registrationРезультат
00Соцсети только для входа существующих пользователей. Новые пользователи могут зарегистрироваться вручную (форма доступна). При переходе с соцсети поля формы предзаполняются.
01Соцсети только для входа. Ручная регистрация заблокирована (ошибка при отправке формы). Пользователь, пришедший с соцсети, сможет завершить регистрацию через форму с предзаполненными данными.
10Соцсети создают нового пользователя автоматически. Ручная регистрация доступна.
11Полностью автоматический вход/регистрация через соцсети. Обычная регистрация отключена.

Все эти сценарии реализованы в файлах hybridauth.php и hybridauth.register.add.php без дополнительных условий.


Интеграция с темой оформления

Плагин предоставляет два основных виджета, которые можно разместить в любых TPL-шаблонах темы.

Кнопки входа через соцсети:

<!-- IF {PHP|cot_plugin_active('hybridauth')} -->
    {PHP|hybridauth_login}
    <hr class="my-2">
<!-- ENDIF -->

Этот код обычно вставляется в форму входа (файл login.tpl) или в модальное окно авторизации. Кнопки стилизуются в файле hybridauth.login.tpl и по умолчанию выводят иконку Font Awesome и название провайдера.

Пример моего шаблона авторизации на сайте

<!--
    /********************************************************************************
    * File: login.tpl
    * Extension: Core System Cotonti
    * Description: HTML template for login.tpl.
    * Compatibility: CMF/CMS Cotonti Siena v0.9.26[](https://github.com/Cotonti/Cotonti)
    * Dependencies: 
    *          Bootstrap 5.3.+[](https://getbootstrap.com/); 
    *          Font Awesome Free 7.1[](https://fontawesome.com/)
    * Theme: Index36  
    * Version: 1.0.2 
    * Created: 01 Feb 2026 
    * Updated: 25 July 2026 
    * Copyright (c) 2026 webitproff | https://github.com/webitproff
    * Source: https://github.com/webitproff/index36-cotonti-theme
    * Demo : https://freelance-script.abuyfile.com/ 
    * Help and support: https://abuyfile.com/ru/forums/cotonti/original/skins/index36
    * License: BSD (Free distribution with saving Copyright (c) 2026 webitproff)  
    ********************************************************************************/
-->

<!-- BEGIN: MAIN -->
{FILE "{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/warnings.tpl"} <!-- обязательно для 'hybridauth' -->
<!-- BEGIN: USERS_AUTH_MAINTENANCE -->
<div class="alert alert-danger mb-0">
    <h4>{PHP.L.users_maintenance1}</h4>
    <p>{PHP.L.users_maintenance2}</p>
</div>
<!-- END: USERS_AUTH_MAINTENANCE -->

<div class="d-flex">
    <div class="d-none d-lg-flex flex-grow-1 align-items-center justify-content-center">
        <div class="p-4" style="max-width:520px">
            <img src="{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/img/auth.svg" class="img-fluid" alt="{USERS_AUTH_TITLE}">
        </div>
    </div>
    <div class="d-flex flex-column align-items-center justify-content-center vh-100 col-12 col-lg-6 col-xl-4" style="background-color: var(--bs-sidebar-bg);" data-bs-theme="inherit">
        <div class="w-100 p-4">
            <div class="text-center mb-4">
                <img src="{PHP.R.app-logo}" width="75" alt="logo">
            </div>
            <!-- IF {PHP.usr.id} -->
            <div class="alert alert-warning">
                <p>{PHP.L.users_loggedinas} <strong>{PHP.usr.name}</strong>.<br/>{PHP.L.users_logoutfirst}</p>
                <p><a class="button" href="{PHP.sys.xk|cot_url('login','out=1&x=$this', '', 0, 1)}">{PHP.L.Logout}</a></p>
            </div>
            <!-- ENDIF -->

            <!-- IF {PHP.usr.id} < 1 OR {PHP.usr.id} == 0 -->

            <!-- IF {PHP|cot_plugin_active('hybridauth')} -->
            {PHP|hybridauth_login}
            <div class="my-2"><div>
            <!-- ENDIF -->

            <div class="d-flex align-items-center my-4">
                <hr class="flex-grow-1">
                <span class="px-2 small text-uppercase">{USERS_AUTH_TITLE}</span>
                <hr class="flex-grow-1">
            </div>
            <form id="login" name="login" action="{USERS_AUTH_SEND}" method="post">
                <div class="mb-3 position-relative">
                    <i class="fa-solid fa-circle-user position-absolute top-50 start-0 translate-middle-y ms-3 text-purple"></i>
                    {USERS_AUTH_USER}
                </div>
                <div class="mb-3 position-relative">
                    <i class="fa-solid fa-lock position-absolute top-50 start-0 translate-middle-y ms-3"></i>
                    {USERS_AUTH_PASSWORD}
                </div>
                <div class="form-check mb-4 d-flex align-items-center">
                    {USERS_AUTH_REMEMBER}
                </div>
                <button class="btn btn-primary w-100 mb-3" type="submit" name="rlogin" value="0">{PHP.L.Login}</button>
            </form>
            <hr>
            <ul class="nav flex-column">
                <li class="nav-item mb-3">
                    <a class="small text-reset" href="{PHP|cot_url('users','m=passrecover')}">
                        <i class="fa-solid fa-key me-2"></i>{PHP.L.users_lostpass}
                    </a>
                </li>
                <li class="nav-item">
                    <a class="small" href="{PHP|cot_url('users','m=register')}">
                        <i class="fa-solid fa-user-plus me-2"></i>{PHP.L.Register}
                    </a>
                </li>
            </ul>

            <!-- ENDIF -->

        </div>
    </div>
</div>
<!-- END: MAIN -->

Пример модального окна авторизации на сайте

кнопка

<a class="nav-link" href="{PHP|cot_url('login')}" data-bs-toggle="modal" data-bs-target="#authModal">
  <i class="fa-solid fa-right-to-bracket me-1"></i>{PHP.L.Login}
</a>

и тело

<div class="modal fade" id="authModal" tabindex="-1" aria-labelledby="authModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header" style="background-color: var(--bs-header-bg);">
                <h5 class="modal-title" id="authModalLabel">{PHP.L.Login}</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <!-- IF {PHP|cot_plugin_active('hybridauth')} -->
                {PHP|hybridauth_login}
                <hr class="my-2">
                <!-- ENDIF -->
                <form action="{PHP|cot_url('login','a=check')}" method="post">
                    <div class="mb-3">
                        <label for="inputEmail" class="form-label">{PHP.L.users_nameormail}</label>
                        <input type="text" class="form-control" name="rusername" id="inputEmail" />
                    </div>
                    <div class="mb-3">
                        <label for="inputPassword" class="form-label">{PHP.L.Password}</label>
                        <input type="password" class="form-control" name="rpassword" id="inputPassword" />
                        <a href="{PHP|cot_url('users', 'm=passrecover')}" class="small text-decoration-none">{PHP.L.users_lostpass}</a>
                    </div>
                    <div class="mb-3 form-check">
                        <input type="checkbox" class="form-check-input" id="rememberMe" name="rremember">
                        <label class="form-check-label" for="rememberMe">{PHP.L.users_rememberme}</label>
                    </div>
                    <button type="submit" class="btn btn-primary">{PHP.L.Login}</button>
                </form>
            </div>
        </div>
    </div>
</div>

Шаблон регистрации на сайте

Такой вариант шаблона users.register.tpl учитывает autoreg именно там, где это нужно. Кнопки соцсетей на странице регистрации должны появляться только когда авторегистрация включена (autoreg === '1'), иначе в них нет смысла.

В итоге логика выглядит так:

  • Если ручная регистрация заблокирована И авторегистрация включена
    → только сообщение и кнопки соцсетей (форма скрыта).
  • Если ручная регистрация разрешена И авторегистрация включена
    → кнопки соцсетей + форма регистрации (пользователь может выбрать).
  • Если авторегистрация выключена
    → кнопки соцсетей не показываются (потому что плагин всё равно отправит на ручную форму), видна только стандартная форма или сообщение о блокировке.

Можно пересобрать условия и вывести предупреждение, что регистрация полностью недоступна, но это редкий кейс. Шаблон с рабочего сайта, проверен и полностью согласован с бизнес-логикой плагина. Это именно мой рабочий шаблон, вам как пример

<!--
    /********************************************************************************
    * File: users.register.tpl
    * Extension: Module 'users'
    * Description: HTML template for Users Module - users.register.tpl. 
     * Compatibility: Cotonti v.1.x+ (https://github.com/Cotonti/Cotonti)
    * Dependencies: 
    *          Bootstrap 5.3.+[](https://getbootstrap.com/); 
    *          Font Awesome Free 7.1[](https://fontawesome.com/)
    * Theme: Index36  
    * Version: 1.0.2 
    * Created: 01 Feb 2026 
    * Updated: 25 July 2026 
    * Copyright (c) 2026 webitproff | https://github.com/webitproff
    * Source: https://github.com/webitproff/index36-cotonti-theme
    * Demo : https://freelance-script.abuyfile.com/ 
    * Help and support: https://abuyfile.com/ru/forums/cotonti/original/skins/index36
    * License: BSD (Free distribution with saving Copyright (c) 2026 webitproff)  
    ********************************************************************************/
-->
<!-- BEGIN: MAIN -->
<div class="d-flex h-100">
    {FILE "{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/warnings.tpl"}
    <div class="d-none d-lg-flex flex-grow-1 align-items-center justify-content-center">
        <div class="p-4" style="max-width:520px">
            <img src="{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/img/queue-dark.svg" class="img-fluid" alt="">
        </div>
    </div>
    <div class="card border-0 rounded-0 d-flex flex-column align-items-center justify-content-center col-12 col-lg-6 col-xl-5 pt-5 pb-5">
        <div class="w-100 p-4">
            <div class="text-center mb-4">
                <img src="{PHP.R.app-logo}" width="75" alt="logo">
            </div>
            <!-- IF {PHP.usr.id} -->
            <div class="vh-100">
                <div class="alert alert-warning">
                    <p>{PHP.L.users_loggedinas} <strong>{PHP.usr.name}</strong>.<br/>{PHP.L.users_logoutfirst}</p>
                    <p><a class="button" href="{PHP.sys.xk|cot_url('login','out=1&x=$this', '', 0, 1)}">{PHP.L.Logout}</a></p>
                </div>
            </div>
            <!-- ENDIF -->
            <!-- IF {PHP.usr.id} < 1 OR {PHP.usr.id} == 0 -->

                <!-- IF {PHP|cot_plugin_active('hybridauth')} AND {PHP.cfg.plugin.hybridauth.block_manual_registration} === '1' -->
                    <!-- Ручная регистрация заблокирована: вход через hybridauth -->
                    <!-- IF {PHP.cfg.plugin.hybridauth.autoreg} === '1' -->
                    <div class="alert alert-info">
                        <p>{PHP.L.hybridauth_autoreg_inaction}</p>
                    </div>
                    {PHP|hybridauth_login}
                    <hr class="my-4">
                    <!-- ENDIF -->
                <!-- ELSE -->
                    <!-- Ручная регистрация разрешена: показываем и кнопки соцсетей (если плагин активен), и форму -->
                    <!-- IF {PHP|cot_plugin_active('hybridauth')} AND {PHP.cfg.plugin.hybridauth.autoreg} === '1' -->
                        {PHP|hybridauth_login}
                        <hr class="my-4">
                    <!-- ENDIF -->
                    <div class="d-flex align-items-center my-4">
                        <hr class="flex-grow-1">
                        <span class="px-2 small text-uppercase">{USERS_REGISTER_TITLE}</span>
                        <hr class="flex-grow-1">
                    </div>
                    <form id="user-register" name="register" action="{USERS_REGISTER_SEND}" method="post" enctype="multipart/form-data">

                        <!-- IF {USERS_REGISTER_GROUPSELECTBOX} -->
                        <div class="mb-4">
                            <label class="form-label small">{PHP.L.profile_group} <span class="text-danger">*</span></label>
                            {USERS_REGISTER_GROUPSELECTBOX}
                        </div>
                        <!-- ENDIF -->

                        <div class="mb-4 position-relative">
                            <i class="fa-solid fa-circle-user position-absolute top-50 start-0 translate-middle-y ms-3"></i>
                            {USERS_REGISTER_USER}
                        </div>
                        <div class="mb-4 position-relative">
                            <i class="fa-solid fa-envelope position-absolute top-50 start-0 translate-middle-y ms-3"></i>
                            {USERS_REGISTER_EMAIL}
                        </div>

                        <div class="mb-4 position-relative">
                            <i class="fa-solid fa-lock position-absolute top-50 start-0 translate-middle-y ms-3"></i>
                            {USERS_REGISTER_PASSWORD}
                        </div>
                        <div class="mb-4 position-relative">
                            <i class="fa-solid fa-lock position-absolute top-50 start-0 translate-middle-y ms-3"></i>
                            {USERS_REGISTER_PASSWORDREPEAT}
                        </div>

                        <!-- IF {PHP.cfg.captchamain|cot_plugin_active($this)} -->
                        <div class="mb-4">
                            <label for="rverify" class="form-label small">{PHP.langSkStr.captchaVerify}</label>
                            <div class="d-flex align-items-center">
                                <div class="flex-grow-1">{USERS_REGISTER_VERIFY_IMG}</div>
                                <span class="">{USERS_REGISTER_VERIFY_INPUT}</span>
                            </div>
                        </div>
                        <!-- ENDIF -->

                        <!-- IF {PHP|cot_plugin_active('useragreement')} -->
                        <div class="form-check mb-4 d-flex align-items-center">
                            <input class="form-check-input" type="checkbox" name="ruseragreement" value="1" id="ruseragreement">
                            <div class="flex-grow-1">
                                <label class="form-check-label ms-3 small" for="ruseragreement">
                                    <a href="{PHP|cot_url('plug', 'e=useragreement')}" target="blank">
                                        {PHP.L.useragreement_agree}
                                    </a>
                                </label>
                            </div>
                        </div>
                        <!-- ENDIF -->

                        <button class="btn btn-success w-100 mb-5" type="submit">{PHP.L.Register}</button>
                    </form>

                <!-- ENDIF -->

                <hr>
                <ul class="nav flex-column">
                    <li class="nav-item mb-2">
                        <a class="small text-reset" href="{PHP|cot_url('users','m=passrecover')}">
                            <i class="fa-solid fa-key me-2"></i>{PHP.L.users_lostpass}
                        </a>
                    </li>
                    <li class="nav-item">
                        <a class="small text-reset" href="{PHP|cot_url('login')}">
                            <i class="fa-solid fa-user-plus me-2"></i>{PHP.L.Login}
                        </a>
                    </li>
                </ul>
            <!-- ENDIF -->
        </div>
    </div>
</div>
<!-- END: MAIN -->

Панель управления привязками в профиле пользователя:

{PHP|hybridauth_accounts}

Разместите в шаблоне профиля (users.profile.tpl), например после блока с паролем. Пользователь увидит список включённых провайдеров, сможет привязать новый аккаунт или отвязать существующий. Шаблон этого блока — hybridauth.accounts.tpl.


Авторегистрация и привязка аккаунтов

Когда посетитель впервые входит через соцсеть и включена авторегистрация, плагин вызывает функцию hybridauth_complete_profile(), которая заполняет профиль нового пользователя:

  • user_name — очищенный от спецсимволов displayName (или часть email, если имя не передано).
  • user_email — email из соцсети, либо сгенерированный на основе ID провайдера (для Telegram).
  • user_avatar — полный URL аватара (не скачивается на сервер, чтобы не плодить файлы).
  • user_firstname, user_lastname — если существуют соответствующие дополнительные поля.
  • user_country, user_lang, user_gender — при наличии в профиле.
  • user_photo — URL фотографии (опционально).

Привязка дополнительных провайдеров к уже существующей учётной записи выполняется через ссылки «Связать» / «Отвязать» в профиле. Один и тот же аккаунт соцсети может быть привязан только к одному пользователю сайта.


Логирование и отладка

Плагин умеет писать два лога:

  • hybridauth.log — создаётся автоматически в папке plugins/hybridauth/log/. Сюда попадают основные события: успешные входы, ошибки аутентификации, создание пользователей. За это отвечает функция hybridauth_log().
  • hybridauth_debug.log — включается параметром 'debug_mode' => true в конфигурации. Библиотека Hybridauth записывает сюда детальную техническую информацию (заголовки запросов, параметры, ошибки HTTP).

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


Схема структуры плагина hybridauth для Cotonti

/plugins/hybridauth/                       # Корень плагина
│
├── conf/                                  # Конфигурация
│   └── hybridauth.config.php              # Настройки провайдеров, callback URL, отладка
│
├── inc/                                   # Основные функции
│   └── hybridauth.functions.php           # Автозагрузчик Hybridauth 3.x, общие функции:
│                                          # - hybridauth_complete_profile()
│                                          # - hybridauth_login()
│                                          # - hybridauth_accounts()
│
├── lang/                                  # Языковые файлы
│   └── hybridauth.ru.lang.php             # Русские переводы для интерфейса и ошибок
│
├── lib/                                   # Библиотека Hybridauth 3.x (без Composer)
│   └── Hybridauth/                        # Содержимое папки src/ из официального дистрибутива
│       ├── Adapter/
│       ├── Data/
│       ├── Exception/
│       ├── HttpClient/
│       ├── Logger/
│       ├── Provider/
│       ├── Storage/
│       ├── Thirdparty/
│       ├── User/
│       ├── Hybridauth.php                 # Главный класс библиотеки
│       └── autoload.php                   # Штатный автозагрузчик (рекомендуется вместо самописного)
│
├── setup/                                 # Установка/удаление
│   ├── hybridauth.install.php             # Создание полей в таблице users при установке
│   └── hybridauth.uninstall.php           # Удаление полей при деинсталляции
│
├── tpl/                                   # Шаблоны для вывода
│   ├── hybridauth.login.tpl               # Виджет кнопок входа через соцсети
│   ├── hybridauth.accounts.tpl            # Блок привязки/отвязки аккаунтов в профиле
│   └── hybridauth.tools.tpl               # Шаблон для страницы инструментов (админка)
│
├── hybridauth.global.php                  # Хук global — подключает функции для всего сайта
├── hybridauth.login.php                   # Хук users.auth.check.query — перехватывает логин через соцсеть
├── hybridauth.login.tags.php              # Хук users.auth.tags — Выводим системные сообщения (например, "Пользователь с таким email уже существует...")
├── hybridauth.logout.php                  # Хук users.logout — разлогинивает из провайдеров
├── hybridauth.php                         # Standalone-контроллер (главная точка входа)
├── hybridauth.profile.php                 # Хук users.profile.tags — добавляет в профиль блок управления аккаунтами
├── hybridauth.register.add.php            # Хук users.register.add.validate — обрабатывает авторегистрацию
├── hybridauth.register.form.php           # Хук users.register.main — предзаполняет форму регистрации данными из соцсети
├── hybridauth.register.redirect.php       # Хук users.register.add.done — перенаправляет после регистрации на автовход
├── hybridauth.tools.php                   # Хук tools — добавляет инструмент в админку для синхронизации полей
├── hybridauth.usertags.php                # Хук usertags.main — предоставляет теги для вывода данных соцсетей
└── hybridauth.setup.php                   # Мета-информация плагина (версия, зависимости, настройки)

Примечания:

Все файлы с хуками (.php в корне) подключены к соответствующему событию Cotonti через блок [BEGIN_COT_EXT] Hooks=....

Библиотека Hybridauth 3.x размещается в /lib/Hybridauth/ с сохранением структуры пространств имён. Рекомендуется использовать штатный autoload.php из папки lib/Hybridauth/ (см. hybridauth.functions.php).

Конфигурация провайдеров (ключи, scope) задаётся в hybridauth.config.php. Включение/отключение провайдера — через ключ enabled.

Некоторые файлы и хуки

Основные файлы плагина и их назначение:

ФайлНазначение
hybridauth.phpГлавный контроллер. Обрабатывает все запросы: вход, привязка, отвязка, callback от провайдеров.
inc/hybridauth.functions.phpЗагрузка библиотеки, функции генерации профиля, логирования, формирования виджетов.
conf/hybridauth.config.phpКонфигурация всех провайдеров и общие параметры.
hybridauth.login.phpХук users.auth.check.query. Подставляет условие для поиска пользователя по ID провайдера при социальном входе.
hybridauth.global.phpХук global. Подключает функции плагина на всех страницах.
hybridauth.login.tpl, hybridauth.accounts.tplШаблоны для кнопок входа и панели управления привязками.
hybridauth.usertags.phpХук usertags.main. Добавляет теги {GOOGLE_ID}, {TELEGRAM_URL} и т.п. для использования в шаблонах профиля/списка пользователей.
hybridauth.register.*.phpХуки для предзаполнения формы регистрации данными из соцсети и блокировки ручной регистрации.
hybridauth.tools.phpХук tools. Инструмент для синхронизации полей в админке.
setup/Установочные скрипты для добавления/удаления колонок в таблице users.
lib/Hybridauth/Файлы библиотеки Hybridauth 3.x.

Плагин использует стандартную систему хуков Cotonti. Все файлы, начинающиеся с префикса hybridauth., являются хуками, и их имена соответствуют точкам входа, описанным в официальной документации Cotonti.


Механика работы плагина: пошаговые сценарии на примере Google

Чтобы понять, как плагин обрабатывает социальную аутентификацию, рассмотрим три типичных ситуации на примере провайдера Google. Все действия происходят в контроллере hybridauth.php с участием хука hybridauth.login.php и библиотеки Hybridauth.

Сценарий 1. Первый вход на сайт через Google

Пользователь ещё не имеет учётной записи на сайте и хочет войти, используя свой Google-аккаунт, не заполняя форму регистрации.

  1. Клик по кнопке «Войти через Google»
    Кнопка в шаблоне формирует ссылку вида https://сайт/hybridauth?a=login&provider=Google. Запрос принимает контроллер hybridauth.php.
  2. Начало OAuth-авторизации
    Контроллер создаёт объект библиотеки Hybridauth\Hybridauth с конфигурацией Google и вызывает метод authenticate('Google'). Библиотека формирует URL для перенаправления на сервер Google, куда и отправляет пользователя.
  3. Подтверждение на стороне Google
    Пользователь авторизуется в Google (если ещё не) и разрешает приложению доступ к запрошенным данным (профиль, email). Google возвращает браузер обратно на callback-адрес https://сайт/hybridauth, добавляя параметры code и state.
  4. Обработка callback-запроса
    Контроллер обнаруживает отсутствие параметра provider, но видит code в URL. Он извлекает из сессии сохранённое название провайдера (Google) и снова вызывает authenticate('Google'), передавая полученный код. Библиотека обменивает код на токен доступа и запрашивает профиль пользователя через Google API. В результате скрипт получает объект с данными: идентификатор Google (sub), имя, email, URL аватара и т.д.
  5. Поиск существующей учётной записи
    Плагин проверяет, существует ли в таблице users запись с таким же user_google_id. Для нового пользователя такой записи нет.
  6. Проверка конфликта по email
    Если провайдер передал email (Google передаёт всегда), плагин ищет пользователя с таким же email.
    • Если пользователь найден, но его user_google_id ещё не заполнен – плагин выводит сообщение с предложением войти под своей учётной записью и привязать Google в профиле, после чего перенаправляет на страницу входа.
    • Если дубликата email нет – переход к авторегистрации (если она включена).
  7. Автоматическая регистрация
    При включённой опции autoreg плагин вызывает функцию hybridauth_complete_profile(), которая заполняет массив $ruser:
    • user_name – очищенный от спецсимволов displayName;
    • user_email – email, полученный от Google;
    • user_avatar – прямая ссылка на аватар (не скачивается на сервер);
    • user_password – случайно сгенерированный пароль (пользователь всё равно будет входить через соцсеть);
    • user_google_id и user_google_url – уникальный идентификатор и ссылка на профиль Google. Затем вызывается стандартная функция Cotonti cot_add_user() для создания пользователя. Активация учётной записи принудительно отключается (regnoactivation = true).
  8. Автоматический вход
    После создания пользователя (или если пользователь уже существовал и был найден по Google ID) плагин перенаправляет браузер на login?a=check&x=...&provider=google, сохранив в сессии массив cot_hybridauth с идентификатором Google.
  9. Завершение входа через хук
    Хук hybridauth.login.php перехватывает запрос к login?a=check, видит параметр provider=google и устанавливает условие user_google_id = :hybridauth_id для поиска пользователя. Система Cotonti находит запись, выполняет авторизацию (функция cot_user_authorize), и пользователь попадает на сайт под своей новой учётной записью.

Сценарий 2. Вход уже привязанного пользователя

Пользователь ранее уже привязал Google к своей учётной записи (поле user_google_id заполнено).

  • При клике на кнопку входа повторяются шаги 1–4, как и в первом сценарии.
  • На шаге 5 плагин находит запись с таким же user_google_id.
  • Сразу же выполняется редирект на login?a=check&...&provider=google, где хук подставляет условие поиска по Google ID.
  • Cotonti выполняет вход без лишних проверок, так как пользователь уже существует и привязан.

Если пользователь уже авторизован на сайте (не гость) и случайно нажимает кнопку «Войти через Google», контроллер перенаправляет его на страницу входа с сообщением «Вы уже вошли как …» – это предотвращает конфликты и дублирование сессий.

Сценарий 3. Привязка Google к существующему профилю

У пользователя уже есть обычная учётная запись (с паролем), и он хочет добавить возможность входить через Google, не создавая новую учётную запись.

  1. Кнопка «Связать» в личном кабинете
    В шаблоне профиля размещён блок {PHP|hybridauth_accounts}, который генерирует ссылку https://сайт/hybridauth?a=link&provider=Google.
  2. Запуск привязки
    Контроллер видит a=link и usr['id'] > 0. Он сохраняет действие (action = 'link') и название провайдера в сессию, затем вызывает authenticate('Google'), перенаправляя на Google.
  3. Обработка callback
    После подтверждения на стороне Google контроллер восстанавливает действие link из сессии и получает профиль пользователя.
  4. Проверка на конфликт
    Плагин проверяет, не привязан ли уже этот Google ID к другому пользователю. Если да – выводится ошибка «Этот аккаунт уже связан с другим пользователем».
  5. Сохранение связи
    Если конфликта нет, выполняется UPDATE записи текущего пользователя: в поля user_google_id и user_google_url записываются соответствующие значения из профиля Google.
  6. Возврат в профиль
    Пользователь перенаправляется обратно на страницу профиля, где блок управления аккаунтами теперь показывает Google как «Подключено».

Аналогично работает действие unlink (отвязать) – оно очищает поля user_google_id и user_google_url и, при возможности, завершает сессию на стороне провайдера.


Ключевые выводы

  • Единый контроллер – все операции (вход, привязка, отвязка) обрабатываются одним файлом hybridauth.php, что упрощает поддержку и отладку.
  • Минимум дублирования – callback-логика едина для всех действий, различается только восстановлением сохранённого действия из сессии.
  • Гибкость для пользователя – можно войти через соцсеть, привязать несколько провайдеров к одному аккаунту или отключить ненужный.
  • Контроль конфликтов – проверка уникальности email и ID провайдера предотвращает создание дублирующихся учётных записей.
  • Прозрачность – подробное логирование в hybridauth.log и hybridauth_debug.log позволяет быстро найти причину любой неполадки.

Логирование в плагине HybridAuth: два инструмента для полного контроля

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


1. Детальный лог библиотеки (hybridauth_debug.log)

Этот файл создаётся самой библиотекой Hybridauth, когда в конфигурации включён режим отладки:

'debug_mode' => true,
'debug_file' => $cfg['plugins_dir'] . '/hybridauth/log/hybridauth_debug.log',

Что попадает в этот лог:

  • Полная конфигурация провайдера, с которой был запущен процесс (маскируя секреты).
  • URL, на который перенаправляется пользователь для аутентификации.
  • Callback-URL при возврате от провайдера.
  • HTTP-запросы и ответы на техническом уровне: заголовки, тело ответа (включая токены и данные профиля), параметры curl, тайминги соединения.

Пример записи (начало входа через Google):

debug -- 2026-07-25T01:04:56+00:00 -- Initialize Hybridauth\Provider\Google, config: Array (...)
info  -- 2026-07-25T01:04:56+00:00 -- Hybridauth\Provider\Google::authenticate()
debug -- 2026-07-25T01:04:56+00:00 -- Hybridauth\Provider\Google::authenticateBegin(), redirecting user to:
Array ([0] => https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=...)

Когда нужен этот лог:

  • Если вход не работает, и нужно проверить, правильные ли ключи передаются в API.
  • Если провайдер возвращает ошибку, и нужно увидеть точный ответ сервера (например, invalid_client).
  • Чтобы убедиться, что callback URL совпадает с зарегистрированным.

Важно: этот лог содержит секретные данные (токены доступа, client_secret). Никогда не публикуйте его в открытом доступе и отключайте (debug_mode => false) после завершения отладки.


2. Основной лог плагина (hybridauth.log) и функция hybridauth_log()

Этот лог ведётся самим плагином Cotonti и показывает не технические детали HTTP, а события с точки зрения бизнес-логики: попытки входа, ошибки аутентификации, создание пользователей, привязку аккаунтов.

За запись в этот файл отвечает функция hybridauth_log(), которая определена в inc/hybridauth.functions.php:

function hybridauth_log(string $message): void
{
    global $cfg;
    $logFile = $cfg['plugins_dir'] . '/hybridauth/log/hybridauth.log';
    $logDir = dirname($logFile);
    if (!is_dir($logDir)) {
        mkdir($logDir, 0755, true);
    }
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$timestamp] $message\n", FILE_APPEND);
}

Как это работает: Функция принимает текстовое сообщение, автоматически добавляет временную метку и дописывает строку в файл hybridauth.log. Папка и файл создаются автоматически при первой записи.

Пример использования в коде плагина:

hybridauth_log("Начало входа, провайдер: $provider");
hybridauth_log("Успешный вход через Google, identifier: " . $user_profile->identifier);
hybridauth_log("Ошибка authenticate: " . $e->getMessage());
hybridauth_log("Авторегистрация включена, создаём пользователя");

Что попадает в hybridauth.log:

  • Каждый запуск контроллера (hybridauth.php).
  • Успешные аутентификации с указанием провайдера и идентификатора пользователя.
  • Обнаружение callback-запроса от провайдера.
  • Результат поиска пользователя в базе (найден / не найден).
  • Создание нового пользователя при авторегистрации.
  • Ошибки, возникающие на любом этапе (с кодом и текстом исключения).

Когда нужен этот лог:

  • Чтобы отследить полный путь пользователя от клика по кнопке до входа на сайт.
  • Если после входа происходит редирект на страницу регистрации, а не вход — лог покажет, на каком этапе произошёл сбой (например, не найден пользователь, или авторегистрация не включена).
  • При жалобах пользователей на невозможность привязать соцсеть — лог зафиксирует ошибку «уже привязан» или «ошибка запроса».

Преимущество перед debug-логом:
hybridauth.log всегда активен и не требует включения debug_mode. Он пишет только ключевые события, поэтому файл остаётся компактным и не забивается техническими подробностями. Это основной инструмент для повседневного мониторинга работы плагина.


Резюме: какой лог использовать?

СитуацияИспользуйте
Вход через соцсеть не работает, хочу увидеть полную картину HTTP-запросовhybridauth_debug.log (включите debug_mode)
Пользователь не может войти, нужно понять, на каком этапе происходит сбойhybridauth.log (функция hybridauth_log())
Нужно убедиться, что callback URL правильныйhybridauth_debug.log
Хочу видеть, сколько пользователей зарегистрировалось через соцсетиhybridauth.log

Оба лога находятся в папке plugins/hybridauth/log/ и могут просматриваться одновременно. Для полной картины неисправности рекомендуется сначала проверить hybridauth.log, а если причина не ясна — включить debug_mode и изучить технический лог.

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


Заключение и ссылки

HybridAuth — инструмент для добавления социальной аутентификации на сайт под управлением Cotonti. Он не зависит от сторонних сервисов, легко настраивается под любые провайдеры и хорошо интегрируется с современными темами (Bootstrap 5, Font Awesome). Благодаря продуманной архитектуре и открытому исходному коду вы всегда можете адаптировать его под свои нужды.

Полезно, но может быть устаревшим частично или полностью


Created: 25 July 2026 Copyright (c) 2026 webitproff | https://github.com/webitproff



Рейтинг на основе отзывов:
Звезд получено: 0
Oтзывов всего: 0
Средняя оценка: 0
26 минут чтения
Владелец: Carbonate Sodium

Отзывы к товарам

Отзывов пока нет


Добавить в корзину

Товар без файла для загрузки

 

Категория расширения
Безопасность и аутентификация, Telegram-интеграции и мини-приложения
Доступность
Бесплатно

Обсуждение страницы в Telegram

Автор контента

webitproff

Оффлайн

webitproff

Последняя авторизация: 26.07.2026 18:55

  • Чем могу помочь?

    Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.

  • Разработки на GitHub бесплатно
    • 25.07.2026 05:08
    • 26.07.2026 13:08

    Рекомендуемые товары и услуги

    Установка, интеграция и адаптация плагинов под Cotonti CMF

    Установка, интеграция и адаптация плагинов под Cotonti CMF

    профессиональные услуги по установке, глубокой интеграции и адаптации плагинов под Cotonti CMF, с

    Витрина Market PRO

    CMS, Скрипт и Движок - веб сайта онлайн-витрины, интернет магазина инфопродуктов и цифровых товаров. Разные цены в разных валютах на товар. Онлайн-оплата в криптовалюте за товары и услуги.