[Office] Версия 1.0.0-beta Удалённая авторизация

Как известно, мы потихоньку работаем над новым проектом сообщества MODX Revolution, которое будет располагаться по адресу http://modx.pro.

По плану, на этот домен отходит и документация, и тестовые сайты и загрузка картинок, и множество тикетов с моего сайта (да-да, я про вопросы).

Очевидно, что делать такой проект на одной копии движка а) сложно и б) небезопасно. Поэтому все сервисы рассредоточены по разным инсталляциям и даже серверам. Если злой хакер сломает один сервис - остальные будут работать.

Сразу встаёт вопрос: а как быть с пользователями при таком раскладе? Каждый раз авторизоваться и где-то в фоне синхронизировать? А как сюда подключить 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.

У сниппета авторизации нужно указать &loginResourceId=id страницы site.com/remote/login.

Выходит, что на сервере у нас две страницы: 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 позаботится о единой авторизации.

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

Задавайте вопросы, пишите отзывы.

← Предыдущая заметка
[orderPrint] Печать документов магазина
Следующая заметка →
[msDiscount] 1.0.2-pl Сниппет «Успей купить»
Комментарии (57)
Wassi Wassinen
12.03.2014 12:28

Василий, я правильно понимаю, если у меня есть корпоративный сервер почты с веб-мордой и своим ЛДАП-сервером, я могу авторизовывать с него?

bezumkinВасилий Наумкин
12.03.2014 12:45

Если у тебя там веб-сайт на MODX, связанный с этим всем - конечно.

Чикин Артур
12.03.2014 13:14

Круто круто круто круто. Чувствую релиз MODX.pro уже не загорами:) Пойду сегодня возьму себя в руки и ночью причешу документацию.

Чикин Артур
12.03.2014 13:17

Начал авторизироваться на file.modx.pro прошло сек 20 и вылетело 504 Gateway Time-out

Update: Со 2 раза сработала авторизация.

ВолодянВолодя
12.03.2014 13:22

Авторизовался нормально. Единственное с аватарками не понял... http://joxi.ru/ZF8gU\_3JTJC9FZGidlk Сверху с граватара я так понимаю подтягивается, а фото с gmail подсосалось... какое из них где будет? Или все так и должно быть? Авторизовался через gmail...

bezumkinВасилий Наумкин
12.03.2014 13:27

У меня на сайте везде используется gravatar.

Переходить на поле photo пока не планирую. Ну а в будущем сообществе - посмотрим, может и photo будет использоваться.

Хотя... Щас попробую поменять.

Чикин Артур
12.03.2014 13:38

Не удачная пока что затея, так как большая часть фоток отдается через соц сети, то они все разного размера. От 70x70 до 200x319. У меня блок с права выгляди как то через чур огромным.

bezumkinВасилий Наумкин
12.03.2014 13:40

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

В любом случае, надо ж протестить новую фишку =)

Чикин Артур
12.03.2014 13:46

Не плохо бы выбор сделать что выводить всем на обозрение [[+gravatar]] или [[+photo]]

Я думаю тут самый оптимальный вариант это регестрировать только через office по email, а вот после регистрации пользователь пускай сам загрузит картинку в профиль. Тогда можно будет контролировать размеры получаемых изображений в [[+photo]]

Надо будет только тогда ясно дать понять что регистрация только через email а авторизация уже через соц сети после привязки.

Чикин Артур
12.03.2014 13:29

Когда ты в первый раз авторизировался modx запомнил твою аватарку из первого авторизированного профиля соц сети. А вот на сайте везде подтягивается аватарка из Gravatar.

Я предположу что везде в комментариях будет выводится Gravatar фото\рисунок, а вот в профиле на сайте modx.pro фотка загруженная\взятая из соц сети.

ВолодянВолодя
12.03.2014 13:48

Как Василий сделает так и будет!))) P.s. Вот я и с фоткой...

ВолодянВолодя
12.03.2014 13:49

Василий ты меня с собой "скрестил" ))) Смотри - http://joxi.ru/2WUgU\_3JTJAcdKXC9ak

bezumkinВасилий Наумкин
12.03.2014 14:06

Поправил кэширование. Ну и твоя фотка отдаёт 404.

bezumkinВасилий Наумкин
12.03.2014 14:19

Ты в курсе, что твою картинку не видно?

ВолодянВолодя
12.03.2014 14:22

у меня видно))) http://joxi.ru/iW0gUxjKTJDOKZR2nxo

Чикин Артур
12.03.2014 14:23

Гугл что то намудрил...

bezumkinВасилий Наумкин
12.03.2014 14:23

Это говорит о том, что твоя картинка приватна.

Посмотри комменты из анонимного режима.

ВолодянВолодя
12.03.2014 14:27

