HybridAuth для MODX Revolution

Продолжаю трудиться на благо всего человечества, и первую очередь, конечно — себя.

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

И верно, если человек уже зарегистрировался на Google, и не против предоставить оттуда свои ФИО и email — почему бы не использовать?

Поэтому, везде где только можно, я старюсь использовать социальную авторизацию и даже написал сниппет для работы с Loginza.

Однако, с течением времени у этого сниппета стали видны недостатки:
1. Невозможность связать разные учётки одного юзера.
2. Зависимоть от одного сервиса — Loginza, который иногда подгоняет.

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

Плюсы нового сниппета:
1. Огромное количество сервисов авторизации. Можно легко добавить собственый — дело буквально 10 минут.
2. Нет зависимости ни от кого. Если один сервис отключен — можно зайти через другой.
3. Никакого стороннего javascript — всё работает только на php. Можно хорошо кастомизировать форму входа.
4. Привязка разных учеток к одному юзеру, и вход через любую. Можно вообще сделать регистрацию через Login, а потом привязку и вход через HybridAuth.
5. Конечно, работает и самостоятельно. При первом входе создаёт юзера и добавляет потом к нему другие сервисы.

Минуса только два:
1. Нужно настраивать удалённые серсвисы на свой сайт, то есть — получать ключи и пароли для работы авторизации.
2. Никак не совместимо с Loginza, из-за её кривизны (не выдаёт id юзера на удалённом сервисе).

Более подробно про HybridAuth можно прочитать тут.
Исходный код на Guthub.

