Заготовка плагина socialauth для Cotonti
Структура плагина socialauth для Cotonti, который включает авторизацию, регистрацию и привязку/отвязку аккаунтов социальных сетей через HybridAuth 3.11 (без Composer).
Структура плагина socialauth для Cotonti, который включает авторизацию, регистрацию и привязку/отвязку аккаунтов социальных сетей через HybridAuth 3.11 (без Composer).
Заготовка
Структура плагина
plugins/socialauth/
├── lib/ # Папка с библиотекой HybridAuth
│ └── hybridauth/ # Содержит файлы из src архива HybridAuth 3.11
│ ├── Adapter/
│ ├── Exception/
│ ├── HttpClient/
│ ├── Logger/
│ ├── Provider/
│ ├── Storage/
│ ├── Thirdparty/
│ ├── User/
│ └── (другие файлы из src)
├── lang/ # Языковые файлы
│ ├── socialauth.en.lang.php
│ └── socialauth.ru.lang.php
├── tpl/ # Шаблоны
│ ├── socialauth.login.tpl # Кнопки для входа и регистрации
│ └── socialauth.profile.tpl # Кнопки для профиля (привязка/отвязка)
├── socialauth.php # Основной файл плагина
├── socialauth.setup.php # Установочный файл
└── socialauth.config.php # Конфигурация HybridAuth
Файлы и их содержимое с комментариями
1. socialauth.setup.php
Установочный файл для создания полей в базе данных.
<?php
defined('COT_CODE') or die('Wrong URL.');
// Метаданные плагина
$plugin_title = "SocialAuth"; // Название плагина
$plugin_desc = "User authentication, registration, and social account linking via HybridAuth 3.11."; // Описание
$plugin_version = "1.0.0"; // Версия
$plugin_author = "Your Name"; // Автор
// SQL-запрос для установки: добавляем поля для хранения данных соцсетей
$plugin_install = <<<SQL
ALTER TABLE `cot_users` ADD COLUMN `user_social_id` VARCHAR(255) DEFAULT NULL; -- Уникальный ID соцсети
ALTER TABLE `cot_users` ADD COLUMN `user_social_provider` VARCHAR(50) DEFAULT NULL; -- Название провайдера (Google, Facebook и т.д.)
SQL;
// SQL-запрос для удаления: убираем добавленные поля при деактивации
$plugin_uninstall = <<<SQL
ALTER TABLE `cot_users` DROP COLUMN `user_social_id`;
ALTER TABLE `cot_users` DROP COLUMN `user_social_provider`;
SQL;
2. socialauth.config.php
Конфигурация HybridAuth с настройками провайдеров.
<?php
defined('COT_CODE') or die('Wrong URL.');
// Конфигурация HybridAuth
return [
'base_url' => $cfg['mainurl'] . '/plugins/socialauth/socialauth.php?hauth=done', // URL обратного вызова для HybridAuth
'providers' => [ // Список провайдеров
'Google' => [
'enabled' => true, // Включён
'keys' => [
'id' => 'YOUR_GOOGLE_CLIENT_ID', // Заменить на ваш Client ID
'secret' => 'YOUR_GOOGLE_CLIENT_SECRET', // Заменить на ваш Client Secret
],
'scope' => 'email profile', // Запрашиваемые данные
],
'Facebook' => [
'enabled' => true, // Включён
'keys' => [
'id' => 'YOUR_FACEBOOK_APP_ID', // Заменить на ваш App ID
'secret' => 'YOUR_FACEBOOK_APP_SECRET', // Заменить на ваш App Secret
],
'scope' => 'email', // Запрашиваемые данные
],
// Добавьте другие провайдеры (например, Twitter, VK) по аналогии
],
'debug_mode' => false, // Режим отладки (true для записи логов)
'debug_file' => $cfg['plugins_dir'] . '/socialauth/socialauth.log', // Файл логов
];
3. socialauth.php
Основной файл плагина с логикой авторизации, регистрации и привязки/отвязки.
<?php
defined('COT_CODE') or die('Wrong URL.');
// Подключение необходимых модулей Cotonti
require_once cot_incfile('users', 'module'); // Модуль пользователей
require_once $cfg['system_dir'] . '/cot_config.php'; // Конфигурация системы
require_once $cfg['plugins_dir'] . '/socialauth/lib/hybridauth/Hybridauth.php'; // HybridAuth
use Hybridauth\Hybridauth;
// Получение параметров из запроса
$hauth = cot_import('hauth', 'G', 'TXT'); // Флаг обратного вызова от HybridAuth
$provider = cot_import('provider', 'G', 'TXT'); // Название провайдера (Google, Facebook и т.д.)
$action = cot_import('action', 'G', 'TXT'); // Действие (link/unlink)
// Загрузка конфигурации HybridAuth
$config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';
// Обработка авторизации через соцсети
if ($hauth == 'done' || !empty($provider)) {
try {
$hybridauth = new Hybridauth($config); // Инициализация HybridAuth
// Аутентификация через провайдера
if (!empty($provider)) {
$adapter = $hybridauth->authenticate($provider); // Запуск процесса авторизации
} else {
$adapter = $hybridauth->getAdapter($provider); // Получение адаптера после авторизации
}
$userProfile = $adapter->getUserProfile(); // Получение данных пользователя из соцсети
$socialId = $userProfile->identifier; // Уникальный ID соцсети
$socialProvider = $provider; // Название провайдера
// Проверка, привязан ли этот соц. аккаунт к другому пользователю
$existingUser = $db->query("SELECT * FROM $db_users WHERE user_social_id = ? AND user_social_provider = ?",
[$socialId, $socialProvider])->fetch();
if ($existingUser && $existingUser['user_id'] != $usr['id']) {
// Если аккаунт уже привязан к другому пользователю
cot_error('This social account is already linked to another user.');
$adapter->disconnect();
cot_redirect(cot_url('users', 'm=profile'));
} elseif ($usr['id'] > 0 && $action == 'link') {
// Привязка соцсети к текущему аккаунту
$db->update($db_users, ['user_social_id' => $socialId, 'user_social_provider' => $socialProvider], "user_id = ?", $usr['id']);
cot_message('Social account linked successfully!');
$adapter->disconnect();
cot_redirect(cot_url('users', 'm=profile'));
} elseif ($existingUser) {
// Авторизация существующего пользователя
cot_user_login($existingUser['user_id']);
$adapter->disconnect();
cot_redirect(cot_url('index'));
} else {
// Регистрация нового пользователя
$email = $userProfile->email ?? 'noemail_' . $socialId . '@example.com'; // Email или заглушка
$username = $userProfile->displayName ?? 'user_' . $socialId; // Имя или заглушка
$userdata = [
'user_name' => $username,
'user_email' => $email,
'user_social_id' => $socialId,
'user_social_provider' => $socialProvider,
'user_password' => md5(uniqid()), // Случайный пароль
'user_regdate' => time(),
'user_group' => 4, // Группа по умолчанию
];
$newUserId = cot_user_register($userdata);
if ($newUserId) {
cot_user_login($newUserId);
$adapter->disconnect();
cot_redirect(cot_url('index'));
}
}
} catch (Exception $e) {
cot_error('Authentication failed: ' . $e->getMessage());
cot_redirect($usr['id'] > 0 ? cot_url('users', 'm=profile') : cot_url('login'));
}
}
// Обработка отвязки аккаунта
if ($action == 'unlink' && $usr['id'] > 0) {
$db->update($db_users, ['user_social_id' => null, 'user_social_provider' => null], "user_id = ?", $usr['id']);
cot_message('Social account unlinked successfully!');
cot_redirect(cot_url('users', 'm=profile'));
}
// Хук для страницы входа
$cot_hooks['users.login.tags'][] = 'socialauth_login_tags';
function socialauth_login_tags($tag_prefix = '') {
global $cfg;
$config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';
$t = new XTemplate(cot_tplfile('socialauth.login', 'plug')); // Загрузка шаблона
// Перебор активных провайдеров
foreach ($config['providers'] as $provider => $data) {
if ($data['enabled']) {
$t->assign([
'SOCIAL_PROVIDER' => $provider,
'SOCIAL_LOGIN_URL' => cot_url('plug', "r=socialauth&provider=$provider"),
]);
$t->parse('MAIN.PROVIDERS');
}
}
$t->parse('MAIN');
return $t->text('MAIN');
}
// Хук для страницы профиля
$cot_hooks['users.profile.tags'][] = 'socialauth_profile_tags';
function socialauth_profile_tags($tag_prefix = '') {
global $cfg, $usr, $db, $db_users;
$config = include $cfg['plugins_dir'] . '/socialauth/socialauth.config.php';
$t = new XTemplate(cot_tplfile('socialauth.profile', 'plug')); // Загрузка шаблона профиля
// Получение текущих данных о привязке
$user = $db->query("SELECT user_social_id, user_social_provider FROM $db_users WHERE user_id = ?", [$usr['id']])->fetch();
$linkedProvider = $user['user_social_provider'];
// Перебор активных провайдеров
foreach ($config['providers'] as $provider => $data) {
if ($data['enabled']) {
$isLinked = ($linkedProvider === $provider);
$t->assign([
'SOCIAL_PROVIDER' => $provider,
'SOCIAL_LINK_URL' => cot_url('plug', "r=socialauth&provider=$provider&action=link"),
'SOCIAL_UNLINK_URL' => cot_url('plug', "r=socialauth&action=unlink"),
'SOCIAL_IS_LINKED' => $isLinked,
]);
$t->parse('MAIN.PROVIDERS');
}
}
$t->parse('MAIN');
return $t->text('MAIN');
}
// Вспомогательные функции
function cot_user_login($userid) {
global $db, $db_users, $usr;
$user = $db->query("SELECT * FROM $db_users WHERE user_id = ?", [$userid])->fetch();
$usr['id'] = $user['user_id'];
$usr['name'] = $user['user_name'];
cot_setcookie('cot_uid', $user['user_id'], time() + 63072000); // Куки для ID
cot_setcookie('cot_pass', $user['user_password'], time() + 63072000); // Куки для пароля
}
function cot_user_register($userdata) {
global $db, $db_users;
$db->insert($db_users, $userdata);
return $db->lastInsertId(); // Возвращаем ID нового пользователя
}
4. tpl/socialauth.login.tpl
Шаблон для кнопок входа и регистрации.
<!-- BEGIN: MAIN -->
<div class="social-buttons">
<!-- BEGIN: PROVIDERS -->
<!-- Кнопка для каждого провайдера -->
<a href="{SOCIAL_LOGIN_URL}" class="btn btn-{SOCIAL_PROVIDER|strtolower}">{SOCIAL_PROVIDER}</a>
<!-- END: PROVIDERS -->
</div>
<!-- END: MAIN -->
5. tpl/socialauth.profile.tpl
Шаблон для кнопок привязки/отвязки в профиле.
<!-- BEGIN: MAIN -->
<div class="socialauth-profile">
<h3>Привязка социальных сетей</h3>
<!-- BEGIN: PROVIDERS -->
<div class="social-provider">
<!-- Если соцсеть привязана -->
<!-- IF {SOCIAL_IS_LINKED} -->
<span>{SOCIAL_PROVIDER}: Привязан</span>
<a href="{SOCIAL_UNLINK_URL}" class="btn btn-danger">Отвязать</a>
<!-- Иначе показываем кнопку привязки -->
<!-- ELSE -->
<a href="{SOCIAL_LINK_URL}" class="btn btn-{SOCIAL_PROVIDER|strtolower}">Привязать {SOCIAL_PROVIDER}</a>
<!-- ENDIF -->
</div>
<!-- END: PROVIDERS -->
</div>
<!-- END: MAIN -->
6. lang/socialauth.en.lang.php
Английские переводы.
<?php
$L['Social account linked successfully!'] = 'Social account linked successfully!';
$L['Social account unlinked successfully!'] = 'Social account unlinked successfully!';
$L['Authentication failed'] = 'Authentication failed';
$L['This social account is already linked to another user'] = 'This social account is already linked to another user.';
7. lang/socialauth.ru.lang.php
Русские переводы.
<?php
$L['Social account linked successfully!'] = 'Социальный аккаунт успешно привязан!';
$L['Social account unlinked successfully!'] = 'Социальный аккаунт успешно отвязан!';
$L['Authentication failed'] = 'Ошибка авторизации';
$L['This social account is already linked to another user'] = 'Этот социальный аккаунт уже привязан к другому пользователю.';
Интеграция в шаблоны сайта
Страница входа (themes/ВАША_ТЕМА/users.login.tpl):
html
<div class="login-page">
<h2>{USERS_LOGIN_TITLE}</h2>
<form name="login" action="{USERS_LOGIN_FORM_ACTION}" method="post">
{USERS_LOGIN_FORM_USERNAME}
{USERS_LOGIN_FORM_PASSWORD}
<button type="submit">{PHP.L.Login}</button>
</form>
<div class="social-login">
<h3>Войти через соцсети</h3>
{USERS_LOGIN_SOCIALAUTH}
</div>
</div>
Страница профиля (themes/ВАША_ТЕМА/users.profile.tpl):
html
<div class="profile-page">
<h2>{USERS_PROFILE_TITLE}</h2>
<form name="profile" action="{USERS_PROFILE_FORM_ACTION}" method="post">
{USERS_PROFILE_FORM_USERNAME}
{USERS_PROFILE_FORM_EMAIL}
<button type="submit">{PHP.L.Update}</button>
</form>
{USERS_PROFILE_SOCIALAUTH}
</div>
Установка
Скопируй все файлы в plugins/socialauth/.
Убедись, что lib/hybridauth/ содержит файлы из src HybridAuth 3.11.
Установи плагин через админ-панель (Администрирование → Расширения → SocialAuth).
Настрой API ключи в socialauth.config.php.
Теперь плагин полностью готов к использованию с авторизацией, регистрацией и привязкой/отвязкой соцсетей в профиле!
Comments (0)
Content author
Offline
Sodium Carbonate
Last logged: 2026-07-19 01:57
- Page published: 2025-03-06 00:04
- Last update: 2025-03-06 00:04