image
Авторизация через соцсети это одна из самих частых задач с которыми сталкиваются разработчики развлекательных сайтов. Казалось бы там и делать нечего, ведь для каждого API существует PHP библиотека от самого вендора. Но что делать если надо подключить сразу несколько? Не хочется тянуть в проект кучу библиотек которые имплементируют один и тот же протокол OAuth, к тому же хотелось бы иметь какой-то единый интерфейс. PHPixie Social — маленькая библиотека с только одной зависимостью, которая позволяет легко работать сразу с Facebook, Twitter, Google и Вконтакте, а если вы используете PHPixie фреймворк то также сразу получаете авторизацию всего в несколько строчек кода.
Но сначала рассмотрим компонент сам по себе.



Конфигурация

<?php
$config = array(
    // Имена провайдеров могут быть произвольными,
    // но для простоты примера имя я взял с типа API
    'facebook' => array(
        'type'      => 'facebook',
        'appId'     => '',
        'appSecret' => '',

        // опционально права которые запросить у пользователя,
        'permissions' => array(),
 
        // опционально версия API
        'apiVersion' => '2.3' 
    ),
    'twitter' => array(
        'type' => 'twitter',

        // Twitter работает через OAuth 1.0a
        // поэтому поля отличаются
        'consumerKey' => '',
        'consumerSecret' => ''
    ),
    'google' => array(
        'type'      => 'google',
        'appId'     => '',
        'appSecret' => '',

        // опционально
        'scope'  => array(), 
        'apiVersion' => '2.3' 
    ),
    'vk' => array(
        'type'      => 'vk',
        'appId'     => '',
        'appSecret' => '',

        // опционально
        'scope'  => array(), 
        'apiVersion' => '2.3' 
    ),
);


Инициализация

// та единственная зависимость
$slice = new \PHPixie\Slice();
$config = $slice->arrayData($config);

$social = new \PHPixie\Social($config);


Авторизация пользователя

Итак первое что нам надо сделать это запросить у пользователя авторизацию, для этого нам понадобится придумать какую-то ссылку куда API пришлет нам токен доступа. Тогда мы перенаправляем пользователя на страницу авторизации. Вот простой пример:

$callbackUrl = 'http://localhost.com/callback=1';

if(!isset($_GET['callback'])) {
    //Если параметра нет, далаем редирект

    $loginUrl = $social->get('facebook')->loginUrl($callbackUrl);
    header('Location: '.$loginUrl);

} else {
   // Если параметр есть,  значит это к нам пришел ответ от API,
   // с ним придет еще много параметров которые Social обработает сам.
   // Заметьте, что значение $callbackUrl тут тоже нужно
   $socialUser = $social->get('faceebook')->handleCallback($callbackUrl, $_GET);

   if($socialUser === null) {
        // Пользователь отклонил авторизацию
        echo "You didn't authorize our app";

   }else{
       // Запрос к API от имени пользователя
       var_dump($socialUser->get('me'));
   }
}


Объект пользователя

$socialUser->id(); // ID пользователя в соцсети

// Дополнительная информация доступна после логина
$socialUser->loginData(); 

// GET Запрос
$socialUser->get('some/endpoint', $queryParams = array());

// POST Запрос
$socialUser->post('some/endpoint', $data = array(), $queryParams = array());

// Произвольный запрос
$socialUser->api('PUT', 'some/endpoint', $queryParams = array(), $data = array());

// Токен авторизации,
// его можно сериализировать и сохранить
// в сессии или в базе
$token = $social->token();

// Получить пользователя по токену
$socialUser = $social->get('facebook')->user($token);

// Кстати запросы можно делать сразу с токеном
$social->get('facebook')->get($token, 'some/endpoint', $queryParams = array());
$social->get('facebook')->post($token, 'some/endpoint', $data = array(), $queryParams = array());
$social->get('facebook')->api($token, 'PUT', 'some/endpoint', $queryParams = array(), $data = array());


Интеграция с фреймворком

В фреймворке по умолчанию доступен плагин к модулю авторизации, который обрабатывает логин пользователя и легко включается в его конфигурации. Те кто уже работает с фреймворком не найдут в этом ничего сложного, так что в этот раз вместо описания я оставлю ссылку на демо проект: https://github.com/phpixie/demo-socialauth

В нем пользователь сам выбирает через какую сеть авторизоваться. Если он зашел впервые, ему сразу-же создастся запись в табличке Users и логин запомнится через сессию. При последующем логине будет уже использоваться сущность с базы.

Чтобы попробовать Social, достаточно просто composer require phpixie/social, ну и как всегда, если у вас возникнуть какие-либо вопросы, обращайтесь сразу к нам в чат.
Поделиться с друзьями
-->

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