[HybridAuth] Версия 1.0.0-rc без объекта haUser

На днях Николай Ланец выпустил свой компонент социальной авторизации modHybridAuth, и объяснил, зачем:
Во-первых, HybridAuth не умеет работать с родным для MODX-а компонентом Login.
Во-вторых, HybridAuth использует расширенные классы modUser, что ИМХО не есть круто, о чем я говорил уже не раз. Чем не круто? Как минимум тем, что объект пользователя не может быть инстансом сразу двух расширяющих классов. То есть если в какой-то момент появится желание использовать еще один пакет, расширяющий класс modUser, вам придется выбирать какой из этих двух пакетов использовать, так как одновременно они работать не смогут.
Первый пункт не совсем понятен. HybridAuth — самостоятельное дополнение, а не hook для Login. Они прекрасно работают вместе, и юзер, созданный через Login, может привязать к своему профилю соцсети и входить через них.
И без Login всё отлично работает — есть все нужные функции, включая редактирование профиля. Зачем устанавливать Login, если у вас на сайте вход только через соцсети?
Так что, первый пункт — скорее достоинство, а вот по поводу второго я согласен полностью.
Моя версия HybridAuth была выпущена давно, аж в 2012 году и расширение класса modUser я использовал для изменения алгоритма проверки пароля.
В то время я просто не знал, что это можно сделать через плагин вот таким способом:
case 'OnWebAuthentication':
$modx->event->_output = !empty($_SESSION['HybridAuth']['verified']);
unset($_SESSION['HybridAuth']['verified']);
break;Ну а сегодня этот метод давно проверен в Office, так что необходимость в haUser отпала и я рад предложить вам версию 1.0.0, в которой этот недостаток исправлен. Что изменилось?
При установке обновления все имеющиеся haUser превращаются в modUser. Связи с профилями доступны по прежнему как Services.
Для текущего юзера:
foreach ($modx->user->Services as $service) {
print_r($service->toArray());
}Для любого другого юзера
$user_id = 10;
if ($user = $modx->getObject('modUser', $user_id)) {
$services = $user->getMany('Services');
foreach ($services as $service) {
print_r($service->toArray());
}
}Добавление composite связи работает через указание в metadata.mysql.php. Что то подобное я уже делал в miniShop2, с его расширением товаров, ну а тут Николай предложил еще один симпатичный вариант.
Из недостатков — больше нет возможности получить gravatar вот так
$user->get('gravatar');Но в сниппетах он генерируется, конечно:
'gravatar' => 'https://gravatar.com/avatar/' . md5(strtolower($profile['email']))Так же в плагинах на создание и обновление юзера переменная с объектом больше не $hauser, а просто $user — как и у оригинальных процессоров.
Ну а в остальном всё по-прежнему. Обновление должно пройти гладко и никто из пользователей его не заметит.
Заключение
Версия уже протестирована на bezumkin.ru и modx.pro, правда и там, и там HybridAuth работает в связке с Office, но это не влияет на смену класса и вход через соцсети.
Все доступные провайдеры вот здесь, документация по подключению некоторых из них вот здесь.
Обновляйтесь, пишите отзывы.
Комментарии: 34
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Fi1osofВот в том-то и прикол, что не всегда люди хотят свои соцпрофили палить, и некоторые предпочитают обычную регистрацию. Не стоит исключать одно ради другого, это вместе дружит нормально.
А вот здесь, если можно, поподробней. Ты имеешь ввиду зарегиться юзером обычным способом, а потом в личном кабинете привязать соцпрофиль? Но у меня задача стояла чуть другая — обеспечить сразу регистрацию через Login. Зачем? А затем, чтобы не плодить два отдельных механизма. То есть есть Login-форма, через которую можно зарегиться обычным способом, а можно через нее зарегиться и социальным профилем. И вот тут как раз и всплывает та несовместимость, о которой я говорил: Login не использует родной процессор для регистрации пользователей, и следовательно не выполняются родные плагин-ивенты, когда бы можно было вклиниться в процесс регистрации. По этой причине в modHybridAuth входит сниппет-хук для Login-а.
Но в целом на мой пакет можно забивать, потому что он как и многие мои пакеты будет сопровождаться lowcontext-документацией и требованиями к программному уровню :)
P.S. Так, на заметку: не знаю, поправил ты или нет, но на modxcloud.com твой пакет барахлил из-за известных их проблем с сессиями, он у меня тупо не работал там.
Если потом админ поставит Login, то юзер сможет сбросить через него пароль и входить и по нему, и через соцсеть.
2. Login уже стоит, юзер входит\регистрируется через него, а потом привязывает соцсети в редактировании профиля.
Механизм везде един — создание юзера через процессор security/user/create. Конечно, немного расширенным для HybridAuth, но юзер полностью валидный.
Ну я могу только поздравить авторов Login с таким решением. Еще один повод его не использовать.
Да, поправил, это из-за php-apc.
Fi1osofОК, с этим ясно.
Ну, писал его никто иной, как Шон МакКормик, а он как известно не последнее место в команде MODX занимал. Просто пакет старый, и тоже тогда еще не было class-based процессоров, а потом перепиливать не стали.
Довольно странно не пользоваться системными решениями, особенно, если ты один из архитекторов системы. Я всегда думал, что процессоры для того и нужны — стандартизировать рутинные операции.
Fi1osofИ главное — это не class-based процессор, в нем прописаны проверки прав, и простой или неавторизованный пользователь просто не сможет создать нового пользователя. В данном случае эти проверки не перегрузить, а давать права всем подряд — не секурно.
Странно, всё-таки, что до сих пор не переделали.
Fi1osofНапример:
Пользователь авторизовался и поработал с двумя аккаунтами поочередно.
1. Google 2. Yandex
Будучи авторизованным в одном (1.Google) и привязывая дополнительный (2. Yandex), то пользователя (2. Yandex) мы теряем навсегда.
Если на сайте есть Login или Office, то можно авторизоваться во вторую учетку через них, и привязать соцсеть обратно.
Если нет — пусть в таком случае пишет админу и тот перепривязывает его вручную, для этого нужно просто сменить internalKey в соответствующей записи таблицы HybridAuth.
Fi1osofFi1osofА почему в примере для остальных пользователей не написал просто foreach ($user->Services as $service) {…, а по старинке $user->getMany('Services');? Не привык еще к новому методу, или какие-то другие причины есть?
xPDOObject::getMany() привычнее и нагляднее.
Fi1osofПросто в разных случаях ты по разному написал, вот мне и стало интересно.
Если бы писал в PhpStorm — было бы в одном стиле, он бы меня поправил =)
Fi1osofФон на картинке color-icons.png тока белый стал.
А в прошлых версиях прозрачный был.
Картинка с прозрачным фоном думаю будет более актуальной.
Это в прошлого коммита — Илья прислал такие, а я не проследил. Поправлю, спасибо!
Поправил, забирай файлы с прозрачным фоном. Еще немного подожду сообщений об ошибах и выпущу финальную версию с ними.
Больше никто о проблемах не сообщал, ошибок в логе не вижу.
Была установлена версия 0.5, далее произведен апгрейд на 1.0, в опциях сабжа указаны провайдеры — гугл, яндекс, твиттер, вконтакт, фейсбук и линкедин. Вызывался сабж таким образом [[!HybridAuth? &providers=`Twitter`]], но после обновления из всех доступных провайдеров вызываются только Гугл, Яндекс и Линкедин. И при указание всех провайдеров, и без указание оных.
Ошибок в логе никаких не выводится.
Подскажите пожалуйста, куда копать?
Но как сделать вот эту простую регистрацию, как на store.simpledream.ru, когда нужно ввести только email, и потом подтвердить его ссылкой на почте?
Картинку заменил, чтобы никого больше не смущать.
Спасибо за ответ!
хотя у Вас на хостинге авторизируется без проблем. Возможно это связано с редиректом на id.modx.pro и обратно