Единая авторизация пользователей с поддержкой нескольких сервисов

    Yii EAuth extension При реализации одного из проектов на Yii framework у меня возникла задача сделать регистрацию и авторизацию пользователей через сторонние сервисы (Google, Facebook, Twitter, etc).

    У данной задачи есть два пути решения:
    • Использовать сервис авторизации, например Loginza;
    • Реализовывать функции авторизации самостоятельно для каждого сервиса.
    UPDATE: Актуальная версия и инструкция по настройке доступны на github.com. Инструкция в данной статье подходит для EAuth версии <= 1.1.3.

    Плюсы использования сервиса авторизации:
    1. Простота и скорость установки;
    2. Нет необходимости изучать тонкости авторизации через каждого провайдера.

    Однако самостоятельная авторизация имеет ряд других преимуществ:
    1. Полный контроль над процессом авторизации: что будет написано в окне авторизации провайдера, какие данные мы получим и т.д.;
    2. Возможность изменять внешний вид виджета авторизации в соответствии с дизайном сайта;
    3. При авторизации через OAuth есть возможность вызывать методы API, если их предоставляет провайдер;
    4. Меньше зависимостей от сторонних сервисов – больше надежность.

    Я выбрал второй вариант в основном потому, что готовых расширений для yii не было, и мне было интересно, как устроены подобные системы авторизации изнутри. Вначале это была часть модуля для управления пользователями. Но впоследствии данный функционал был выделен в отдельное расширение, которое можно легко использовать в любом проекте.

    1. Требования к системе авторизации


    При проектировании расширения я руководствовался следующими принципами:
    1. Необходимость абстрагироваться от тонкостей авторизации через различные типы сервисов, использование адаптеров для каждого сервиса.
    2. Получение уникального идентификатора авторизации, который можно использовать для регистрации пользователя в нашем приложении.
    3. Возможность расширения стандартных классов авторизации для получения дополнительных данных о пользователе.
    4. Возможность работать с API социальных сетей путем расширения класса авторизации необходимого сервиса.
    5. Возможность настраивать список поддерживаемых сайтом сервисов, переопределять внешний вид виджета авторизации. Возможность использовать popup окно для авторизации без закрытия нашего приложения.

    2. Расширение EAuth


    В результате реализации всех требований выше на свет появилось расширение EAuth.
    На данный момент расширение содержит:
    • Компонент, содержащий вспомогательные функции.
    • Виджет, выводящий список сервисов в виде иконок и позволяющий проводить авторизацию в popup окне.
    • Базовые классы для добавления сервисов, основанных на OpenID или OAuth.
    • Готовые классы для авторизации через Google, Яндекс, Twitter, Facebook, ВКонтакте и Mail.ru.

    3. Установка


    Для начала необходимо скачать и распаковать расширение в `protected/extensions/eauth`.

    3.1 Зависимости


    Расширение использует loid и EOAuth для работы с OpenID и OAuth соответственно. Данные расширения необходимо скачать и поместить в каталог `protected/extensions`.

    3.2 Настройка


    В конфигурацию `main.php` необходимо добавить:
    'import'=>array(
    	'ext.eoauth.*',
    	'ext.eoauth.lib.*',
    	'ext.lightopenid.*',
    	'ext.eauth.services.*',
    ),
    
    'components'=>array(
    	'loid' => array(
    	    'class' => 'ext.lightopenid.loid',
    	),
    	'eauth' => array(
    	    'class' => 'ext.eauth.EAuth',
    	    'popup' => true, // Use the popup window instead of redirecting.
    	    'services' => array( // You can change the providers and their classes.
    	        'google' => array(
    	            'class' => 'GoogleOpenIDService',
    	        ),
    	        'yandex' => array(
    	            'class' => 'YandexOpenIDService',
    	        ),
    	        'twitter' => array(
    	            'class' => 'TwitterOAuthService',
    	            'key' => '...',
    	            'secret' => '...',
    	        ),
    	        'facebook' => array(
    	            'class' => 'FacebookOAuthService',
    	            'client_id' => '...',
    	            'client_secret' => '...',
    	        ),
    	        'vkontakte' => array(
    	            'class' => 'VKontakteOAuthService',
    	            'client_id' => '...',
    	            'client_secret' => '...',
    	        ),
    	        'mailru' => array(
    	            'class' => 'MailruOAuthService',
    	            'client_id' => '...',
    	            'client_secret' => '...',
    	        ),
    	    ),
    	),
    ),
    

    Расширение имеет всего два параметра: popup и services. Параметр popup отвечает за использование для авторизации popup окна, вместо перенаправления на сайт провайдера. Параметр services представляет собой список провайдеров, поддерживаемых нашим приложением. Для каждого провайдера можно указать собственный класс, основанный на базовом классе провайдера. Чтобы получить ключи для OAuth провайдеров необходимо зарегистрировать ваше приложение у соответствующего провайдера.

    4. Использование


    В качестве примера возьмем стандартное приложение Yii, сгенерированное командой `yiic webapp create`, и добавим возможность авторизации через Google и Яндекс (OAuth провайдеров подключать не будем, чтобы не возиться с ключами). Посмотреть готовую демку.

    4.1 UserIdentity


    Для начала создадим класс ServiceUserIdentity, отвечающий за вход с помощью нашего расширения. Код класса:
    <?php
    class ServiceUserIdentity extends UserIdentity {
    	const ERROR_NOT_AUTHENTICATED = 3;
    
    	/**
    	 * @var EAuthServiceBase the authorization service instance.
    	 */
    	protected $service;
    	
    	/**
    	 * Constructor.
    	 * @param EAuthServiceBase $service the authorization service instance.
    	 */
    	public function __construct($service) {
    	    $this->service = $service;
    	}
    	
    	/**
    	 * Authenticates a user based on {@link username}.
    	 * This method is required by {@link IUserIdentity}.
    	 * @return boolean whether authentication succeeds.
    	 */
    	public function authenticate() {        
    	    if ($this->service->isAuthenticated) {
    	        $this->username = $this->service->getAttribute('name');
    	        $this->setState('id', $this->service->id);
    	        $this->setState('name', $this->username);
    	        $this->setState('service', $this->service->serviceName);
    	        $this->errorCode = self::ERROR_NONE;        
    	    }
    	    else {
    	        $this->errorCode = self::ERROR_NOT_AUTHENTICATED;
    	    }
    	    return !$this->errorCode;
    	}
    }
    

    Стандартные классы провайдеров предоставляют нам два атрибута: id и name. Кроме того, каждый провайдер имеет свой идентификатор, который содержится в свойстве serviceName. В классе ServiceUserIdentity мы сохраняем данные атрибуты в сессию (и в cookie) текущего пользователя.

    4.2 Редактирование SiteContoller


    Вторым шагом будет изменение действия `site/login`. Добавим следующий код в начало действия:
    public function actionLogin() {
    	$service = Yii::app()->request->getQuery('service');
    	if (isset($service)) {
    	    $authIdentity = Yii::app()->eauth->getIdentity($service);
    	    $authIdentity->redirectUrl = Yii::app()->user->returnUrl;
    	    $authIdentity->cancelUrl = $this->createAbsoluteUrl('site/login');
    	    
    	    if ($authIdentity->authenticate()) {
    	        $identity = new ServiceUserIdentity($authIdentity);
    	        
    	        // Успешный вход
    	        if ($identity->authenticate()) {
    	            Yii::app()->user->login($identity);
    	            
    	            // Специальный редирект с закрытием popup окна
    	            $authIdentity->redirect();
    	        }
    	        else {
    	            // Закрываем popup окно и перенаправляем на cancelUrl
    	            $authIdentity->cancel();
    	        }
    	    }
    	    
    	    // Что-то пошло не так, перенаправляем на страницу входа
    	    $this->redirect(array('site/login'));
    	}
    	
    	// далее стандартный код...
    }
    

    Сначала мы проверяем наличие переменной $_GET[‘service’]. Если такая переменная есть, то создаем экземпляр класса провайдера и настраиваем пути для перенаправления и отмены авторизации. Затем вызываем метод `$authIdentity->authenticate()`, который проделывает для нас всю магию. Методы `$authIdentity->redirect();` и `$authIdentity->cancel();` необходимы для корректного закрытия popup окна, если оно используется.

    4.3 Редактируем представление `protected/views/site/login.php`


    Для использования стандартного виджета достаточно добавить пару строк после основной формы:
    <h2>Do you already have an account on one of these sites? Click the logo to log in with it here:</h2>
    <?php Yii::app()->eauth->renderWidget(); ?>
    

    Для изменения внешнего вида виджета можно скопировать файл `protected/extensions/eauth/views/auth.php` в `[theme_name]/views/EAuthWidget/auth.php`.

    4.4 Результат


    После всех проделанных действий мы можем открыть наш сайт и перейти на страницу Login. После стандартной формы авторизации появятся иконки сервисов авторизации:
    Иконки авторизации

    При клике, например, по иконке Google откроется popup окно: Popup окно авторизации

    Если пользователь подтвердит авторизацию для нашего приложения, то пользователь будет авторизован и произойдет перенаправление на страницу redirectUrl (в примере это Yii::app()->user->returnUrl). Если же пользователь нажмет No, thanks, то popup окно будет просто закрыто.

    Заключение


    Вот и все, система авторизации готова к работе. Что еще можно делать с расширением:
    • Получать дополнительную информацию о пользователе путем расширения классов провайдеров. Пример можно увидеть в демо при авторизации через Вконтакте;
    • Интегрировать расширение с yii-user. В общем случае для регистрации пользователя достаточно добавить в таблицу {{users}} всего два поля: service и identity. Первое поле – название сервиса авторизации (свойство serviceName). Второе – уникальный идентификатор пользователя на этом сервисе (свойство id);
    • Использовать расширение для работы с API социальных сетей.

    Ссылки



    UPDATE: в пункте «3.2 Настройка» не хватало расширения loid, добавил.
    UPDATE 2: Актуальная версия и инструкция по настройке доступны на github.com. Инструкция в данной статье подходит для EAuth версии <= 1.1.3.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 105
    • 0
      Спасибо. Давно хотел написать подобное, только(как обычно) руки не доходили.
      • +2
        аааа, где же Вы были месяца три назад) пришлось писать свой экстеншен.
        • +2
          eoauth в расширениях еще 2010 года :)
          • +1
            на его базе в итоге и делал)
        • +4
          Интересно, задавались ли вы следующим концептуальным вопросом. И как решили его для себя.

          Когда пользователь приходит на сайт первый раз — всё круто! Он нажимает кнопочку со знакомым логотипом, идентифицируется и сразу пользуется функционалом, доступным для зарегистрированных пользователей.

          Но допустим, проходит время, пользователь забывает про сайт на какое-то время. А потом (через год) снова на него наталкивается. И хочет продолжить использование своего аккаунта. Только не помнит с помощью чего он авторизовывался раньше. Его действия в этом случае? Придётся перебирать по очереди провайдеров авторизации? И каждый раз будет заводиться новый аккаунт в вашей системе?

          Иными словами можно ли в вашей системе будет как-то связать между собой аккаунты от разных провайдеров с аккаунтом создаваемом в вашей системе?
          • +4
            Как вы сами себе это представляете? Если пользователь использовал для авторизации один аккаунт, не привязывая других — откуда системе знать о других его аккаунтах?
            Можно разве что в настройках аккаунта дать возможность подключать другие аккаунты.
            • +3
              Как вариант — аккаунт в понимании конкретного сайта — это именно аккаунт, с имейлом, логином и паролем. И к нему могут «цепляться» аккаунты других OAuth-провайдеров.

              Существует несколько проблем (может и больше), однако все они имеют конечное число вариантов решения… Например, проблема регистрации с помощью OAuth: адрес электронной почты, логин и пароль. По-сути, пользователь все-равно должен ввести и логин, и пароль, и электронный адрес (если уж с него потребовали логин и пароль). Речь не о том — речь о возможности «привязать» к аккаунту других провайдеров…
              • 0
                ну я честно говоря статью бегло смотрел, но самый очевидный и простой способ — таблица authentications, в которую пишем user_id и provider (ну и всякие oauth_token и тп). Ну и ищем по ней когда кто-то логинится через сторонний сервис.
                • +1
                  помоему пытаться привязать аккаунты пользователя через OAuth, это вообще не совсем правильно, так как OAuth не идентифицирует пользователя, он только разрешает доступ к определенной его информации. А OpenID идентфицирует пользвателя. Как где то писали мол OpenID — это паспорт человека, а OAuth — это ключи от машины, в бардачке которой лежит паспорт…
                  • 0
                    OAuth имеет уникальную пару (провайдер, ID пользователя). Если создать аккаунт пользователя на сайте и разрешить ему привязать эту пару к этому его аккаунту, то будет идентифицировать. Почему нет то?
                    • 0
                      Допустим, я зашел в систему используя OAuth гугла, для меня создался аккаунт. А в следующий раз я зайду используя свой фейсбук аккаунт, как система узнает, что это тот же человек?
                      • +1
                        никак. только если вы к примеру в настройках своего аккаунта привяжете свой фб-аккаунт (само собой, если только это реализованио)
                        • 0
                          Ну, теоретически, если второй провайдер предоставляет адрес мыла, можно сравнить.
                          • 0
                            Нельзя на 100% доверять никаким данным (пожалуй, кроме id пользователя), полученным от провайдера.
                            Про email уже писал ниже.
                            • 0
                              Да, я сразу не прочитал все комменты, потом уже нашёл этот ваш комментарий. Ну а вручную связывать акки можно?
                              • 0
                                Можно, если пользователь вручную добавит свои аккаунты (например, на странице настроек).
              • +4
                у меня была такая же проблема, в итоге вместо этого:

                Интегрировать расширение с yii-user. В общем случае для регистрации пользователя достаточно добавить в таблицу {{users}} всего два поля: service и identity. Первое поле – название сервиса авторизации (свойство serviceName). Второе – уникальный идентификатор пользователя на этом сервисе (свойство id);

                завел отдельную табличку identities(service, id, token, userid). Заодно для вк и фб храню токен для использования их API.
                Правда если пользователь сразу не свяжет свой аккаунт с другими сервисами, будет плохо. Написал небольшой алгоритмик для сравнения данных пользователя и автосвязывания, но это все равно не всегда сработает.
                • +2
                  Делал аналогично, через таблицу связей.
                  А еще, например, можно привязывать, если встречаешь email, уже присутствующий в БД.
                  Т.е. я захожу через Яндекс, расширение берет данные, в том числе мое мыло (допустим test@yandex.ru).
                  В след. раз я захожу допустим через FB(Твитер, Вконтактик...) и опять же расширение получает инфу.
                  И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.
                  • 0
                    И если на FB я юзал это же мыло Яндекса, то считаю, что расширение смело может привязаться к уже существующему акку в БД.


                    да, только фб иногда дает «левое» мыло.
                    У меня получилось сравнение по имени-фамилии, screenname, городу, дате рождения и % пересекающихся друзей.
                    • 0
                      А что значит «левое»?
                      • 0
                        фб предоставляет юзерам возможность отдавать приложениям т.н. proxied email, на тот случай, если юзер боится, что приложение его заспамит. Этакий виртуальный ящик, письма из которого будут сыпаться юзеру в сообщения.
                      • 0
                        Было бы интересно посмотреть, как происходит сравнение.
                      • +1
                        А вообще придерживался простого алгоритма:
                        Если юзер логинится через внешний сервис в первый раз — показываю 2 формочки — создать новый акк(заполнить поля имя и мыло(которые в большинстве случаев уже заполнены инфой из API)), либо привязать к уже существующему (просьба ввести логин и пароль от обычного акка).
                        Итого, без ведома юзера акки не плодятся, если конечно он не будет все время жать «создать новый акк».
                        • 0
                          При авторизации, например, через Яндекс можно спокойно указать email другого человека. Если привязываться только к email — то можно получить доступ к чужому аккаунту.
                          • 0
                            Спасибо, не знал.
                            (хотя немного не понимаю, зачем предоставляется такая возможность)
                            • 0
                              Собственно поэтому чуть ниже и описал логику привязки без использования адреса электронной почты пользователя.

                              Будете внедрять этот функционал или предоставляете расширение «as is» и поддерживать не планируете?
                              • 0
                                Считаю, что данный функционал должен быть в модуле управления/регистрации пользователей. В данное расширение внедрять его не планирую.
                                Как вариант, можно разработать еще одно расширение, которое будет интегрироваться с eauth и, например, с yii-user.

                                Расширение предоставляется «as is», но планирую фиксить баги, добавлять провайдеров и т.д. С удовольствием буду реализовывать интересные предложения.
                                • –9
                                  В чём отличие вашего проекта от Граватара gravatar.com,
                                  Почему вы не использовали этот ресурс для авторизации loginza.ru/
                                  Это ваши конкуренты?
                                  • +2
                                    Вы читали статью? Про логинзу написано в самом начале.
                                    Не конкуренты.
                                    • –9
                                      elgg.org/
                                      oauth.net/
                                      yadis.org/wiki/Main_Page
                                      ru.gravatar.com/
                                      Ресурсы
                                      es.gravatar.com/site/implement/
                                      Библиотеки
                                      es.gravatar.com/site/implement/images/libraries/

                                      www.google.ru/friendconnect/
                                      www.myopenid.com/
                                      openid.net/

                                      Кто из них ваш конкурент?
                                      Вы выбрали не правильный фраймворк?
                                        • +4
                                          Я думаю, вам не стоит читать и комментировать такие топики, если вы не занимаетесь веб-программированием.
                                          • –16
                                            Я думаю надо выбирать правильные языки программирования в том числе для Веб.

                                            PHP это язык для тех кто не освоил Perl, Python, Ruby.
                                            Perl для тех кто не освоил Cи.
                                            Си для не освоивших Асм.
                                            Асм для тех кто не делает проекты на HDL.
                                            HDL для тех кто не имеет хорошего математического образования и не умеет пользоваться Матлабом и Симулинком
                                            Матлаб для тех кто не может посчитать физические модели самостоятельно и не имеет практики в Радиоэлектронике.

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

                                            А в статье тема авторизации для различных ресурсов не раскрыта.
                                            • 0
                                              Слишком толсто…
                                              • +1
                                                Не сразу понял, феномен это или троллинг )
                                                • –4
                                                  Я думаю, вам не стоит читать и комментировать такие топики, если вы не занимаетесь программированием
                                                  • 0
                                                    Удивительно, как человек может за несколько часов прокачать карму до -15, причём ведь старался, продолжал троллить в полный рост из последних сил :)

                                                    Добровольный readonly, так сказать :)
                                                    • –3
                                                      Так посмотрите на последнее сообщение в точности идентично сообщению уважаемого представителя средней школы nayjest. Разница в оценке, налицо сговор.

                                                      Это была проверка. Теперь я точно знаю Хабр уже не чего не спасёт от школоты и «программистов» PHP.

                                                      А сил у меня много но не для такой детской аудитории :-)
                                                  • 0
                                                    Спасибо, не знал что такое HDL, до конца не понял, но видно классная штука, до этого для построения конечных автоматов пользовался jflap.
                                                    И я понял, самые крутые перцы, это те которые:
                                                    >> может посчитать физические модели самостоятельно и не имеет практику в Радиоэлектронике.
                                                    и им уже не нужны ни mathlab ни языки программирования?

                                                    • –1
                                                      Радиоэлектроника для тех кто не «чувствует» форму поля антенно фидерных устройств

                                                      Работают с АФУ кто не знает Общую физику
                                                      Общая физика для тех кто не понимает Исключительно простую теорию всего
                                                      Высшие физические теории для тех кто не понял как использовать Гермионные сети.

                                                      ranet.livediscourse.com/blog/view?id=25519

                                                      Гермионные сети это среда для Искусственных разумов (ИР), которые не смогли достать себе Жидкокристаллический конструкт(ЖК) Активной запоминающей среды (АЗС).

                                                      ЖК АЗС для ИР, которым не хватает ресурсов на Сверхпроводниковую АЗС
                                                      • 0
                                                        … ага, а на этой планете живут те, кто не улетел с остальными… )))
                                                        • –1
                                                          Те, кто остался не ВАЖНЫ для ИР и подлежат ассимиляции. Мы БОРГ!
                                                        • 0
                                                          Запутали вы меня, тем не менее спасибо, узнал много новых слов o_0 :)
                                                          И еще «Сверхпроводниковая АЗС», гугл выдает ссылку на этот ваш комментарий, т.е теперь даже не знаю что и думать.

                                                          Это вы так шутите? или серьезно пишите?
                                                          • 0
                                                            Сверх-проводниковую — это шутка.
                                                            АЗС — серьёзно.

                                                            Тут подробно и можно комментировать и дискутировать по тексту.
                                                            ranet.livediscourse.com/blog/view?id=25519
                                                      • 0
                                                        а что делать людям, которые какбэ и asm знают, и С, и php (именно знают, а не
                                                        • 0
                                                          лох (почему-то только это в голову пришло)
                                        • +1
                                          В своем проекте сделал аналогичным образом.
                                          В настройках пользователя есть отдельная страница с виджетом eauth и списком уже подключенных аккаунтов. При авторизации на этой странице просто записываю в базу uid, serviceName и identity.
                                          • 0
                                            А если пользователь сначала заходит через сервис, без регистрации, то данные вставляются в таблицу users, а потом в identities с полученным userid?

                                            Или поле userid в таблице identities сначала идет в null, а только потом обновляется обновляется?
                                            • 0
                                              а что значит «без регистрации»? мы же получаем данные о нем сразу, создаем юзера и создаем identity с этим юзером.
                                              • 0
                                                Тогда получается что в users нет email и пароля, которые можно предложить ввести после входа через сервис?
                                                • 0
                                                  пароля нет, он, имхо, не нужен (если пользователь утратил контроль над своей учеткой в соцсети, высылаем ему one-time login ссылку, и он перепривязывает другой аккаунт).
                                                  А почту просим после входа, или в другой момент, по дефолту она пуста.
                                          • 0
                                            Автоматом этого никак не сделать, но как можно связать разные аккаунты одного пользователя?

                                            Первое, что приходит в голову:
                                            1. Пользователь должен пройти аутентификацию под любым из провайдеров.
                                            2. Теперь уже аутентифицированный пользователь должен иметь возможность пройти аутентификацию через других провайдеров — тем самым давая нашему приложению данные о формировании связей.

                                            Таким образом можно обойтись без анализа адреса эл. почты.

                                            Ясно, что в рамках данного расширения это не реализовано. Нужно дописывать.
                                            • +1
                                              Мне кажется все равно имеет смысл завести в системе свой user id. А вот как этот id будет идентифицироваться — это уже дело самого пользователя.
                                              • +1
                                                Я делаю так — в таблице пользователей вообще никакой аутенфикационной информации не содержится, у каждого провайдера своя таблица, связанная по user_id. Обычный логин/пароль такой же провайдер, как и Гугл или ВКонтакте, лишь чисто случайно оказавшийся на том же домене. Пользователь залогинившись хоть раз получает возможность привязать всех остальных провайдеров. Если не привязал и пользуется то ФБ, то Яндексом, то ССЗБ. В крайнем случае ручками в базе можно поправить.
                                            • 0
                                              А меня больше вот какой вопрос интересует: жил-был пользователь, который использовал авторизацию через стороннего провайдера. Потом этот сторонний провайдер отпал… Ну например, увели учетку или он забыл про нее… Можно нафантазировать разное.

                                              И как ему теперь быть? На сайте-то много разной важной инфы для него скопилось.

                                              Юзкейс: я на на одном сервисе зарегистрирован через ЖЖ-шный айди. ЖЖ последнее время работает из рук вон плохо и когда он лежит я не могу пользоваться и сервисом. Что делать в конкретном случае — наверное мне стоит спросить у администрации ресурса, но в целом: как можно было бы акую задачу решить?
                                              • 0
                                                Мой ответ выше прочитайте.
                                                • 0
                                                  В своих проектах я даю пользователю возможность не только привязать несколько аккаунтов на разных сервисах, но и указать логин/пароль для обычной авторизации.
                                                • 0
                                                  Мы, при разработке последнего интернет магазина выбрали следующее решение. Пользователь авторизовавшись должен ввести эмейл, затем если возникнет описанная ситуация, он запрашивает на эмейл временную ссылку на одноразовую авторизацию под аккаунтом, к которому привязано адрес почты. И далее пользователь может привязать способы авторизации, либо выполнять процедуры, за которыми пришел на сайт.
                                                • +2
                                                  И почему, когда начинаешь писать свой велосипед, его тут же выкладывают :)
                                                  • –1
                                                    Выкладываю свой велосипед описание авторизации

                                                    github.com/Ignat99/RaNet/wiki/%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8
                                                    • 0
                                                      Спасибо больше за расширение, как раз сами собирались писать такое.

                                                      Но почему не GitHub? :(
                                                      • 0
                                                        Честно говоря, пока не довелось поработать с git, зато есть опыт работы с svn. Пока что разбираться с новой системой нет возможности. :(
                                                        • –10
                                                          Уважаемый будущий студент, хотя сомневаюсь! Извините, я в школе учителем не работал, только в институте. Могу только посоветовать вам записаться к хорошему учителю, чтоб он научил вас думать. Все остальные советы, лично для вас, преждевременны.
                                                          • +1
                                                            Жаль… искренне советую познакомиться с этой VCS, после git'а возвращаться на SVN уже не захочется :)

                                                            Да и коллективная работа в GitHub'е невероятно удобная, с гуглокодом не сравнить.
                                                      • 0
                                                        А мой велосипед дружит с yii-user, который в свою очередь дружит с rights, но в общем-то привязка к пользовательскому модулю осуществляется через адаптер, так что не проблема написать адаптер для интеграции с каким-то другим модулем по управлению пользователями.

                                                        Еще модуль позволяет привязывать аккаунты соц. сетей к одному основному и в случае регистрации через акк. соц. сети, позволяет автозаполнять поля профайла данными с соц. сетей.

                                                        Поддерживает пока Facebook, Vkontakte (как плагины) и вот недавно мне дописали поддержку Google.
                                                        • 0
                                                          А где можно почитать/посмотреть про Ваше расширение?
                                                          • 0
                                                            Могу закинуть в svn, я его планировал публиковать в yii extensions после дополнительного рефакторинга и тестирования.
                                                            • 0
                                                              Как у вас успехи с расширением?
                                                              • 0
                                                                Если нужно, могу скинуть сорцы, т. к. на допиливание времени все еще не нашлось.
                                                            • 0
                                                              Сейчас это расширение еще находится в закрытом корпоративном репозитории и документации к нему еще совсем нет.
                                                          • 0
                                                            Пробую на демке авторизоваться через ФейсБук:

                                                            Fatal error: Call to undefined method EAuthException::getPrevious() in /home/n/nodge/nodge.ru/public_html/yii-eauth/demo/protected/extensions/auth/services/FacebookOAuthService.php on line 68
                                                            • 0
                                                              Я тоже получил ошибку, но другую. Написал в личку Nodge.
                                                              • –15
                                                                Школота есть школота и даже не осознают.
                                                              • 0
                                                                Починил и обновил пост.
                                                              • +1
                                                                а есть ли аналоги без привязки к конкретному движку?
                                                                • 0
                                                                  Есть библиотеки для работы с OpenID и OAuth. Некоторые провайдеры, например Facebook, предоставляют собственные библиотеки для работы с api. А вот готовых библиотек для работы с различными провайдерами через единый интерфейс мне не попадалось, к сожалению.
                                                                  • +1
                                                                    Loginza, не?
                                                                    • 0
                                                                      Не, Loginza это сервис, а либа иногда может оказаться полезнее и приятнее
                                                                  • +2
                                                                    Вы проделали хорошую работу. Возьму её за основу, при написании подобной библиотеки для CodeIgniter.
                                                                    • 0
                                                                      Для CodeIgniter да, надо! И еще желательно чтобы данные хранились в redis.
                                                                      • 0
                                                                        Связь с БД будет через Doctrine 2, надеюсь она поддерживает redis и вы сможете легко всё подключить.
                                                                    • 0
                                                                      Собираетесь ли обновлять проект до текущей версии (1.1.9)?
                                                                      • 0
                                                                        На следующей неделе буду обновлять свои проекты с 1.1.8 до 1.1.9. Если что-то сломается — буду фиксить. Но судя по changelog, все должно работать и так.
                                                                      • 0
                                                                        Огромное спасибо за расширение, сэкономило кучу времени!

                                                                        когда прикручивал авторизацию одноклассников столкнулся с тем что после каждого действия происходил редирект на odnoklassniki.ru. Полез разбираться и оказалось что в методе EOAuth2Service::restoreAccessToken проверка $this->getState('expires', 0) > time() никогда не проходит поскольку для одноклассников вообще не устанавливается expires. Возможно это стоит поправить
                                                                        • 0
                                                                          А не подскажите, как с помощью вашего расширения получить аватарки с этих соц. сетей?
                                                                          • 0
                                                                            Зависит от API каждой соц. сети. Для большинства можно найти примеры в папке eauth/custom_services.

                                                                            Например, из Вконтакта можно получить фото:
                                                                            	protected function fetchAttributes() {
                                                                            		$info = (array)$this->makeSignedRequest('https://api.vkontakte.ru/method/getProfiles', array(
                                                                            			'query' => array(
                                                                            				'uids' => $this->uid,
                                                                            				'fields' => 'photo',
                                                                            			),
                                                                            		));
                                                                            		$info = $info['response'][0];
                                                                            		$this->attributes['photo'] = $info->photo;
                                                                            	}
                                                                            


                                                                            А аватар из Твиттера так:
                                                                            	protected function fetchAttributes() {
                                                                            		$info = $this->makeSignedRequest('https://api.twitter.com/1/account/verify_credentials.json');
                                                                            		$this->attributes['photo'] = $info->profile_image_url;
                                                                            	}
                                                                            
                                                                          • 0
                                                                            Спасибо большое за проделанную работу, только никак не выходит авторизация с Twitter. Почему на получении токена
                                                                            $token = EOAuthUtils::GetRequestToken($consumer, $scope, $this->provider->request_token_endpoint, $applicationName, $callbackUrl);
                                                                            в вызываемой GetRequestToken функции GetTokenFromUrl мне выдается 401 ошибка в полученных от Твиттера заголовках. Не подскажите в чем может быть дело? Часть конфигурации можно глянуть тут pastebin.com/5wY8jG25
                                                                            • 0
                                                                              Лучше оформить issue на гитхаб. Что-нибудь кроме 401 кода приходит в теле ответа? Еще бы посмотреть какие уходят в твиттер при запросе…
                                                                              • 0
                                                                                Поправка:
                                                                                Еще бы посмотреть какие данные уходят в твиттер при запросе…
                                                                                • 0
                                                                                  Еще раз большое спасибо за расширение, разобрался сам. Не указал redirect URI в настройках приложения, прошелся по коду, узнал ответ от Твиттера, это было что-то вроде «Десктопные приложения в redirect URI должны указывать...». Я удивился, что мой запрос считают запросом от десктопного приложения и обнаружил это в настройках.
                                                                              • 0
                                                                                подключил данный модуль, но при вызове выдаёт такую ошибку «curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set» можно решить эту проблему?
                                                                                • 0
                                                                                  Промахнулся и ответил вам ниже.
                                                                                • 0
                                                                                  Решение зависит от того, в каком расширении происходит ошибка.
                                                                                  Если в зависимостях (loid или EOAuth), то найдите и закомментируйте строки с curl параметром CURLOPT_FOLLOWLOCATION .
                                                                                  Если в EAuth — то скачайте последнюю версию, в ней решена эта проблема.
                                                                                  • 0
                                                                                    спасибо, по этому архиву заработало. Но вот мистика, вернулся к той что до этого стояла, тоже заработала. Но это только через mail.ru другие площадки не подключал. Подключил вконтакт, но во конце авторизации выдало сообщение:
                                                                                    Error 500
                                                                                    Invalid response http code: 400.
                                                                                    заменил расширение на то что сейчас дали ссылку, авторизацию заработала успешно. Сейчас работает как майл, так и квонтакт. Гугл, яндекс не удаётся авторизовать, при первом клике в появившемся попап окне выдаёт туже ошибку FOLLOWLOCATION. Видимо они OpenID.
                                                                                    Кстати у вас на сайте в демо версии nodge.ru/yii-eauth/demo/login заметил больше провайдеров, а у меня всего 6шт. Увас имеется ещё Google (OAuth2), Yandex (OAuth) в расширении я так понимаю они уже имеются, только нужно где-то прописать их?
                                                                                    Спасибо.
                                                                                    • 0
                                                                                      1. Google и Яндекс есть в двух вариантах: openid и oauth2.
                                                                                      2. Старые версии библиотеки не будут работать, т.к. API сервисов меняется.
                                                                                      3. Самый полный список сервисов есть в последней версии на github.com. Там же есть краткая инструкция что и как подключать. Демо проект так же есть на github.
                                                                                    • 0
                                                                                      разобрался спасибо, я полностью решил подключать только по OAuth. Сейчас пытаюсь подключить Yandex, Google(OAuth) скачал по вашей последней ссыке GoogleOAuthService.php (изменение 8 months ago) и яндекс и гугл при запросе авторизации в попап окне выдаёт сообщение redirect_uri_mismatch. Тоесть как понял API у них время от времени меняется, и возможно адрес мог поменять?
                                                                                      • 0
                                                                                        Если в демо работает, значит API не менялся. В вашем случае нужно указать правильный redirect url в настройках приложения у Google и Яндекс. Например, для Google у меня прописано так:
                                                                                        http://nodge.ru/yii-eauth/demo/login/google-oauth
                                                                                        http://nodge.ru/yii-eauth/demo/login/google-oauth?js
                                                                                        Вариант с ?js нужен если вы используете popup окно для авторизации.
                                                                                        • 0
                                                                                          спасибо, был не внимателен, сейчас всё работает.
                                                                                      • 0
                                                                                        если можно ещё один вопрос, как можно получить емайл? пытался вывести так $this->email = $this->service->getAttribute('email'); но ни один из провайдеров не выдаёт
                                                                                        • 0
                                                                                          Заметил такой баг. Все установил и сделал как по инструкиции но при авторизации ВКонтакте выдавало ошибку 400. Оказалось, что на API не передается параметр request_uri при формировании УРЛа в
                                                                                          protected function getTokenUrl($code) { return $this->providerOptions['access_token'].'?client_id='.$this->client_id.'&client_secret='.$this->client_secret.'&code='.$code; }

                                                                                          пришлось добавить

                                                                                          .'&redirect_uri='.urlencode($this->redirectUrl)

                                                                                          • 0
                                                                                            Суда по всему, вы скачали устаревшую версию. Последнюю всегда можно найти на github.com.
                                                                                            • 0
                                                                                              Да, вы наверное правы. Но все равно параметр redirect_uri нужен хотя бы для того, чтобы вернуть пользователя на ту страницу, с которой произошла авторизация. Например, мне надо авторизовать пользователя в момент чтения новости (когда для комментирования надо авторизоваться) а плагин перебрасывает все время на индекс.
                                                                                              • 0
                                                                                                redirect_uri передается для всех OAuth 2.0 провайдеров.
                                                                                                Выдержка с gitbub:
                                                                                                EOAuth2Service.php#L100
                                                                                                ...'&redirect_uri='.urlencode($this->getState('redirect_uri'));
                                                                                                
                                                                                          • 0
                                                                                            Спасибо за расширение, очень облегчило жизнь.

                                                                                            Скажите, а можно у вас авторизоваться, если провайдер и access_token уже известны?

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