-1.75
Рейтинг
0.11
Сила

Андрей

Кросс-доменная авторизация Livestreet и PhpBBex

Ранее созданное решение (http://altocms.ru/937.html) сделал теперь и для Livestreet.

Задача

Изначально был проект на phpBB(ex), соответственно БД с пользователями, паролями, прочими данными. Теперь проекту в дополнение к форуму необходио создать ещё и главную страницу. Вроде бы задача не сложная, но тем не менее в подобных случаях зачастую решается либо переносом попыткой превратить одного в другое, либо мостообразными костылями.

Мне было необходимо:
— Сохранить БД пользователей (прежде всего пароли)
— Не сливать системы друг с другом, каждая должна иметь возможность продолжить существование независимо от второй.
— Иметь возможность в будущем замены/переноса функционала с одной системы на другую с сохранением данных
— При этом всём провести минимальные вмешательства в код обоих систем
— Иметь кросс-доменную авторизацию

Решение

1. Приведение механизма генерации хешей к единому виду
Так как исторически phpBB был первее и соответственно пользователи все в БД форума, то в Livestreet меняем способ генерации хеша. Добавляем минимально необходимые функции из кода phpBB и производим изменения в экшенах аутентификации и смены пароля через пользовательский профайл.

2. Приведение механизма сессии phpBB к стандартному PHP
Видимо также исторически сложилось, что phpBB(ex) сессию делает хоть и на основе куки, но своим костылём и стандартным php session_id() в отличии от Livestreet не пользуется. Мы не будем программистами, и приведём сессионный механизм форума к стандартному PHP.

3. Настройка cookies
Если системы находятся на разных доменах третьего уровня, то куки необходимо настроить на корневой домен второго уровня, чтобы каждая из систем могла сгенерить ключевую авторизационную куку для соседа. Параллельно в момент авторизации мы кладём user_id каждой из систем в php сессию и добавляем проверку соответствия ключевой куки и данных сессии.

4. Репликация данных в БД
Вешаем триггера на таблицы сессий и данных пользователей, обеспечивая репликацию данных между системами. В Livestreet минимально приходится добавить поле в таблицу _session. В идеале по максимуму добавляются поле в каждой из таблиц участвующих в репликации для защиты от петель.

Результат
В результате получаем плавную репликацию пользовательских данных (при желании репликацию пользовательских данных можно провести полностью), кросс-доменную авторизацию (логин в одной системе даёт возможность попасть во вторую в уже авторизованном состоянии), минимальную нагрузку на HW (триггера и хранимые процедуры отрабатывают быстрее на счёт отсутствия кода php), минимальное вмешательство в обе системы (6 файлов в LS и 2 в phpBBex, 11Кб SQL кода).

В будущем можно как переносить, так и дублировать функционал между системами, обеспечивая возможность сравнения и плавного перехода с одного на другой (например перевести личку с форума на LS).