[HybridAuth] Сильно улучшенная версия 0.7.0-pl1


Серьёзно обновил компонент социальной авторизации HybridAuth. Переписано и улучшено практически всё, что только можно.

Основное изменение — избавление от action.php и перенос логики авторизации в плагин. Теперь HybridAuth может делать вход\выход пользователю на любой странице сайта.

Обратите внимание, если вы пользуетесь OAuth авторизацией через Google или Яндекс и получаете после обновления ошибку 400 redirect_uri_mismatch — это нормально.

Вам нужно зайти в управление ключами своего сервиса (Google, Яндекс) и заменить адрес редиректа с
http://example.com/assets/components/hybridauth/action.php?hauth.done=Google
на
http://example.com/?hauth.done=Google
Вообще, теперь у всех сервисов такой короткий адрес, отличается только параметр "?hauth.done=Имяпровайдера". Это единственный возможный недостаток обновления, дальше сплошные плюсы.

Улучшения

Добавлен новый сниппет haProfile, в который вынесена логика работы с профилем пользователя. То есть, теперь 2 сниппета: HybridAuth запускает авторизацию, а haProfile редактирует профиль юзера.

Соответственно, немного изменились и параметры. Пропал &action, добавились чанки оформления ссылок авторизации. По хорошему, нужно заменить
[[!HybridAuth?action=`getProfile`]]
на
[[!haProfile]]
но будет работать и так, для совместимости. Сниппет HybridAuth просто вызовет haProfile, если вы не поменяли сниппет на странице.

У сниппета HybridAuth параметр &providers=`` более не обязателен. Если его не указывать, то будут выведены ссылки на всех провайдеров, ключи для которых есть в системных настройках. Ошибка «ha_err_no_providers» появится только если в системе нет ни одного ключа сервиса.

Это удобство достигается тем, что ссылки на авторизацию и привязку сервисов генерируются автоматически. Более того, в комплекте сразу идут стили и иконки для некоторых систем.

  • Стандартный чанк входа

  • Стандартный чанк выхода

А вот редактирование профиля


Как видно, ссылки на привязку сервисов есть и у чанка выхода и у чанка профиля. Если сервис уже привязан — картинка показывается серенькой.

Все автоматизироваться, волноваться не о чем. Ссылки выводит плейсхолдер [[+providers]]. Старые чанки, конечно, тоже работают. Оформление этих ссылок в 2х новых чанках:
  • tpl.HybridAuth.provider — ссылка на авторизацию или привязку сервиса
  • tpl.HybridAuth.provider.active — серенькая иконка уже привязанного провайдера
Во всех чанках HybridAuth можно смело использовать плейсхолдер [[+gravatar]].
Из-за того, что лично мне очень нравится замечательный сервис Gravatar, у объекта haUser теперь есть виртуальное поле gravatar.

То есть, если вам нужна ссылка на картинку юзера в граватаре, делаем так:
$gravatar = $modx->user->get('gravatar');
Конечно, это работает только для тех юзеров, у которых class_key = haUser. Для modUser работать не будет.

Появилась новая системная настройка ha.register_users, которая позволяет отключить регистрацию новых юзеров. Все зарегистрированные будут заходить на сайт, как обычно, а вот никого нового система не пустит.

А если вы заблокируете какого-то юзера — он сразу вылетит из авторизации, при первой же загрузке любой страницы сайта. За это отвечает наш новый плагин.

Исправления

Исправлена ошибка в логах «No foreign key definition for parentClass: modUser using relation alias: Services».

Исправлена ошибка, когда после удаления пакета в логах была ругань на невозможность загрузки основного класса. Теперь такого быть не должно — все удаляется корректно.

Исправлено редактирование профиля. Там был неприятный баг с обнулением значения полей, если не указана максимальная разрешенная длина. Даже странно, что никто не задавал про это вопросов.

Заключение

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

Благодаря возможности генерации ссылок на авторизацию, в скором времени планирую подружить с HybridAuth компонент Office, чтобы можно было заходить не только через почту.

