Авторизация через соцсети это одна из самих частых задач с которыми сталкиваются разработчики развлекательных сайтов. Казалось бы там и делать нечего, ведь для каждого 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 PHPixieSlice();
$config = $slice->arrayData($config);
$social = new PHPixieSocial($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, ну и как всегда, если у вас возникнуть какие-либо вопросы, обращайтесь сразу к нам в чат.
Автор: jigpuzzled