По плану, на этот домен отходит и документация, и тестовые сайты и загрузка картинок, и множество тикетов с моего сайта (да-да, я про вопросы).
Очевидно, что делать такой проект на одной копии движка а) сложно и б) небезопасно. Поэтому все сервисы рассредоточены по разным инсталляциям и даже серверам. Если злой хакер сломает один сервис — остальные будут работать.
Сразу встаёт вопрос: а как быть с пользователями при таком раскладе? Каждый раз авторизоваться и где-то в фоне синхронизировать? А как сюда подключить bezumkin.ru, ведь modx.pro не сможет выставить авторизационные куки для чужого домена?
В общем, я решил написать удалённую авторизацию для любых сайтов MODX, по образу и подобию TM ID.
Авторизация через другой сайт
В отличии от других разработчиков сообществ, мы сразу делимся готовыми решениями: иногда за деньги, но в основном бесплатно. То есть, даже процесс разработки сайта для сообщеста уже приносит пользу этому самому сообществу — такой подход.Итак, идея заключается в том, что на сайте-клиенте и сайте-сервере запускаются 2 сниппета, которые позволяют авторизовать клиента через сервер.
Так как у нас уже есть мощный пакет для организации личного кабинета, новый функционал логично вписался в платный Office. Теперь у него 2 новых сниппета:
officeRemoteServer
Этот сниппет запускается на сервере, через который будут заходить пользователи. Адрес, на котором вызван этот сниппет, должен быть указан у клиента — пускай это будет site.com/remote/login, для примера.При переходе клиента на сервер, тот проверяет статус авторизации. Если к нам пришел гость — он редиректится на страницу логина сервера (если она не указана — то на родитель документа — site.com/remote/).
Там вы можете использовать officeAuth, HybridAuth, Login — что угодно, лишь бы авторизовать юзера.
Сразу после авторизации юзер должен быть отправлен обратно на site.com/remote/login — и там уже сниппет получит информацию о нем, сохранит в кэш на 10 секунд, сгенерирует авторизационный токен и отправит юзера с ним по тому адресу, с которого он пришел.
Параметры:
- &hosts — Список доменов, через запятую, которым можно обращаться к сниппету
- &key — Любая непустая строка для шифрования данных, должна быть одинакова у сервера и клиента
- &authId — Id страницы с формой авторизации на сервере. По умолчанию — родитель того документа, на котором вызван officeRemoteServer.
Выходит, что на сервере у нас две страницы:
site.com/remote/ (id = 1)
[[!officeAuth? &loginResourceId=`2` ]]
site.com/remote/login (id = 2)
[[!officeRemoteServer? &hosts=`site2.ru` &key=`h4O58eqwt987Jmqewj` &authId=`1` ]]
officeRemoteAuth
Этот сниппет показывает форму входа и выхода.В форме входа должна быть авторизационная ссылка site.com/remote/login, при переходе по которой юзер начинает авторизацию. Если всё в порядке — он авторизуется на сервере и возвращается на клиент с токеном, по которому клиент может получить информацию о пользователе у сервера.
Эта информация шифруется указанным ключом &key, и после получения данных пользователь создается\обновляется и авторизуется уже на клиенте.
При выходе с сайта клиента по такому же алгоритму (только без обмена информацией о юзере) происходит выход и с сервера.
Большинство параметров совпадает с officeAuth (чанки, группы, контексты, запоминать и т.д.), но есть и уникальные:
- &updateUser — Обновлять ли профиль юзера данными с сервера. Можно отключить, если вы хотите рулить профилями на клиенте.
- &createUser — Создавать ли новых пользователей, если их нет в БД клиента.
- &remote — Адрес для удалённой авторизации. В нашем примере — site.com/remote/login
- &key — Ключ шифрования, который указан на странице авторизации сервера
[[!officeRemoteAuth? &key=`h4O58eqwt987Jmqewj` &remote=`http://site.com/remote/login` &groups=`Users` ]]
Проверить как это все работает можно на моём сайте и на Файлохранилище. Пользователь на удалённом сервере и на клиенте связываются через поле remote_key объекта modUser.
Другие изменения
Есть еще несколько приятных изменений компонента.С новой версии имена юзеров не обязательно их email. Вы можете включить это в системных настройках, но по умолчанию имена отдельно, почта отдельно. Требование об уникальности почтового ящика никуда не делось.
Из этого следует возможность менять имя пользователя в сниппете officeProfile, а заодно и добавлена загрузка аватарок! Правила генерации картинок смотрите в новых параметрах сниппета.