Следующая заметка
Прощай, Loginza! или HybridAuth 0.3.0
Предыдущая заметка
Обновил Tickets, версия 0.5.0


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

  1. Valentin Rasulov 15 декабря 2012, 18:57 # 0
    гы-гы… тоже его делал, всё руки до финиша не дотягиваются (пример только твит и файсбук www.lerochka.name/home/login.html).
    Удачи тогда в развитии, одну позицию можно у себя вычеркнуть :)
    1. Василий Наумкин 15 декабря 2012, 19:01 # 0
      Я первым делом у тебя в гитхабе поискал — а там пусто.

      Пришлось самому делать.
      1. Алексей 11 апреля 2013, 11:06 # 0
        классный сайт!
      2. Valentin Rasulov 15 декабря 2012, 19:09 # 0
        нормально всё, у меня руки не доходят, там пустышка на гитбахе.
        Ведь главное, ни кто начал (можно пятилетку тянуть), главное кто закончил!..
        А если логика одинаковая, то не вижу смысла своё допиливать, буду твоим пользоваться.
        1. Илья Уткин 15 декабря 2012, 20:39 # 0
          Привязывал аккаунт через гугл с телефона. Перекинуло на страничку, где сначала вылез такой код pastebin.com/e3uS8v34 (прям на самой странице) а только потом «безумкин запрашивает данные. Подтвердить, отменить.» Может, гугл сам, конечно, глюканул…
          1. Василий Наумкин 15 декабря 2012, 21:46 # 0
            Судя по коду — это исходник странички про «запрашивает данные».

            Видимо, телефону она тяжело далась =)
          2. Andrei Kilin 15 декабря 2012, 21:10 # 0
            Присоединил. Косяков не было.
            1. Василий Наумкин 15 декабря 2012, 21:46 # 0
              Отлично, спасибо!
            2. Игорь Зябко 15 декабря 2012, 22:00 # 0
              Все ок!
              1. Дмитрий Кудинкин 15 декабря 2012, 22:05 # 0
                Привязал яндекс. Вроде сработало.
                1. Дмитрий Кудинкин 15 декабря 2012, 22:06 # 0
                  На гугле страшная фраза — «запрашивает управление вашими контактами»
                  1. Василий Наумкин 15 декабря 2012, 22:58 # 0
                    У-ха-ха!!!
                    1. Дмитрий Кудинкин 15 декабря 2012, 23:05 # 0
                      «Кто такой генерал Файлура и что он ищет на моих дисках!» :-))
                  2. Denys Butenko 16 декабря 2012, 15:21 # 0
                    Twitter привязался нормально)
                    1. Александр Наумов 16 декабря 2012, 20:35 # 0
                      Все отлично!
                      1. Пётр Молчанов 19 декабря 2012, 11:43 # 0
                        При авторизации через гугл в логе вылезает такая ошибка:
                        [HybridAuth] Unable to create user Array (тут массив данных). Message:
                        Я так думаю в месаге что-то должно писаться?))) Могу предположить, что не создался пользователь, т.к. с таким мыло уже есть, я угадал? Тогда следует: вопрос как безболезненно поставить этот сниппет вместо логинзы, т.е. с сохранением существующих акков? Еще было бы клево реализовать проверку, если человек, авторизовавшись, прикручивает еще какую-нить соц. сеть, проверялось бы то, что он уже регился у нас через неё до этого и этот бы акк удалялся и всё прикручивалось к одному акку
                        1. Пётр Молчанов 20 декабря 2012, 10:37 # 0
                          Что-то не получается подключить твитер и мэйлру, вроде делаю как на видео, но при клике на авторизацию выдается просто белый экран, несколько раз проверил ключи, пересмотрел пару раз видео… хз в чем проблема, гугл сделал, а всё остальное не получается. и хз как выявить ошибку, т.к. логи не пишутся, просто белый экран(((
                          1. Василий Наумкин 20 декабря 2012, 11:22 # 0
                            Пропишите в Index.php
                            ini_set('display_errors', 1);
                            ini_set('error_reporting', -1);
                            
                            И будете видеть все ошибки.
                            1. Пётр Молчанов 20 декабря 2012, 15:20 # 0
                              прописал в самом начале index.php но всё равно везде пустота, никаких ошибок не пишет…
                              Кстати, у гугла надо писать Redirect URIs: вашсайт/assets/components/hybridauth/action.php?hauth.done=Google
                        2. Дмитрий Христоев 14 мая 2013, 16:00 # 0
                          Здравствуйте! Скажите плиз
                          — если я сделал 2 языка и переключалку через Babel, я авторизируюсь под одним языком, перехожу на второй, нужна авторизация. Можно как-то сделать авторизацию под 1 языком?
                          — не могу понять, как сделать редактирование профиля? Хочу сделать так, авторизация, и редирект на страницу профиля, для обязательного заполнения поля мыла.

                          Спасибо
                          1. Muratov T 24 июня 2013, 13:40 # 0
                            что вы скажете о cackle.me? У них же аналогичное расширение?
                            1. Воеводский Михаил 24 июня 2013, 14:21 # 0
                              В корне иное:
                              1. Платное. HybridAuth бесплатен.
                              2. Комментирование. HybridAuth только для авторизации. Для комментирования Tickets.

                              В cackle.me хранение комментов на внешнем сервере. Tickets все хранит в БД Вашего сайта.
                            2. Снежана 01 сентября 2013, 13:29 # 0
                              Подскажите пожалуйста, если можно прям с ссылками, где брать ключи для остальных соц. аккаунтов?

                              Ничего не понимаю :(
                              1. Роман 27 октября 2013, 13:19 # 0
                                как залогиниться через соцсети понятно из видео. А как сделать возможность выбора: логиниться просто так или через сервисы?
                                1. Воеводский Михаил 27 октября 2013, 14:11 # 0
                                  Сделать вызов [[Login]] по мануалу, а рядом вызвать НА для соц.сервисов.
                                  1. Роман 27 октября 2013, 14:14 # 0
                                    Спасибо. Буду пробовать.
                                2. Роман 27 октября 2013, 14:16 # 0
                                  Еще вопрос возник: на видео настройке проекта в Твиттере мы добавляем ссылку на файл action.php Чего-то я его не могу найти :-( И еще, это во всех сервисах на него надо ссылаться, или для каждого сервиса свой исполняемый файл?
                                  1. булдаков сергей 23 ноября 2013, 11:02 # 0
                                    Всем привет, устанавливал пак и из репозитария Симпл Дрим и из офф репозитария (версия 0.8.5), в /assets/components/hybridauth/ нет action.php Что же делать теперь? )
                                    1. Василий Наумкин 23 ноября 2013, 11:07 # 0
                                      Почитать описание на сайте.
                                    2. Nikolay Zuev 23 ноября 2013, 12:45 # 0
                                      При логине через facebook дописывает к адресу страницы это #_=_
                                      На Вашем сайте тоже самое
                                      И ещё непонятно — прописал провайдера Mail ссылка получилась
                                      <a href="http://sait.ru/south-amerika.html?hauth_action=login&provider=Mail" class="ha-icon mail" rel="nofollow" title="Mail">Mail</a>
                                      А выводит иконку facebook
                                      1. Nikolay Zuev 23 ноября 2013, 13:01 # 0
                                        Пробовал ставить провайдера Mailru тоже непонятно какую иконку выводит
                                      2. Дарья Брандина 03 апреля 2014, 16:10 # 0
                                        Василий, замечательный компонент, активно пользуюсь им! Но у меня такой вопрос: а почему аватарку нельзя получать таким же путем, как все другие данные? Ведь логика все та же — если можно получить доступ к почте, логину, имени пользователя, то почему нельзя получить доступ к его аватарке? Очень неудобно и долго подгружать аватарку отдельно.
                                        1. Василий Наумкин 03 апреля 2014, 16:20 # 0
                                          У меня встречный вопрос — а откуда информация, что аватарка не получается тем же путем?

                                          Что сервис отдаёт — то и сохраняется, и аватарка в том числе.
                                          1. Дарья Брандина 03 апреля 2014, 17:08 # 0
                                            Отлично! это то, что я и хотела узнать :)
                                            А если я хочу получить не основную аватарку, а ее маленькую копию (которая в комментариях рядом с именем обычно показывается), как-то к ней можно обратиться?
                                            1. Игорь Козлов 03 апреля 2014, 18:09 # 0
                                              Да, конечно. Необходимо править исходники самого провайдера, к примеру ля вконтакта файл по адресу
                                              core/components/hybridauth/model/hybridauth/lib/Providers/Vkontakte.php
                                              строка 95
                                              $this->user->profile->photoURL      = (property_exists($response,'photo_rec'))?$response->photo_rec:"";
                                              В документации написано, что доступны следующие:
                                              Поле photo
                                              Выдаётся url фотографии пользователя, имеющей ширину 50 пикселей.
                                              В случае отсутствия у пользователя фотографии выдаётся ответ: «images/question_c.gif»

                                              Поле photo_medium
                                              Выдаётся url фотографии пользователя, имеющей ширину 100 пикселей.
                                              В случае отсутствия у пользователя фотографии выдаётся ответ: «images/question_b.gif»

                                              Поле photo_medium_rec
                                              Выдаётся url квадратной фотографии пользователя, имеющей ширину 100 пикселей.
                                              В случае отсутствия у пользователя фотографии выдаётся ответ: «images/question_b.gif»

                                              Поле photo_big
                                              Выдаётся url фотографии пользователя, имеющей ширину 200 пикселей.
                                              В случае отсутствия у пользователя фотографии выдаётся ответ: «images/question_a.gif»

                                              Поле photo_rec
                                              Выдаётся url квадратной фотографии пользователя, имеющей ширину 50 пикселей.
                                              В случае отсутствия у пользователя фотографии выдаётся ответ: «images/question_a.gif»
                                              1. Дарья Брандина 04 апреля 2014, 09:27 # 0
                                                Заменила в 95 строке файла core/components/hybridauth/model/hybridauth/lib/Providers/Vkontakte.php photo_big на photo_rec, но аватара все равно подставляется большого размера.
                                                1. Дарья Брандина 04 апреля 2014, 09:31 # 0
                                                  Может для тех, кто уже ранее был авторизован, и загружена была большая ава, маленькая ава уже не подгрузится?
                                                  1. Пётр Молчанов 04 апреля 2014, 10:40 # 0
                                                    Новые правила будут действовать только для новых пользователей. Для уже зареганых можно написать плагин что ль
                                                    1. Дарья Брандина 04 апреля 2014, 10:41 # 0
                                                      Или, если пользователей 3,5 штуки, просто удалить и заново залогинить)
                                                2. Дарья Брандина 04 апреля 2014, 09:41 # 0
                                                  Кстати, в документации, ссылку на которую вы дали, описаны другие поля:

                                                  Поле photo_50
                                                  Выдаётся url квадратной фотографии пользователя, имеющей ширину 50 пикселей.
                                                  В случае отсутствия у пользователя фотографии выдаётся ответ: «vkontakte.ru/images/camera_c.gif»

                                                  Поле photo_100
                                                  Выдаётся url квадратной фотографии пользователя, имеющей ширину 100 пикселей.
                                                  В случае отсутствия у пользователя фотографии выдаётся ответ: «vkontakte.ru/images/camera_b.gif»

                                                  Поле photo_200_orig
                                                  Выдаётся url фотографии пользователя, имеющей ширину 200 пикселей.
                                                  В случае отсутствия у пользователя фотографии выдаётся ответ: «vkontakte.ru/images/camera_a.gif»

                                                  Поле photo_200
                                                  Выдаётся url квадратной фотографии пользователя, имеющей ширину 200 пикселей.
                                                  Если фотография была загружена давно, фотографии с такими размерами может не быть, в этом случае будет возвращено false.
                                                  Поле photo_400_orig
                                                  Выдаётся url фотографии пользователя, имеющей ширину 400 пикселей.
                                                  В случае отсутствия у пользователя фотографии такого размера поле возвращено не будет.

                                                  Поле photo_max
                                                  Выдаётся url квадратной фотографии пользователя, максимального размера. Может быть возвращена фотография имеющая ширину как 200 так и 100 пикселей.
                                                  В случае отсутствия у пользователя фотографии выдаётся ответ: «vkontakte.ru/images/camera_b.gif»

                                                  Поле photo_max_orig
                                                  Выдаётся url фотографии пользователя, максимального размера. Может быть возвращена фотография имеющая ширину как 400 так и 200 пикселей.
                                                  В случае отсутствия у пользователя фотографии выдаётся ответ: «vkontakte.ru/images/camera_a.gif»
                                                  1. Дарья Брандина 04 апреля 2014, 10:54 # 0
                                                    Чтобы можно было использовать эти поля (например, photo_100), надо в строке 81 файла core/components/hybridauth/model/hybridauth/lib/Providers/Vkontakte.php указать их через запятую, например:
                                                    $params['fields'] = 'first_name,last_name,nickname,screen_name,sex,bdate,timezone,photo_rec,photo_big,photo_100';
                                          2. Олег Песчанский 15 апреля 2014, 11:40 # +1
                                            Пользователь добавляется с группой '0', не смотря на установленный параметр groups.
                                            В коде нашел функцию setUserGroups в файле create.class.php, но она нигде не вызывается.
                                            Что-то я не так делаю, или недочет в модуле?
                                            1. Олег Песчанский 15 апреля 2014, 12:48 # 0
                                              Вывожу $config в конструкторе в файле hybridauth.class.php. В момент добавления нового пользователя (например, когда в адресной строке ?hauth_action=login&provider=Vkontakte) парамент groups почему-то пустой. Просто при загрузке страницы, где вызывается сниппет, параметр groups у меня имеет знаечение Users.
                                              Почему так?
                                              1. Олег Песчанский 15 апреля 2014, 13:54 # 0
                                                Пока пришлось вручную в файле hybridauth.class.php в 27 строке прописать:
                                                'groups' => 'Users'
                                                Что бы пользователи добавлялись к группе Users.
                                                1. Олег Песчанский 15 апреля 2014, 14:33 # 0
                                                  Странно, даже так перестало работать, прописал прямо в функции Login в строке 239 тоже самое 'groups' => 'Users', так работает.
                                                  1. Василий Наумкин 15 апреля 2014, 14:43 # 0
                                                    Я уже давно понял, что мои дополнения работают как надо только у меня.

                                                    Видать, такая у них особенность.
                                                    1. Олег Песчанский 15 апреля 2014, 14:48 # 0
                                                      То есть идей, почему параметр groups игнорируется нет?
                                                      1. Василий Наумкин 15 апреля 2014, 14:49 # 0
                                                        У меня нет идей, почему параметр игнорируется у тебя.

                                                        На этом сайте HybridAuth работает с момента создания — и проблем, как видишь, нет.
                                                        1. Олег Песчанский 15 апреля 2014, 14:54 # 0
                                                          Эх, рассчитывал на помощь!
                                                          Делал все по инструкции, тем более просто там все, негде даже запутаться, а в результате вот такая непонятка(
                                                          Тебе в любом случае спасибо за дополнение. Но хотелось бы разобраться в моей проблеме.
                                                          1. Василий Наумкин 15 апреля 2014, 14:54 # 0
                                                            Попробуй сделать всё заново на test.modx.pro — очень часто помогает.
                                                            1. Олег Песчанский 15 апреля 2014, 15:09 # 0
                                                              На тестовом работает, так и думал.
                                                              Это может быть связано с тем, что у меня версия modx 2.2.9, а тут 2.2.14?
                                                              1. Василий Наумкин 15 апреля 2014, 15:10 # 0
                                                                Всё может быть.

                                                                В любом случае, обновляться нужно — в старых версиях есть серьёзные уязвимости.
                                                                1. Олег Песчанский 15 апреля 2014, 15:12 # 0
                                                                  Спасибо за совет!
                                                2. Ivan Parshin 22 октября 2014, 23:15 # 0
                                                  Один в один та же проблема, modx самый что ни на есть распоследний 2.3.1-pl. Решил так же. Хостинг — vps (обычный debian самонастроеный). Зная что php не самый лучший в мире язык, предполагаю что это его проделки.
                                                3. Vladimir Alekhin 10 июля 2014, 13:15 # 0
                                                  добрый день, проблемы с поиском, помогите найти документацию, как создать новый провайдер на OPENID. Или может кто то уже делал провайдер для wargaming openid?
                                                    1. Vladimir Alekhin 10 июля 2014, 13:45 # 0
                                                      может сможете подсказать, после создания провайдера, как его подключить, как его использовать? как вызвать сниппет с этим провайдером?
                                                      1. Василий Наумкин 10 июля 2014, 13:48 # 0
                                                        Делай всё по аналогии с другими провайдерами — их в комплекте очень много.

                                                        Документация здесь.
                                                        1. Vladimir Alekhin 10 июля 2014, 16:23 # +1
                                                          Подскажите, что я делаю не правильно:
                                                          Создал файл с провыайдером, назвал его… Wargaming
                                                          закинул в /core/components/hybridauth/model/hybridauth/lib/Providers

                                                          в настройках системы создал новый ключ для провайдера с необходимым секреткеем,

                                                          в шаблоне вызвал [[!HybridAuth? &providers='Wargaming']]

                                                          и чуда не произошло…
                                                  1. Константин Ильин 14 августа 2014, 22:03 # 0
                                                    Всем Привет!
                                                    REVO 2.3.1
                                                    Login и HybridAuth последние версии
                                                    Вот дошел таки до таких сложностей как авторизация и регистрация…
                                                    HybridAuth — установил, в контакте создал приложение, получил ключи, вставил, все заработало авторизировался(зарегистрировался). Все ок.

                                                    Теперь хочу через Login войти без «вконтакте», ввожу id аккаунта вконтакте пароль от него же, но он отказывается…

                                                    HybridAuth — берет пароль от контакта? (т.е. если пароль от контакта 123890, то после первой авторизации(через HybridAuth), в Login нужно вводить id и пароль 123890)? какой пароль в Login вводить?
                                                    если я регистрируюсь через Login, как потом связать его с HybridAuth?

                                                    Вот пример того что я имею ввиду — , в плане регистрации(авторизации).
                                                    Подскажите как это реализовать.

                                                    1. Василий Наумкин 14 августа 2014, 22:12 # 0
                                                      ru.wikipedia.org/wiki/OAuth — никто не берет твой пароль от вконтакта.

                                                      если я регистрируюсь через Login, как потом связать его с HybridAuth?
                                                      Через сниппет haProfile.
                                                      1. Константин Ильин 14 августа 2014, 22:22 # 0
                                                        а как обратно привязать т.е. я зашел через HybridAuth, после хочу через Login.

                                                        В таблице юзеров есть запись с class_key = haUser, я так понимаю Loginэту запись не использует?
                                                        1. Василий Наумкин 15 августа 2014, 05:35 # 0
                                                          Не знаю, Login не использую.

                                                          По идее, если человек зарегистрировался через Login, то у него есть логин и пароль — они должны по прежнему работать.

                                                          Если же он регистрировался через HybridAuth, то входить теперь сможет только через него, ну или нужно делать сброс пароля.
                                                          1. Константин Ильин 24 августа 2014, 13:11 # 0
                                                            А что используете если не секрет?

                                                            Что-то не получается в гркппу пользователей добавить через гибрид. Пробывал:
                                                            [[!HybridAuth? &groups=`Users:Member`]]
                                                            [[!HybridAuth? &groups=`Users`]]
                                                            В ручную добавляю пользователя в эту группу, все ок нужные страницы отображаются.
                                                            MODX 2.3.1

                                                            если я регистрируюсь через Login, как потом связать его с HybridAuth?
                                                            Через сниппет haProfile.
                                                            Каким образом это сделать? Залогинился(через логин) в haProfile нажал на кнопку VK к примеру?
                                                            1. Василий Наумкин 24 августа 2014, 14:12 # 0
                                                              А что используете если не секрет?
                                                              store.simpledream.ru/office

                                                              Что-то не получается в гркппу пользователей добавить
                                                              [[!HybridAuth? &groups=`Users:1`]]
                                                              Это работает только при регистрации нового юзера, а не при входе уже существующего.

                                                              Залогинился(через логин) в haProfile нажал на кнопку VK к примеру?
                                                              Именно.
                                                              1. Константин Ильин 24 августа 2014, 21:29 # 0
                                                                Спасибо за ответы Василий.

                                                                [[!HybridAuth? &groups=`Users:1`]]Это работает только при регистрации нового юзера, а не при входе уже существующего.
                                                                Это я изначально то понял. Я удаляю из системы пользователя и пытаюсь зарегится по новой, все равно не пашет. Даже права перезагружал от безысходности…
                                                                Хм… в чем я накосячил блин…
                                                                1. Василий Наумкин 24 августа 2014, 21:38 # 0
                                                                  Не знаю, никто не жаловался.
                                                                  1. Володя 24 августа 2014, 22:20 # 0
                                                                    Надеюсь ты не пытаешся зарегиться с email админа сайта?
                                                                    1. Константин Ильин 24 августа 2014, 23:01 # 0
                                                                      нет конечно открыл в firefox-е админку, в гугле регюсь
                                                      Добавление новых комментариев отключено.