Phalcon

Интеграция HybridAuth в Phalcon PHP

Интеграция HybridAuth в Phalcon PHP

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');
    }
}

Описал кратно, думаю, должно быть понятно, если будут вопросы, прошу в комментарии.

Valentin Rasulov

11 Комментариев

Vafir Valera # 2014-11-19 22:06:56
Добрый день, а есть ли у вас реализованные провайдеры Vkontakte и Odnoklassniki?
Valentin Rasulov Автор # 2014-11-23 06:28:03
Добрый день, на сайте Hybridauth есть API по каждому провайдеру и вы можете скачать весь архив с сайта с всеми провайдерами.
Vafir Valera # 2014-11-27 00:43:57
Спасибо, дополнительные провайдеры я видел, Vkontakte криво написан, в дате рождения путает год с числом и email ни при каких условиях scope не выдергивает
Брежнев Иван # 2014-11-27 00:52:25
Если я не ошибась, то Вконтакте вообще Email пользователя не отдает
Брежнев Иван # 2014-11-27 00:53:28
А сам провайдер можно переписать, если есть необходимость
Vafir Valera # 2014-11-27 01:00:15
Email отдает при разрешении от пользователя, получал его используя https://github.com/stanislas-prime/SocialAuther/blob/master/lib/SocialAuther/Adapter/Vk.php
Переписать конечно можно, только жалко тратить время, если уж выложили код, то он должен быть рабочим.
Брежнев Иван # (комментарий был изменён) 2014-11-27 01:21:00
Поправил дату рождения https://gist.github.com/vanchelo/9db69a8049ec40065ce1
Vafir Valera # 2014-11-27 17:35:54
Спасибо )
Lapin Alex # 2016-03-13 03:26:25
Fatal error: Call to undefined method Hybridauth\Hybridauth::findFirst() in /app/modules/Admin/Controller/IndexController.php on line 115

Ведь у основного класса HybridAuth нет (и по идеи не должно быть) метода findFirst(). К какому классу мы обращаемся в 33 строке в коде контроллера hybridauthAction?
Valentin Rasulov Автор # (комментарий был изменён) 2016-03-13 04:08:50
Я пример приводил. В моём случае таблица в БД и модель, вот к ней и обращается эта строка.
Вот мой пример, у вас возможно namespace свой будет models/Hybridauth.php.

<?php

namespace Blog\Commons\Models;

use Phalcon\Mvc\Model;

class Hybridauth extends Model
{
	/**
	 * @var integer
	 */
	 public $id;
	/**
	 * @var integer
	 */
	 public $user_id;
	/**
	 * @var string
	 */
	 public $provider;
	/**
	 * @var string
	 */
	 public $identifier;
	/**
	 * @var string
	 */
	 public $email;
}
Lapin Alex # 2016-03-13 07:26:27
Спасибо. Значит нужно расширять класс. Ок.
Чтобы оставить комментарий необходимо авторизоваться