Качаем, как обычно, из нашего репозитория.

Следующая заметка
[Office] Версия 0.9.0-pl с поддержкой HybridAuth
Предыдущая заметка
[miniShop2] Версия 2.1.0-rc: работа без javascript


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

  1. Денис Богдановский 05 сентября 2013, 18:41 # 0
    Отличная новость! Я вообще не понимаю когда вы все успеваете!

    Жду не дождусь дружбы с OFFICE!
    1. Павел Левин 05 сентября 2013, 19:07 # 0
      Спасибо. Молодец!

      Как понял теперь пишем: /?hauth.done=Twitter
      1. Василий Наумкин 05 сентября 2013, 19:21 # 0
        Агась.

        Только твиттеру, по моему, пофиг — он и так работает.
      2. Алексей Карташов 05 сентября 2013, 20:42 # 0
        Новость — класс!

        Но у меня вопрос по редактированию профиля — в сниппете haProfile есть параметр profileFields для указания разрешённых к редактированию полей. А дополнительные поля данных там можно указать?
        Вот эти:
        1. Василий Наумкин 05 сентября 2013, 21:21 # 0
          По идее — это одно поле extended и можно слать туда массив с данными.
          <input name="extended[field1]" value="1" />
          <input name="extended[field2]" value="2" />
          Конечно, нужно его указать в profileFields. Но я не проверял, честно говоря.

          Если кто-то подвесит такой вопрос на github — постараюсь подумать, к следующей версии.
          1. Алексей Карташов 05 сентября 2013, 21:39 # 0
            Тогда продублирую на гитхабе, если не против)
        2. Антон Соловьёв 05 сентября 2013, 21:35 # 0
          А чанки не обновляются, их значит в ручную менять?
          1. Алексей Карташов 05 сентября 2013, 22:02 # 0
            Да, чанки всегда надо руками обновлять, для любого пакета.
            1. Василий Наумкин 05 сентября 2013, 22:05 # 0
              Не совсем так. Это зависит от свойств пакета.

              Лично я чанки не обновляю, но другим ничто не мешает их перезаписывать.
              1. Алексей Карташов 05 сентября 2013, 22:14 # 0
                Точно, протупил) Я просто ещё не так много пакетов собрал. Забыл — там же можно что угодно перезаписыввать)

                offtop. А почему у меня имя зелёненьким стало? Я ведь денюжку ещё не вносил… Закрытые статьи читать не могу, в профиле написано, что я — обычный :-)
                Но имя зелёненькое))
                1. Василий Наумкин 05 сентября 2013, 22:26 # 0
                  Перелогинься, сможешь всё читать.
                  1. Алексей Карташов 05 сентября 2013, 22:33 # 0
                    :-)
                    Это бонус такой?)) За что??)
                    1. Василий Наумкин 05 сентября 2013, 23:02 # 0
                      За всё хорошее, конечно.
                      1. Алексей Карташов 05 сентября 2013, 23:08 # 0
                        Неожиданно! Внезапно, я б даже сказал)
                        Спасибо большое :-)
            2. Василий Наумкин 05 сентября 2013, 22:03 # 0
              Ага.

              Я мог бы их перезаписывать, но многим это не понравится.
            3. Wassi Wassinen 06 сентября 2013, 10:45 # 0
              Картинки хорошо вписались у тебя на сайте. :) Когда планируешь с офисом связать? Куплю сразу. :)
              1. Василий Наумкин 06 сентября 2013, 10:47 # 0
                В данный момент этим и занимаюсь.

                Надеюсь, завтра-послезавтра будет готово.
                1. Василий Наумкин 06 сентября 2013, 18:16 # 0
                  Готово.

                  Получилось даже лучше, чем рассчитывал.
                2. Павел Левин 06 сентября 2013, 12:21 # 0
                  Еще один вопрос.

                  На данный момент у меня выскакивает502 ошибка, хотя ссылка якобы и ведет верно (?hauth_action=login&provider=Twitter), я уже и на хостинг грешил… очень редко когда она срабатывала.

                  Куда копать? Подскажите пожалуйста. Спасибо.
                  1. Василий Наумкин 06 сентября 2013, 12:22 # 0
                    В логи хостера, больше некуда.

                    Ошибка 502 — это проблема с php.
                    1. Павел Левин 06 сентября 2013, 12:29 # 0
                      Видать хост?, была бы php ошибка.
                      12:22:55 [error] 8573#0: *190475386 upstream prematurely closed connection while reading response header from upstream,
                      1. Василий Наумкин 06 сентября 2013, 12:31 # 0
                        Видать, да.

                        Процесс php неожиданно завершается. Пробуй запустить компонент на modx-test.com и если там нет проблем — пора переезжать.
                        1. Павел Левин 06 сентября 2013, 13:10 # 0
                          Хм. Работает, хост не поймет в чем ошибка, логи якобы перехватывает modx… типа php ошибка… бла-бла-бла… я ничего не понял :-(

                          м.б. фаервол?
                          1. Василий Наумкин 06 сентября 2013, 13:39 # 0
                            Ты извини, нет никакого желания разбираться с чужими хостингами.
                  2. Пётр Молчанов 06 сентября 2013, 13:12 # 0
                    А у после обновления всё паламалась. Если указываю провайдеров сам (вот так providers=`Vkontakte,Facebook,Mailru,Google,Twitter`), то сайт падает, просто белая страница. Если провайдеров убрать, то в месте вызова сниппета просто пишется текстом: [HybridAuth] ha_err_no_providers
                    Что я сделал не так?
                    1. Пётр Молчанов 06 сентября 2013, 13:34 # 0
                      Была проблема с правами на папки, переустановил и всё норм. Василий, спасибо за работу!
                      1. Василий Наумкин 06 сентября 2013, 13:38 # 0
                        Напугал, блин!

                        Я уж полез проверять, что такого может страшного быть.
                      2. Павел Левин 06 сентября 2013, 13:35 # 0
                        У сниппета HybridAuth параметр &providers=`` более не обязателен. Если его не указывать, то будут выведены ссылки на всех провайдеров, ключи для которых есть в системных настройках. Ошибка «ha_err_no_providers» появится только если в системе нет ни одного ключа сервиса.
                        Когда я обновлял HybridAuth со старой 5.0 на новую, то он криво обновился, мне пришлось удалить все чанки и весь компонент включая настройки, но то я, а там глядишь и можно по другому.
                        1. Пётр Молчанов 06 сентября 2013, 13:49 # 0
                          Я просто удалил папку компонента /core/components/hybridauth
                      3. Павел Левин 06 сентября 2013, 15:32 # 0
                        Какие должны быть права для папок и файлов? 0755 и 0655? как было предложено при установке движка?
                        1. Павел Левин 08 сентября 2013, 00:15 # 0
                          Подскажите, а HybridAuth ведет какие нибудь логи? если да, то где их найти?
                          1. Павел Левин 08 сентября 2013, 00:43 # 0
                            Включил логирование modx на 4 (DEBUG):
                            [2013-09-08 00:37:00] (WARN @ /index.php) Could not load package metadata for package hybridauth.
                            [2013-09-08 00:37:01] (DEBUG @ /index.php) Language string not found: ""
                            [2013-09-08 00:37:01] (DEBUG @ /index.php) Language string not found: ""
                            ...
                            [2013-09-08 00:39:30] (WARN @ /connectors/system/errorlog.php) Could not load package metadata for package hybridauth.
                            [2013-09-08 00:41:05] (WARN @ /connectors/system/errorlog.php) Could not load package metadata for package hybridauth.
                            
                            Что-то просит, но непонятно что =/
                            1. Василий Наумкин 08 сентября 2013, 07:06 # 0
                              Нафига эти пратянки копипастить? Отредактировал.

                              В чем конкретно у тебя проблема?
                              1. Павел Левин 08 сентября 2013, 13:14 # 0
                                Собственно как не работает hybridauth (проверял на старой и новая версии), так и не хочет работать, а логи не помогают решить эту проблему -__-

                                Изредка бывает пробивается авторизация, а так прерывание, в скрипте имеются ли какие либо ограничения по таймингу или еще что-то?

                                [2013-09-08 01:04:08] (WARN @ /www/eyes/core/components/hybridauth/model/hybridauth/hybridauth.class.php : 88) PHP notice: Array to string conversion
                                1. Василий Наумкин 08 сентября 2013, 18:25 # 0
                                  Вот прям у всех работает, а у тебя одного — нет?

                                  Мистика.

                                  Проверь на modx-test.com — если там работает, проблема у тебя на хостинге.
                                  1. Павел Левин 08 сентября 2013, 22:49 # 0
                                    Работает, проверял, много раз и сравнивал «информацию о системе», логи включал… все фактически 1 в 1, ток не хочет работать у меня.

                                    Возможно и правда мистика и стоит забить на это дело, 3-х дней попыток достаточно =)
                                    1. Василий Наумкин 09 сентября 2013, 05:36 # 0
                                      Может, пора сменить хостера, чтобы не было мистики?
                                    2. Алексей 09 сентября 2013, 15:24 # 0
                                      Василий на твоем сайте такой тоже проскакивает, получилось авторизоваться через гугл с третьего раза, симтомы: пустая страница после разрешения на вход
                                      1. Василий Наумкин 09 сентября 2013, 16:42 # 0
                                        Ну значит, я очень везучий, раз не видел этого ни на одном проекте, включая свой.
                              2. Пётр Молчанов 09 сентября 2013, 14:45 # 0
                                А можно как-то менять порядок вывода соц.сетей? или они просто берутся по порядку как записаны в настройках?
                                1. Василий Наумкин 09 сентября 2013, 14:49 # 0
                                  Укажи нужный порядок в параметре providers.
                                  1. Пётр Молчанов 09 сентября 2013, 16:09 # 0
                                    Указывал, ничего не меняется
                                    1. Василий Наумкин 09 сентября 2013, 16:36 # 0
                                      Да, верно.

                                      Обновись на свежую версию — поправил.
                                      1. Пётр Молчанов 09 сентября 2013, 16:51 # 0
                                        Благодарю за оперативность!
                                2. Сергей 11 сентября 2013, 12:24 # 0
                                  Добрый день а с чем может быть связана эта ошибка.
                                  Есть кнопка авторизации для контакта, и когда мы ее нажимаем то открывается страница, а на ней 502
                                  Вот собственно скриншот
                                  1. Василий Наумкин 11 сентября 2013, 12:29 # 0
                                    Падает php, видимо.

                                    Не знаю, спроси у хостера.
                                  2. Антон Соловьёв 27 сентября 2013, 14:03 # 0
                                    А как быть с мультиязычными сайтами?
                                    Настроил по этой инструкции (знаю, у вас свои способы, но ентот проверенный и уже настроен)
                                    designfromwithin.com/blog/2012/01/12/modx-multilingual-setting-up-babel-and-have-a-website-with-multible-languages/

                                    При регистрации на домен/en/страница_авторизации редериктит на домен/en/en/страница_авторизации у всех провайдеров. авторизации естественно не происходит.
                                    [[+login_url]] даёт правильную ссылку, где /en/ не дублировано… т.е.
                                    <a rel="noindex" class="ha-icon vkontakte" href="http://домен/en/страница_авторизации.html?hauth_action=login&provider=Vkontakte">Vkontakte</a>
                                    Настройки английского контекста

                                    base_url /en/
                                    cultureKey en
                                    site_url домен/en/

                                    причем, если поменять base_url /en/ на base_url /
                                    [[+login_url]] также дублирует /en/

                                    В core/components/hybridauth/model/hybridauth/hybridauth.class.php только это нашёл
                                    function getUrl() {
                                    		$request = preg_replace('#^'.$this->modx->getOption('base_url').'#', '', $_SERVER['REQUEST_URI']);
                                    		$url = $this->modx->getOption('site_url') . ltrim($request, '/');
                                    
                                    		$url .= strpos($url,'?')
                                    			? '&hauth_action='
                                    			: '?hauth_action=';
                                    
                                    		return $url;
                                    	}
                                    htaccess

                                    RewriteCond %{REQUEST_FILENAME} !-f
                                    RewriteCond %{REQUEST_FILENAME} !-d
                                    RewriteRule ^(ru|en)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
                                      
                                    # redirect all requests to /de/favicon.ico and /nl/favicon.ico
                                    # to /favicon.ico
                                    RewriteCond %{REQUEST_FILENAME} !-d
                                    RewriteCond %{REQUEST_FILENAME} !-f
                                    RewriteRule ^(ru|en)/favicon.ico$ favicon.ico [L,QSA]
                                       
                                    # redirect all requests to /de/assets* and /nl/assets* to /assets*
                                    RewriteCond %{REQUEST_FILENAME} !-d
                                    RewriteCond %{REQUEST_FILENAME} !-f
                                    RewriteRule ^(ru|en)/assets(.*)$ assets$2 [L,QSA]
                                      
                                    # redirect all other requests to /de/* and /nl/*
                                    # to index.php and set the cultureKey parameter
                                    RewriteCond %{REQUEST_FILENAME} !-f
                                    RewriteCond %{REQUEST_FILENAME} !-d
                                    RewriteRule ^(ru|en)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
                                    русский домен открывается без /ru/

                                    Ну и плагин для переключения контекстов.
                                    Так как проблему решить? В какой момент en успевает продублироваться? Можно ли для домен/en и для домен зарегистрировать разные приложения в соцсетях, чтобы указать там напр. Разные ссылки входа?
                                    1. Антон Соловьёв 27 сентября 2013, 15:08 # 0
                                      Поставил HybridAuth на 404.
                                      теперь получаю новую приставку при каждом клике на иконку входа.
                                      en/en/en/en/en/en/en/en/
                                    2. Антон Соловьёв 27 сентября 2013, 15:23 # 0
                                      в общем там часто используется $url = $this->modx->getOption('site_url'). substr($_SERVER['REQUEST_URI'],1);
                                      $_SERVER['REQUEST_URI цепляет en. в домен/en/ (а это ведь часть site_url)
                                      и наверное если перевести на en.домен- проблема исчезнет…
                                      может как-то модифицировать, чтоб с домен/en/ работало?
                                      1. Василий Наумкин 27 сентября 2013, 17:09 # 0
                                        У тебя старая версия.

                                        Вот как сейчас генерируется ссылка.
                                        1. Антон Соловьёв 27 сентября 2013, 23:09 # 0
                                          Здорово, на англоязычном домене заработал профиль и пошла регистрация ВК. А остальные провайдеры не хотят.
                                          Переходит например на страницу Твитера, запрашивается авторизация
                                          Открыть приложению домен.ru доступ к вашей учётной записи?
                                          , вроде все как обычно, но авторизации нет.
                                          гугл возвращает
                                          Ошибкаredirect_uri_mismatch

                                          The redirect URI in the request: домен/en/?hauth.done=Google did not match a registered redirect URI
                                          А на русском домене — работает.
                                          Раньше хоть был понятено, в чем проблема. Были site_url — домен/en/, $this->modx->getOption('base_url') — /en/ и $_SERVER['REQUEST_URI']); — /en/страница_авторизации
                                          Все это соединялось, при этом и site_url имел на конце домен/en/ и $_SERVER['REQUEST_URI']); походу получал /en/страница_авторизации Т.о. /en удваивалось, меня редериктело на домен/en/en/страница_авторизации.

                                          $request = preg_replace('#^'.$this->modx->getOption('base_url').'#', '', $_SERVER['REQUEST_URI']);
                                          $url = $this->modx->getOption('site_url') . ltrim($request, '/');
                                          вроде все те же лица, а ошибки, перехода на страницу 404 и удвоения en — нет.
                                          Но и авторизации нет.
                                          А сейчас на домен все ок, на домен/en/ работает только ВК. Может это потому что в соц. сетях прописано домен/?hauth.done=Google? Пробовал менять в Фейсьуке и на гугле на домен/en/?hauth.done=Google
                                          Не помогло.
                                          1. Антон Соловьёв 28 сентября 2013, 08:45 # 0
                                            Ночь прошла- всё кроме гугла работает и в en и в web
                                            1. Василий Наумкин 28 сентября 2013, 09:39 # 0
                                              Что говорит?

                                              В web должно полюбому работать, а в en ругаться на redirect_uri_mismatch.
                                              1. Антон Соловьёв 28 сентября 2013, 11:42 # 0
                                                Если авторизован в админке, то в en работает только Вконтакт. Я на пользователя, зашедшего через вконтат сразу права админа повесил, удобно.
                                                В web всё ок.
                                                Если вышел из админки, то в web все отлично, там вообще без проблем, а в en все, кроме яндекса (нет в списке провайдеров и не настроен) и кроме google нормально заходят.
                                                В гугле да, redirect_uri_mismatch.
                                                Если в code.google.com/apis/console переписать Home page URL: с того, что на web на тот, что на en, то нормально заходит, но уже тока в en. В web соответственно redirect_uri_mismatch
                                                Ну и вы понимаете, вопрос, как подсунуть разный ha.keys.Google, с разными id и Client secret для разных контекстов.
                                                1. Василий Наумкин 28 сентября 2013, 12:16 # 0
                                                  Ну и вы понимаете, вопрос, как подсунуть разный ha.keys.Google, с разными id и Client secret для разных контекстов.
                                                  Качай сегодняшнию версию, там можно указать ключи прямо в контексте и они перекроют системные настройки.

                                                  То есть, теперь у каждого контекста могут быть свои провайдеры авторизации, независимые.
                                                  1. Антон Соловьёв 28 сентября 2013, 12:53 # 0
                                                    — Context settings now can override providers keys in system settings. Very helpful for multiple contexts.
                                                    Спасибо, а как?
                                                    В настройках вроде ничего нового не появилось, параметра тоже не видно…
                                                    Т.е. в настройках контекста попробовать? Ща.
                                                    1. Василий Наумкин 28 сентября 2013, 13:02 # 0
                                                      Нажми на контекст и добавь туда ключ
                                                      1. Антон Соловьёв 28 сентября 2013, 13:12 # 0
                                                        Вроде работает. Спасибо за оперативные обновления.
                                                        1. Василий Наумкин 28 сентября 2013, 13:19 # 0
                                                          На здоровье!
                                      2. Пётр Молчанов 22 ноября 2013, 13:19 # 0
                                        Такой вопрос: как мне исключить возможность восстановления пароля у тех, кто зарегился через социалки? и, соответственно, информировать их об этом, когда пытаются восстановить пароль
                                        1. Чикин Артур 12 декабря 2013, 23:03 # 0
                                          А что тебе мешает отдавать им пароль и давать возможность заходить по логин-паролю?
                                        2. Чикин Артур 12 декабря 2013, 23:26 # 0
                                          <a rel="nofollow" href="[[+login_url]]&provider=[[+title]]" class="ha-icon xa[[+provider]]">[[+title]]</a>
                                          Немного смущает конструкция где
                                          &provider=[[+title]]
                                          Разве не должно быть
                                          &provider=[[+provider]]
                                          1. Василий Наумкин 12 декабря 2013, 23:29 # 0
                                            Нет, не должно.
                                            1. Чикин Артур 12 декабря 2013, 23:44 # 0
                                              Тогда как то не логично…
                                              1. Василий Наумкин 12 декабря 2013, 23:53 # 0
                                                Тебе виднее.
                                          2. Комментарий был удален.
                                            Добавление новых комментариев отключено.