Pull to refresh

Тупая интеграция phpbb3 с любым сайтом

Reading time 4 min
Views 13K
Рассмотрим стандартную задачу — на сайт с уже существующими пользователями нужно добавить форум. При этом не писать новый модуль самому, но поставить готовое популярное решение типа phpbb3 и синхронизировать регистрацию/авторизацию/профили пользователей сайта с форумом. Минимально нужно, чтобы пользователи сайта стали пользователями форума, и чтобы авторизованный пользователь сайта автоматически становился авторизованным пользователем форума и наоборот, а так же происходила синхронизация при изменении профиля.

В сети есть плагины для синхронизации phpbb и wordpress (WP-United) и универсальные руководства (1,2), но последние, как правило, начинаются словами «скопипастить эти… дцать функций из functions.php» и «вставить в эти 3 таблицы вот такие данные».

Другой метод интеграции — начать использовать таблицы пользователей и методы к ним из phpbb на остальном сайте, но это обычно требует значительных модификаций системы.

Расскажу про свой способ, который тормознее обычных, но зато требует минимальных изменений файлов сайта и форума (по 10 строчек на каждом для подключения файла с классом-синхронизатором в 5кб).

Идея


Проще некуда. Логинимся на сайте — в случае успеха делаем соответствующий запрос к форуму и проставляем куки из ответа. Все. Осталось подсмотреть нужные запросы (с помощью firebug или LiveHTTPHeaders) и найти места для инклудов.

Синхронизатор состоит из двух файлов: сайт->форум (инклудится в файлы сайта) и форум->сайт (инклудится в phpbb). Они содержат статические классы ForumSync и SiteSync соответственно. В каждом классе — 2 паблик-метода: checkToken и sync.

Для моего сайта синхронизатор сайт->форум — forumsync.class.php, форум->сайт — functions_sitesync.php. Эти файлы, а так же файлы, в которые потребовалось внести изменения, выложил здесь. Еще используется класс req для выполнения серий запросов, он лежит здесь.

Тонкости


1. Во многие формы phpbb добавляет защитные переменные creation_time и form_token. Их проверка находится в forum/includes/functions.php->check_form_key(), и она должна быть выключена при запросе синхронизатора. В классе синхронизатора определим секретный ключ, у меня это

md5("lala".date("Ymd"))

и в начало check_form_key добавим проверку на соответствие ему некоторой переменной $_REQUEST[sync_token] (проверка делается в методе SiteSync::checkToken()).

2. Чтобы избежать зацикливания (логин на сайте запрашивает логин на форуме, который запрашивает логин на сайте итд), до отсылки запроса будем проверять SiteSync::checkToken(), если он есть, значит этот запрос делает синхронизатор, и запускать синхронизацию снова уже не нужно.

Подробности


Сайт у каждого свой, поэтому опишу только изменения, которые нужно сделать в файлах phpbb. Это не исчерпывающее пошаговое руководство, но лишь общий принцип. Классы ForumSync и SiteSync все равно нужно менять индивидуально под каждый сайт.

Регистрация: для простоты выключим регистрацию юзеров на phpbb (через админку). Регистрация будет только на сайте. В случае успеха регистрации на сайте вызовем ForumSync::sync(«signup»). В phpbb разрешим регистрацию для синхронизатора, для этого изменим строку в начале forum/includes/ucp/ucp_register.php->ucp_register->main() (где проверка на USER_ACTIVATION_DISABLE):

if ($config['require_activation'] == USER_ACTIVATION_DISABLE && !SiteSync::checkToken())
trigger_error('UCP_REGISTER_DISABLE');

Кроме этого, хорошо бы было получать id нового юзера. В html-коде страницы, отдаваемой в случае успешной регистрации, id пользователя нигде не указан. Поэтому ниже строки $user_id = user_add(...) добавим

if (SiteSync::checkToken()) { echo "<!-- PHPBB_SYNC[user_id=$user_id] -->\n"; }

Авторизация: для синхронизации сайт->форум в phpbb ничего менять не нужно. Для обратной — в forum/functions.php в login_box после логина (проверки на LOGIN_SUCCESS) добавить

SiteSync::sync("signin",array("username"=>$username,"password"=>$password,"autologin"=>$autologin)).

Выход: для синхронизации форум->сайт в forum/ucp.php case 'logout': добавить строку SiteSync::sync("signout").
Изменение пароля и профиля: индивидуально, зависит от того, какая информация в каких таблицах у профилей пользователей на сайте. И какие существуют формы редактирования профиля. Нужные экшены находятся в forum/includes/ucp/ucp_profile.php->ucp_profile->main(), в конце соответствующих кейсов нужно добавить SiteSync::sync.

Слабые стороны


Основной минус — отсутствие транзакций и хотя бы примитивного api. Любые ошибки, возникающие при запросах синхронизатора к phpbb, приходится искать в html-коде. Они зависят от локализации.

В моей системе поддерживаются транзакции, но в phpbb я не нашел стандартного механизма. Если, к примеру, на сайте минимальная длина пароля 6 а на phpbb — 5, и пользователь в phpbb вводит 5-ти символьный пароль, phpbb меняет пароль, сайт отдает ошибку. Нужно делать откат, но это уже не только «дописать одну строчку». Пока что моя система в таких случаях обламывается, поэтому я внимательно проследил, чтобы требования на все синхронизируемые поля совпадали.
Tags:
Hubs:
+23
Comments 25
Comments Comments 25

Articles