Авторизация через соцсети это одна из самих частых задач с которыми сталкиваются разработчики развлекательных сайтов. Казалось бы там и делать нечего, ведь для каждого 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' ), ); Код <?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); Код // та единственная зависимость $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')); } } Код $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()); Код $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 и логин запомнится через сессию. При последующем логине будет уже использоваться сущность с базы.