ексель моксель... и точно!

ВолодянВолодя
12.03.2014 14:29

проверка снятия приватности или Гюлчатай открой личико...номер раз

bezumkinВасилий Наумкин
12.03.2014 14:45

Не страдай фигней, загрузи нормально файл в профиль.

Чикин Артур
12.03.2014 14:28

Не обновляется имя в профиле на id.modx.pro Логин и email как надо а вот если имя то пишет что изменения вступили в силу а на самом деле нет.

ВолодянВолодя
12.03.2014 14:33

Ну у меня тоже так же, только полное имя редактируется

bezumkinВасилий Наумкин
12.03.2014 14:44

Спасибо, поправил!

ВолодянВолодя
12.03.2014 14:45

работает! Супер!)

Чикин Артур
12.03.2014 14:51

Проверка

alex.vakhitovAlex Vakhitov
12.03.2014 14:55

Классная штука. А как ты справляешься с тестированием? На чем пишешь тесты для modx?

bezumkinВасилий Наумкин
12.03.2014 14:59

А я их не пишу, пока еще справляюсь с вашей помощью.

Да и не совсем понятно, как вот такое тестировать?

alex.vakhitovAlex Vakhitov
12.03.2014 15:03

Так и тестировать, создавать аккаунты соцсетей и ими регистрироваться, писать комментарии, загружать картинки, менять данные и тд. и тп.

bezumkinВасилий Наумкин
12.03.2014 15:08

Ну вот мы сейчас этим и занимаемся.

alex.vakhitovAlex Vakhitov
12.03.2014 15:11

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

bezumkinВасилий Наумкин
12.03.2014 15:21

Буду иметь в виду, спасибо.

alex.vakhitovAlex Vakhitov
14.03.2014 12:15

Вообще советую посмотреть на методику continuous integration, при большом количестве разных проетов/дополнений над которыми работаешь и работаешь долгосрочно очень экономит время. Автотесты рулят, особенно при частом добавлении функционала с сохранением старого.

Чикин Артур
12.03.2014 15:05

Не знаю на сколько это критично но стоит подумать. На данный момент можно изменить аватарку вставив прямую ссылку в input photo. Эту своеобразная уязвимость может использоваться с помощью jpeg сниффера и собирать информацию о пользователях.

bezumkinВасилий Наумкин
12.03.2014 15:09

Спасибо, подумаю!

Чикин Артур
12.03.2014 15:15

Если новое фото != старому фото и начинается с http|https|ftp|//: не начинается с / то не обновлять фото.

Кстати может к загрузки фото прикрутить jcrop? или аналог? что бы можно было самому выбрать какую часть картинки обрезать для загрузки.

sergant210@bk.ruСергей Шлоков
12.03.2014 15:15

Теперь вся история профиля тю-тю - публикаций 0, комментариев 0. Все нажитое непосильным трудом :(

Чикин Артур
12.03.2014 15:16

Это потому что ты заново зарегался, а не просто авторизировался. Я вот например ничего не потерял.

bezumkinВасилий Наумкин
12.03.2014 15:22

Авторизуйся через тот же соцсервис, что и раньше.

sergantСергей Шлоков
12.03.2014 15:45

Ура нашел, зря за валидолом в аптеку бегал. :)

Чикин Артур
12.03.2014 16:00

ОГО 2178+ учетных записей на bezumkin.ru!

Максим Франц
13.03.2014 07:57

Подскажите по логике работы 1) привычной связки логин//пароль нету? 2) каждый раз для входа на сайт пользователь запрашивает письмо с ссылкой? Сколько живет сессия? 3) Если пользователь первый раз сделал заказ "анонимно" (указал в заказе свой емайл), то учетная запись на этот емайл создалась автоматически и потом заходя в свой кабинет пользователь увидит свои операции? 4) Office заменяет HybridAuth или дополняет?

bezumkinВасилий Наумкин
13.03.2014 09:26

1. Нету. никто не запоминает сложные пароли, а от простых смысла нет. Вход по почте удобен и безопасен, тем более с привязкой соцсервисов.

2. Или письмо, или соцсервис - по желанию. Сессия живет, сколько указано в настройках MODX, по умолчанию - 7 дней.

3. Да, сразу после установки Office все покупатели увидят свои заказы, оформленные на их email.

4. Скорее, HybridAuth дополняет Office.

antoxa.85@list.ruСоловьев Антон
17.03.2014 14:17

Не смог авторизовваться через Фейсбук, как обычно. Выдает ошибку.

Ошибка App Not Setup: The developers of this app have not set up this app properly for Facebook Login.

bezumkinВасилий Наумкин
17.03.2014 14:19

Проверил - меня авторизует и больше никто не жаловался.

Чикин Артур
17.03.2014 14:29

