
HybridAuth - авторизация через сторонние сайты (Google, VK, Facebook, Twitter и т. д.) и создание нового пользователя и использование в качестве абстрактного API между приложением и различных социальных интерфейсов и идентичности провайдеров, таких как Facebook, Twitter, MySpace и Google.
И так, приступим!
1) Устанавливаем composer, если он у вас не установлен.
2) Добавляем в composer.json
:
"hybridauth/hybridauth": "3.0.0.x-dev"
Чтобы получилось примерно вот так:
"require": { "hybridauth/hybridauth": "3.0.0.x-dev" }
3) Запускаем composer update
или composer install
, если вы в первый раз ставите пакет.
4) После установки пакета, в конфиг config/config.php
, указываем настройки нужных провайдеров
'hybridauth' => array( // required 'base_url' => 'http://site.com/hybridauth/socialauth', // required 'providers' => array( 'Google' => array( 'enabled' => true, 'keys' => array( 'id' => 'Google Client ID', 'secret' => 'Google Secret Key' ), ), 'Facebook' => array( 'enabled' => true, 'keys' => array( 'id' => 'Facebook Client ID', 'secret' => 'Facebook Secret Key' ), ), 'Twitter' => array( 'enabled' => true, 'keys' => array( 'key' => 'Twitter Client ID', 'secret' => 'Twitter Secret Key' ), ), 'GitHub' => array( 'enabled' => true, 'keys' => array( 'id' => 'GitHub Client ID', 'secret' => 'GitHub Secret Key' ), ), ), 'debug_mode' => false, 'curl_options' => array( CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CAINFO => dirname(__FILE__) . '/ca-bundle.crt', // путь к сертификату ), 'http_client' => null )
5) В папку с конфигом копируем файл ca-bundle.crt (сертификат), который берём с установленного пакета /vendor/hybridauth/hybridauth/example/ca-bundle.crt
6) Зарегистрируем наш сервис в DI контейнере
/** * Registers the module-only services */ public function registerModuleServices() { /** * Register HybridAuth Service */ $this->di['hybridauth'] = function() { $hybridauth = new \Hybridauth\Hybridauth($this->config->hybridauth->toArray()); return $hybridauth; }; }
7) Добавим новый маршрут роутеру (Phalcon\MVC\Router
):
$router->add('/hybridauth(/[a-z]+)?', array( 'module' => 'frontend', 'controller' => 'users', 'action' => 'hybridauth', 'provider' => 1 ))->setName('front-hybridauth');
и соответственно кнопки
<a href="/hybridauth/twitter" class="button-social "><i class="icon-twitter"></i> Twitter</a> <a href="/hybridauth/google" class="button-social "><i class="icon-google-plus"></i> Google</a> <a href="/hybridauth/facebook" class="button-social "><i class="icon-facebook"></i> Facebook</a> <a href="/hybridauth/github" class="button-social "><i class="icon-github2"></i> GitHub</a>
8)В моём примере, в контроллере UsersController, создаём метод hybridauthAction
public function hybridauthAction($provider, $add = null) { $provider = substr($provider, 1); if ($provider == 'socialauth') { $endpoint = new \Hybridauth\Endpoint(); $endpoint->process(); } try { switch ($provider) { case 'facebook': $adapter = $this->hybridauth->authenticate("Facebook"); break; case 'google': $adapter = $this->hybridauth->authenticate("Google"); break; case 'twitter': $adapter = $this->hybridauth->authenticate("Twitter"); break; case 'github': $adapter = $this->hybridauth->authenticate("GitHub"); break; } if (!empty($adapter)) { // request user profile $user_profile = $adapter->getUserProfile(); // Проверяем пользователя по базе $user = Hybridauth::findFirst([ 'conditions' => 'identifier = :identifier: AND provider = :provider:', 'bind' => [ 'identifier' => $user_profile->getIdentifier(), 'provider' => $provider, ] ]); // если юзер есть if ($user) { // конектим его и редирект, если нужно } else { // регистрируем юзера } } } catch (\Exception $e) { $this->flashSession->error('Ошибка подключения провайдера, пожалуста попробуйте позже или свяжитесь с администрацией сайта.'); return $this->response->redirect('login'); } }
Описал кратно, думаю, должно быть понятно, если будут вопросы, прошу в комментарии.
11 Комментариев
Переписать конечно можно, только жалко тратить время, если уж выложили код, то он должен быть рабочим.
Ведь у основного класса HybridAuth нет (и по идеи не должно быть) метода findFirst(). К какому классу мы обращаемся в 33 строке в коде контроллера hybridauthAction?
Вот мой пример, у вас возможно namespace свой будет models/Hybridauth.php.