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

Как известно, мы потихоньку работаем над новым проектом сообщества MODX Revolution, которое будет располагаться по адресу 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 позаботится о единой авторизации.

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

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

Следующая заметка
[msDiscount] 1.0.2-pl Сниппет «Успей купить»
Предыдущая заметка
[orderPrint] Печать документов магазина


Комментарии ()

  1. Wassi Wassinen 12 марта 2014, 16:28 # 0
    Василий, я правильно понимаю, если у меня есть корпоративный сервер почты с веб-мордой и своим ЛДАП-сервером, я могу авторизовывать с него?
    1. Василий Наумкин 12 марта 2014, 16:45 # 0
      Если у тебя там веб-сайт на MODX, связанный с этим всем — конечно.
    2. Чикин Артур 12 марта 2014, 17:14 # 0
      Круто круто круто круто. Чувствую релиз MODX.pro уже не загорами:) Пойду сегодня возьму себя в руки и ночью причешу документацию.
      1. Чикин Артур 12 марта 2014, 17:17 # 0
        Начал авторизироваться на st.modx.pro прошло сек 20 и вылетело 504 Gateway Time-out

        Update: Со 2 раза сработала авторизация.
        1. Володя 12 марта 2014, 17:22 # 0
          Авторизовался нормально. Единственное с аватарками не понял…
          joxi.ru/ZF8gU_3JTJC9FZGidlk
          Сверху с граватара я так понимаю подтягивается, а фото с gmail подсосалось… какое из них где будет? Или все так и должно быть?
          Авторизовался через gmail…
          1. Василий Наумкин 12 марта 2014, 17:27 # 0
            У меня на сайте везде используется gravatar.

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

            Хотя… Щас попробую поменять.
            1. Чикин Артур 12 марта 2014, 17:38 # 0
              Не удачная пока что затея, так как большая часть фоток отдается через соц сети, то они все разного размера. От 70x70 до 200x319. У меня блок с права выгляди как то через чур огромным.

              1. Василий Наумкин 12 марта 2014, 17:40 # 0
                Размеры то поправил, а вот пропорции только вручную перезагружать. Зато в профиле можно удалить картинку и будет граватаровская.

                В любом случае, надо ж протестить новую фишку =)
                1. Чикин Артур 12 марта 2014, 17:46 # 0
                  Не плохо бы выбор сделать что выводить всем на обозрение [[+gravatar]] или [[+photo]]

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

                  Надо будет только тогда ясно дать понять что регистрация только через email а авторизация уже через соц сети после привязки.
            2. Чикин Артур 12 марта 2014, 17:29 # 0
              Когда ты в первый раз авторизировался modx запомнил твою аватарку из первого авторизированного профиля соц сети. А вот на сайте везде подтягивается аватарка из Gravatar.

              Я предположу что везде в комментариях будет выводится Gravatar фото\рисунок, а вот в профиле на сайте modx.pro фотка загруженная\взятая из соц сети.
              1. Володя 12 марта 2014, 17:48 # 0
                Как Василий сделает так и будет!)))
                P.s. Вот я и с фоткой…
            3. Володя 12 марта 2014, 17:49 # 0
              Василий ты меня с собой «скрестил» ))) Смотри — joxi.ru/2WUgU_3JTJAcdKXC9ak
              1. Василий Наумкин 12 марта 2014, 18:06 # 0
                Поправил кэширование. Ну и твоя фотка отдаёт 404.
                1. Василий Наумкин 12 марта 2014, 18:19 # 0
                  Ты в курсе, что твою картинку не видно?
                2. Володя 12 марта 2014, 18:22 # 0
                  у меня видно))) joxi.ru/iW0gUxjKTJDOKZR2nxo
                  1. Чикин Артур 12 марта 2014, 18:23 # 0
                    Гугл что то намудрил…
                    1. Василий Наумкин 12 марта 2014, 18:23 # 0
                      Это говорит о том, что твоя картинка приватна.

                      Посмотри комменты из анонимного режима.
                      1. Володя 12 марта 2014, 18:27 # 0
                        ексель моксель… и точно!
                        1. Володя 12 марта 2014, 18:29 # 0
                          проверка снятия приватности или Гюлчатай открой личико… номер раз
                          1. Василий Наумкин 12 марта 2014, 18:45 # 0
                            Не страдай фигней, загрузи нормально файл в профиль.
                    2. Чикин Артур 12 марта 2014, 18:28 # 0
                      Не обновляется имя в профиле на id.modx.pro Логин и email как надо а вот если имя то пишет что изменения вступили в силу а на самом деле нет.
                      1. Володя 12 марта 2014, 18:33 # 0
                        Ну у меня тоже так же, только полное имя редактируется
                        1. Василий Наумкин 12 марта 2014, 18:44 # 0
                          Спасибо, поправил!
                          1. Володя 12 марта 2014, 18:45 # 0
                            работает! Супер!)
                          2. Чикин Артур 12 марта 2014, 18:51 # 0
                            Проверка
                          3. Alex Vakhitov 12 марта 2014, 18:55 # 0
                            Классная штука. А как ты справляешься с тестированием? На чем пишешь тесты для modx?
                            1. Василий Наумкин 12 марта 2014, 18:59 # 0
                              А я их не пишу, пока еще справляюсь с вашей помощью.

                              Да и не совсем понятно, как вот такое тестировать?
                              1. Alex Vakhitov 12 марта 2014, 19:03 # 0
                                Так и тестировать, создавать аккаунты соцсетей и ими регистрироваться, писать комментарии, загружать картинки, менять данные и тд. и тп.

                                1. Василий Наумкин 12 марта 2014, 19:08 # 0
                                  Ну вот мы сейчас этим и занимаемся.
                                  1. Alex Vakhitov 12 марта 2014, 19:11 # 0
                                    Просто это помогает выловить все ошибки и баги еще до выхода приложения в свет, и можно спокойно не торопясь все исправить.
                                    1. Василий Наумкин 12 марта 2014, 19:21 # 0
                                      Буду иметь в виду, спасибо.
                                      1. Alex Vakhitov 14 марта 2014, 16:15 # 0
                                        Вообще советую посмотреть на методику continuous integration, при большом количестве разных проетов/дополнений над которыми работаешь и работаешь долгосрочно очень экономит время. Автотесты рулят, особенно при частом добавлении функционала с сохранением старого.
                            2. Чикин Артур 12 марта 2014, 19:05 # 0
                              Не знаю на сколько это критично но стоит подумать. На данный момент можно изменить аватарку вставив прямую ссылку в input photo. Эту своеобразная уязвимость может использоваться с помощью jpeg сниффера и собирать информацию о пользователях.
                              1. Василий Наумкин 12 марта 2014, 19:09 # 0
                                Спасибо, подумаю!
                                1. Чикин Артур 12 марта 2014, 19:15 # 0
                                  Если новое фото != старому фото и начинается с http|https|ftp|//: не начинается с / то не обновлять фото.

                                  Кстати может к загрузки фото прикрутить jcrop? или аналог? что бы можно было самому выбрать какую часть картинки обрезать для загрузки.
                              2. Сергей Шлоков 12 марта 2014, 19:15 # 0
                                Теперь вся история профиля тю-тю — публикаций 0, комментариев 0. Все нажитое непосильным трудом :(
                                1. Чикин Артур 12 марта 2014, 19:16 # +1
                                  Это потому что ты заново зарегался, а не просто авторизировался. Я вот например ничего не потерял.
                                  1. Василий Наумкин 12 марта 2014, 19:22 # 0
                                    Авторизуйся через тот же соцсервис, что и раньше.
                                    1. Сергей Шлоков 12 марта 2014, 19:45 # 0
                                      Ура нашел, зря за валидолом в аптеку бегал. :)
                                      1. Чикин Артур 12 марта 2014, 20:00 # 0
                                        ОГО 2178+ учетных записей на bezumkin.ru!
                                    2. Максим Франц 13 марта 2014, 11:57 # 0
                                      Подскажите по логике работы
                                      1) привычной связки логин//пароль нету?
                                      2) каждый раз для входа на сайт пользователь запрашивает письмо с ссылкой? Сколько живет сессия?
                                      3) Если пользователь первый раз сделал заказ «анонимно» (указал в заказе свой емайл), то учетная запись на этот емайл создалась автоматически и потом заходя в свой кабинет пользователь увидит свои операции?
                                      4) Office заменяет HybridAuth или дополняет?
                                      1. Василий Наумкин 13 марта 2014, 13:26 # 0
                                        1. Нету. никто не запоминает сложные пароли, а от простых смысла нет. Вход по почте удобен и безопасен, тем более с привязкой соцсервисов.

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

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

                                        4. Скорее, HybridAuth дополняет Office.
                                      2. Соловьев Антон 17 марта 2014, 18:17 # 0
                                        Не смог авторизовваться через Фейсбук, как обычно.
                                        Выдает ошибку.
                                        Ошибка
                                        App Not Setup: The developers of this app have not set up this app properly for Facebook Login.
                                        1. Василий Наумкин 17 марта 2014, 18:19 # 0
                                          Проверил — меня авторизует и больше никто не жаловался.
                                          1. Чикин Артур 17 марта 2014, 18:29 # 0
                                            Подтверждаю, авторизация через Фейсбук не работает.



                                            Для тебя авторизация может срабатывать только потому что ты владелец приложения, то есть sudo.
                                            1. Василий Наумкин 17 марта 2014, 18:43 # 0
                                              Спасибо, починил.
                                              1. Антон Соловьёв 17 марта 2014, 21:34 # 0
                                                Ок, я через Фейсбук вошел. У меня два ящика: спамоотвод и личный. В профиле фейсбука записан первый, и он же был зарегистрирован здесь при авторизации ч-з фесбук. А в репазитории я зарегистрировал личный и он же зарегистрировался в новом профиле, созданным сегодня, когда я проходил здесь авторизацию по ВК. Итого у меня уже три профиля.
                                                Я конечно могу про два просто забыть или по крайней мере про созданный сегодня, но может можно как-то свести все к одному профилю, а два других грохнуть?
                                                1. Василий Наумкин 17 марта 2014, 21:36 # +1
                                                  Ты предлагаешь мне заняться твоими ящиками?

                                                  Сам нарегистрировал — сам и разбирайся.
                                                  1. Чикин Артур 18 марта 2014, 08:10 # 0
                                                    Профиль в репозитории никак не связан с профилем id.modx.pro и того тебе уже нужно 2 профиля. на счет профиля ВК я могу сказать что уже 2 профиля тебе нужны. что касается профиля с вк. Что тебе мешает зайти на id.modx.pro и перепривязать свой профиль в вк? Тогда у тебя уже будет 2 профиля и оба нужных. Это если я тебя правильно понял.
                                          2. Чикин Артур 18 марта 2014, 08:26 # 0
                                            Ну вот ты зашел на сайт через ВК. Создалась новая учетная запись. Ты начинаешь пользоваться ей авторизируясь только через ВК. При этом у тебя есть профиль в Google, Facebook, Twitter, Yandex и дофигище других. Но привязать к аккаунту их ты не торопишься и даже не собираешься. А потом когда ломается вход через ВК. Ты заходишь на сайт через Facebook который не был привязан к учетной записи и начинаешь жаловаться что создалась новая учетка.

                                            Я не понимаю. В чем проблема то? Исходники авторизации лежат в открытом доступе. Как хранятся email и профили от соц сетей тоже известно. В чем проблема то была сразу все привязать и не мучить себя?!
                                            1. Антон Соловьёв 18 марта 2014, 09:31 # 0
                                              Да у меня-то сейчас вообще никаких проблем нету и я могу благополучно забить на лишний созданный профиль. Это будет самое простое и удобное нерешение.
                                              На входе написано:
                                              Чтобы не плодить учетные записи на сервисах, мы сделали авторизацию через один общий сервер.
                                              Создать профиль ВК я был вынужден, чтобы сообщить о проблеме со входом через ФБ. Я вижу, что таки создался новый профиль и таки плодитцо лишняя учетная запись и ее надо как-то удалить, бо она лишняя. Но вот кнопки «удалить профиль» я не вижу. Переопределить — это зологиниться под ФБ, войти в настройки профиля и кликнуть на ВК? И вчерашний профиль тогда затретцо? Мне-то все равно, но непорядок. Но если Василию пофик, то мне тем более.
                                              1. Василий Наумкин 18 марта 2014, 09:43 # 0
                                                Переопределить — это зологиниться под ФБ, войти в настройки профиля и кликнуть на ВК?
                                                Именно.

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

                                                А пустые профили никуда не денутся — но это просто строчка в БД.
                                                1. Чикин Артур 18 марта 2014, 11:14 # 0
                                                  А пустые профили никуда не денутся — но это просто строчка в БД.
                                                  Которую можно удалить через пару лет когда их под копится больше и оптимизация БД будет полезна.
                                                2. Чикин Артур 18 марта 2014, 11:22 # 0
                                                  Создать профиль ВК я был вынужден, чтобы сообщить о проблеме со входом через ФБ.
                                                  Помимо авторизации через соц сервисы там есть авторизация через Email. Если ты не хочешь создавать лишнюю учетку то почему не авторизировался именно так?!
                                                  1. Антон Соловьёв 18 марта 2014, 13:23 # 0
                                                    Потому что во-первых уже авторизовался через ВК, во-вторых интересно, только ФБ не работал или и другие сети.
                                                3. Abu 18 марта 2014, 19:31 # 0
                                                  У меня у одного, если браузер был закрыт, приходится логинится заново? Раньше вроде такого не было.
                                                  1. Чикин Артур 18 марта 2014, 21:05 # 0
                                                    Смотри настройки браузера.
                                                  Добавление новых комментариев отключено.