В предыдущей части этой серии мы создали наши начальные интерфейсы, которые мы будем использовать для всех будущих частей. В этой статье мы интегрируем Google+ в наше приложение.
Вы можете просмотреть код для всех статей на этой странице Github .
Вход в Google+
Мы начнем с создания следующего каталога: src/SitePoint/SocialLogin/Google
. Это будет каталог, в котором мы будем работать до конца статьи. В этом каталоге мы создаем класс GoogleLogin
. Этот класс реализует интерфейс SocialLoginInterface
который мы создали в предыдущей статье. Убедитесь, что свойство, называемое service
, доступно для хранения нашего сервиса (см. Код ниже).
У Google есть определенные требования, чтобы мы могли войти в систему. Поэтому убедитесь, что у нас есть следующие 3 свойства, присутствующие в классе:
— ID клиента
— ключ
— URL обратного вызова
Поскольку все 3 свойства необходимы для работы нашего приложения, наш конструктор получит эти 3 переменные в качестве параметров и установит свойства.
До сих пор наш код выглядит следующим образом.
<?php namespace SitePoint\SocialLogin\Google; use SitePoint\SocialLogin\Interfaces\SocialLoginInterface; class GoogleLogin implements SocialLoginInterface { /** * Google service * * @var string */ protected $service; /** * OAuth client ID * * @var string */ protected $clientId; /** * OAuth key * * @var string */ protected $key; /** * Callback url * * @var string */ protected $callbackUrl; /** * Constructor * * @param $clientId string * @param $key string * @param $callbackUrl string */ public function __construct($clientId, $key, $callbackUrl) { $this->clientId = $clientId; $this->key = $key; $this->callbackUrl = $callbackUrl; } /** * Initializes our service */ public function init() { } /** * Returns the login url for the social network * * @return string */ public function getLoginUrl() { } /** * Handles the login callback from the social network * * @param string $accessCode * * @return SocialUserInterface */ public function loginCallback($accessCode) { } }
Следующим шагом является создание нашего сервиса Google+. Как вы видели в предыдущей статье, мы используем библиотеку OAuth для настройки нашего соединения с Google+. Мы будем использовать наш метод init
для создания сервиса.
Прежде чем мы сможем начать, мы должны добавить некоторые операторы использования в начало нашего класса.
use OAuth\ServiceFactory; use OAuth\OAuth2\Service\Google; use OAuth\Common\Storage\Session; use OAuth\Common\Consumer\Credentials;
Все для нашего метода init теперь присутствует. Время установить нашу связь с Google+. Мы делаем это с помощью основных примеров библиотеки OAuth, которую мы используем.
/** * Initializes our service */ public function init() { $storage = new Session(); $serviceFactory = new ServiceFactory(); $credentials = new Credentials($this->clientId, $this->key, $this->callbackUrl); $this->service = $serviceFactory->createService('google', $credentials, $storage, array('userinfo_email', 'userinfo_profile')); return $this; }
Наш сервис настроен сейчас, поэтому мы можем продолжить, заполнив другие методы из интерфейса. Мы начнем с метода getLoginUrl
. Этот метод возвращает URL-адрес, на который вы будете перенаправлять пользователя.
/** * Returns the login url for the social network * * @return string */ public function getLoginUrl() { return $this->service->getAuthorizationUri(); }
Следующий метод для определения — метод loginCallback
. Когда пользователь принимает данные Google+, которыми вы делитесь с вашим приложением, он будет перенаправлен обратно на URL, который вы определили как callbackUrl
. Когда пользователь запрашивает этот URL, вы должны вызвать метод loginCallback
из этого класса.
Если все прошло хорошо, теперь мы можем получить данные из Google+.
/** * Handles the login callback from the social network * * @return SocialUserInterface */ public function loginCallback() { $userData = json_decode($this->service->request('https://www.googleapis.com/oauth2/v1/userinfo'), true); $googleUser = new GoogleUser($userData); return $googleUser; }
Вы можете заметить, что мы используем класс с именем GoogleUser
здесь, и мы возвращаем класс с интерфейсом SocialUserInterface
. Однако этого класса еще нет.
Пользователь Google+
Каждая социальная сеть возвращает данные пользователя по-своему. Вместо того, чтобы просто возвращать эти данные, мы собираемся нормализовать их, чтобы мы могли легко работать с ними. Нам нужно создать класс с именем GoogleUser
. Этот класс будет реализовывать SocialUserInterface
мы создали в предыдущей статье.
Конструктор этого класса ожидает необработанные данные Google в этом случае. В каждом получателе мы будем получать нужные данные из необработанных данных от Google. В конце ваш класс GoogleUser
может выглядеть следующим образом.
<?php namespace SitePoint\SocialLogin\Google; use SitePoint\SocialLogin\Interfaces\SocialUserInterface; class GoogleUser implements SocialUserInterface { /** * @var mixed user data */ private $userData; /** * Constructor. * * @param $userData mixed Raw social network data for this particular user */ public function __construct($userData) { $this->userData = $userData; } /** * Get the provider name * * @return string */ public function getProvider() { return "google"; } /** * Get the UID of the user * * @return string */ public function getUid() { if(array_key_exists('id', $this->userData)) { return $this->userData['id']; } return null; } /** * Get the first name of the user * * @return string */ public function getFirstname() { if(array_key_exists('given_name', $this->userData)) { return $this->userData['given_name']; } return null; } /** * Get the last name of the user * * @return string */ public function getLastname() { if(array_key_exists('family_name', $this->userData)) { return $this->userData['family_name']; } return null; } /** * Get the username * * @return string */ public function getUsername() { if(array_key_exists('family_name', $this->userData)) { return str_replace(" ", "_", $this->userData['family_name']); } return null; } /** * Get the emailaddress * * @return string */ public function getEmailAddress() { if(array_key_exists('email', $this->userData)) { return $this->userData['email']; } return null; } /** * Get the city * * @return string */ public function getCity() { return null; } /** * Get the birthdate * * @return string */ public function getBirthDate() { return null; } /** * Get the gender * * @return string */ public function getGender() { if(array_key_exists('gender', $this->userData)) { return $this->userData['gender']; } return null; } }
Внедрение его в ваше приложение
В зависимости от используемой вами структуры (если вы используете любую из них) реализация может немного отличаться. Тем не менее, я бы порекомендовал вам следующие методы:
public function loginForm() { //Renders a login form with a button to login with google+ (calls the LoginWithGoogle method). }
public function loginWithGoogle() { $googleLogin = new GoogleLogin("clientId", "key", "url/loginCallbackGoogle"); $googleUrl = $googleLogin->init()->getLoginUrl(); // Redirect user to $googleUrl. }
public function loginCallbackGoogle() { $googleLogin = new GoogleLogin("clientId", "key", "url/loginCallbackGoogle"); $googleUser = $googleLogin->init()->loginCallback(); // You can now either save or merge this user. // Next, you can log the user in and redirect him to any page you like }
Рекомендация 1:
Вместо ссылки в форме входа в систему, которая перенаправляет вас на метод loginWithGoogle
, вы также можете разместить URL Google в своем представлении. Однако обратите внимание, что вы уже создаете соединение с Google. Это может замедлить вашу страницу. Особенно при использовании нескольких социальных сетей. В общем, я бы порекомендовал способ выше.
Рекомендация 2:
Если вы собираетесь использовать несколько социальных $socialNetwork
loginWith
, вы можете легко добавить параметр с именем $socialNetwork
в loginWith
и метод loginCallback
и добавить оператор switch внутри.
Быстрый тест
Если вы хотите выполнить быстрый тест для проверки кода, клонируйте репозиторий Github на локальный компьютер и переключитесь на ветку с именем part2
. Введите данные своего API Google+ в файле testGoogle.php
и запустите файл из своего браузера. При запросе страницы вы будете перенаправлены на страницу Google с просьбой поделиться информацией.
Когда вы нажмете «Принять», вы будете перенаправлены обратно на страницу, которую вы настроили в качестве URL обратного вызова, с указанием вашего имени и фамилии.
Вывод
В этой статье мы взяли основу, которую мы заложили в предыдущей статье, и продолжили работу над этим. Мы реализовали способ входа в Google+ и убедились, что вернули объект, который нормализует данные, которые вы получили от Google. В следующей статье мы рассмотрим, как мы можем объединять учетные записи, когда люди используют несколько входов в систему. В последующих статьях мы рассмотрим, как мы добавляем больше социальных сетей в нашу систему.