Подтверждаю, авторизация через Фейсбук не работает.

Для тебя авторизация может срабатывать только потому что ты владелец приложения, то есть sudo.

bezumkinВасилий Наумкин
17.03.2014 14:43

Спасибо, починил.

Антон СоловьёвАнтон Соловьёв
17.03.2014 17:34

Ок, я через Фейсбук вошел. У меня два ящика: спамоотвод и личный. В профиле фейсбука записан первый, и он же был зарегистрирован здесь при авторизации ч-з фесбук. А в репазитории я зарегистрировал личный и он же зарегистрировался в новом профиле, созданным сегодня, когда я проходил здесь авторизацию по ВК. Итого у меня уже три профиля. Я конечно могу про два просто забыть или по крайней мере про созданный сегодня, но может можно как-то свести все к одному профилю, а два других грохнуть?

bezumkinВасилий Наумкин
17.03.2014 17:36

Ты предлагаешь мне заняться твоими ящиками?

Сам нарегистрировал - сам и разбирайся.

Чикин Артур
18.03.2014 04:10

Профиль в репозитории никак не связан с профилем id.modx.pro и того тебе уже нужно 2 профиля. на счет профиля ВК я могу сказать что уже 2 профиля тебе нужны. что касается профиля с вк. Что тебе мешает зайти на id.modx.pro и перепривязать свой профиль в вк? Тогда у тебя уже будет 2 профиля и оба нужных. Это если я тебя правильно понял.

Чикин Артур
18.03.2014 04:26

Ну вот ты зашел на сайт через ВК. Создалась новая учетная запись. Ты начинаешь пользоваться ей авторизируясь только через ВК. При этом у тебя есть профиль в Google, Facebook, Twitter, Yandex и дофигище других. Но привязать к аккаунту их ты не торопишься и даже не собираешься. А потом когда ломается вход через ВК. Ты заходишь на сайт через Facebook который не был привязан к учетной записи и начинаешь жаловаться что создалась новая учетка.

Я не понимаю. В чем проблема то? Исходники авторизации лежат в открытом доступе. Как хранятся email и профили от соц сетей тоже известно. В чем проблема то была сразу все привязать и не мучить себя?!

Антон СоловьёвАнтон Соловьёв
18.03.2014 05:31

Да у меня-то сейчас вообще никаких проблем нету и я могу благополучно забить на лишний созданный профиль. Это будет самое простое и удобное нерешение. На входе написано:

Чтобы не плодить учетные записи на сервисах, мы сделали авторизацию через один общий сервер.

Создать профиль ВК я был вынужден, чтобы сообщить о проблеме со входом через ФБ. Я вижу, что таки создался новый профиль и таки плодитцо лишняя учетная запись и ее надо как-то удалить, бо она лишняя. Но вот кнопки "удалить профиль" я не вижу. Переопределить - это зологиниться под ФБ, войти в настройки профиля и кликнуть на ВК? И вчерашний профиль тогда затретцо? Мне-то все равно, но непорядок. Но если Василию пофик, то мне тем более.

bezumkinВасилий Наумкин
18.03.2014 05:43

Переопределить — это зологиниться под ФБ, войти в настройки профиля и кликнуть на ВК?

Именно.

Смысл этой затеи не заставлять тебя регистрироваться на file.modx.pro, bezumkin.ru, modx.pro и других проектах, если они будут - везде единая учетка.

А пустые профили никуда не денутся - но это просто строчка в БД.

Чикин Артур
18.03.2014 07:14

А пустые профили никуда не денутся — но это просто строчка в БД.

Которую можно удалить через пару лет когда их под копится больше и оптимизация БД будет полезна.

Чикин Артур
18.03.2014 07:22

Создать профиль ВК я был вынужден, чтобы сообщить о проблеме со входом через ФБ.

Помимо авторизации через соц сервисы там есть авторизация через Email. Если ты не хочешь создавать лишнюю учетку то почему не авторизировался именно так?!

Антон СоловьёвАнтон Соловьёв
18.03.2014 09:23

Потому что во-первых уже авторизовался через ВК, во-вторых интересно, только ФБ не работал или и другие сети.

RasulAbu
18.03.2014 15:31

У меня у одного, если браузер был закрыт, приходится логинится заново? Раньше вроде такого не было.

Чикин Артур
18.03.2014 17:05

Смотри настройки браузера.

bezumkin
Василий Наумкин
04.07.2022 23:34
Что-то странное у тебя произошло: миграция есть, и вроде как выполнена, но таблицы при этом отсутств...
inetlover
Александр Наумов
03.07.2022 20:36
Василий, спасибо! Все понятно!
bezumkin
Василий Наумкин
02.07.2022 20:28
Спасибо, поправил!
bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать "friendly URL aliases", используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.