Улучшена обработка ошибок. Теперь форма входа покажет текст проблемы, если вы не смогли зайти через HybridAuth.
Чанки переписаны для Bootstrap 3, добавлена возможность их перезаписать при обновлении пакета.
Заключение
Не знаю, есть ли такая продвинутая авторизация в других движках — лично мне не встречалась. Но в MODX вы теперь можете сделать очень большой портал, разнесенный на разные домены, сайты и серверы — Office позаботится о единой авторизации.Кто уже купил компонент, спокойно обновляются на новую версию, все остальные желающие — добро пожаловать в наш магазин.
Задавайте вопросы, пишите отзывы.
← Следующая заметка
[msDiscount] 1.0.2-pl Сниппет «Успей купить»
[msDiscount] 1.0.2-pl Сниппет «Успей купить»
Предыдущая заметка →
[orderPrint] Печать документов магазина
[orderPrint] Печать документов магазина
Update: Со 2 раза сработала авторизация.
joxi.ru/ZF8gU_3JTJC9FZGidlk
Сверху с граватара я так понимаю подтягивается, а фото с gmail подсосалось… какое из них где будет? Или все так и должно быть?
Авторизовался через gmail…
Переходить на поле photo пока не планирую.Ну а в будущем сообществе — посмотрим, может и photo будет использоваться.Хотя… Щас попробую поменять.
В любом случае, надо ж протестить новую фишку =)
Я думаю тут самый оптимальный вариант это регестрировать только через office по email, а вот после регистрации пользователь пускай сам загрузит картинку в профиль. Тогда можно будет контролировать размеры получаемых изображений в [[+photo]]
Надо будет только тогда ясно дать понять что регистрация только через email а авторизация уже через соц сети после привязки.
Я предположу что везде в комментариях будет выводится Gravatar фото\рисунок, а вот в профиле на сайте modx.pro фотка загруженная\взятая из соц сети.
P.s. Вот я и с фоткой…
Посмотри комменты из анонимного режима.
Да и не совсем понятно, как вот такое тестировать?
начинается с http|https|ftp|//:не начинается с / то не обновлять фото.Кстати может к загрузки фото прикрутить jcrop? или аналог? что бы можно было самому выбрать какую часть картинки обрезать для загрузки.
1) привычной связки логин//пароль нету?
2) каждый раз для входа на сайт пользователь запрашивает письмо с ссылкой? Сколько живет сессия?
3) Если пользователь первый раз сделал заказ «анонимно» (указал в заказе свой емайл), то учетная запись на этот емайл создалась автоматически и потом заходя в свой кабинет пользователь увидит свои операции?
4) Office заменяет HybridAuth или дополняет?
2. Или письмо, или соцсервис — по желанию. Сессия живет, сколько указано в настройках MODX, по умолчанию — 7 дней.
3. Да, сразу после установки Office все покупатели увидят свои заказы, оформленные на их email.
4. Скорее, HybridAuth дополняет Office.
Выдает ошибку.
Для тебя авторизация может срабатывать только потому что ты владелец приложения, то есть sudo.
Я конечно могу про два просто забыть или по крайней мере про созданный сегодня, но может можно как-то свести все к одному профилю, а два других грохнуть?
Сам нарегистрировал — сам и разбирайся.
Я не понимаю. В чем проблема то? Исходники авторизации лежат в открытом доступе. Как хранятся email и профили от соц сетей тоже известно. В чем проблема то была сразу все привязать и не мучить себя?!
На входе написано: Создать профиль ВК я был вынужден, чтобы сообщить о проблеме со входом через ФБ. Я вижу, что таки создался новый профиль и таки плодитцо лишняя учетная запись и ее надо как-то удалить, бо она лишняя. Но вот кнопки «удалить профиль» я не вижу. Переопределить — это зологиниться под ФБ, войти в настройки профиля и кликнуть на ВК? И вчерашний профиль тогда затретцо? Мне-то все равно, но непорядок. Но если Василию пофик, то мне тем более.
Смысл этой затеи не заставлять тебя регистрироваться на st.modx.pro, bezumkin.ru, modx.pro и других проектах, если они будут — везде единая учетка.
А пустые профили никуда не денутся — но это просто строчка в БД.